暂无权限

加入尚新途,才有权限看这些视频哦!

点击前往
×
问答
落辰
1楼

图片.png

图片.png

老师,我在测试抽象方法是否能被实现的时候,idea自动给我补全了一点代码,然后我加入了输出语句。这个抽象方法不是被实现了吗?为什么说抽象类无法被实现呢?

我为了探究该对象是谁的实例,我在Mouse的构造方法里加入了打印初始化对象的信息。结果显示,这个对象是AbstractTest的实例。但是我明明没有用AbstractTest继承Mouse啊。我就想是否是编译器自动认为AbstractTest是Mouse的子类,然后我在AbstracteTest类加上extends Mouse,结果提示我必须实现shot方法,可是我不是已经实现了吗?而且为什么说抽象方法必须被子类实现呢?AbstrcteTest类也不是Mouse的子类啊

尚新途

代码不完整,重写发一下

风止意难平
2楼

12.png

这两处怎么会出错呢?


尚新途

把这个代码给我吧,放在红线上异常信息是什么呢

尚新途
ChouXiang {
    ()()() {
        System..println()}
}
Dog ChouXiang{


    () {

    }

    () {

    }
}
Cat ChouXiang{

    () {

    }

    () {

    }
}


尚新途

image.png

乱码了

尚新途
public abstract class ChouXiang {
    int age;

    public abstract void run();

    public abstract void rest();

    public void shout() {
        System.out.println("ChouXiang.shout");
//        ChouXiang a = new ChouXiang();
    }
}
class Do extends ChouXiang{


    @Override
    public void run() {

    }

    @Override
    public void rest() {

    }
}
class Ca extends ChouXiang{

    @Override
    public void run() {

    }

    @Override
    public void rest() {

    }


尚新途
public abstract class ChouXiang {
    int age;

    public abstract void run();

    public abstract void rest();

    public void shout() {
        System.out.println("ChouXiang.shout");
//        ChouXiang a = new ChouXiang();
    }
}
class Dog extends ChouXiang{


    @Override
    public void run() {

    }

    @Override
    public void rest() {

    }
}
class Cat extends ChouXiang{

    @Override
    public void run() {

    }

    @Override
    public void rest() {

    }


尚新途

将那个Dog和Cat换成其他的就行了


尚新途

image.png

尚新途

明白了,在不同的包中就可以了

尚新途

对的

哩安
3楼
多态中为什么同一个对象不能被强行转换类型两次


尚新途

什么意思,强行转换两次那为什么不一次转成最终类型

可乐先生
4楼

图片.png

老师您好,我现在new的是dog对象,并不是抽象类animal,为什么也会报错呢

尚新途

你是不是写成内部类了

我爱学习
5楼
package com.bjsxt.test4;

abstract public class dxh {
   private int id;
   abstract public void study();
    abstract public void aa();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

   public dxh(int id) {
        this.id = id;
    }

    public dxh() {
    }

}
class dx extends dxh{
    @Override
    public void study() {
System.out.println("好好学习,天天向上!");
    }

    @Override
    public void aa() {
System.out.println("真棒!");
    }
}
class test{
    public static void main(String[] args){
        dxh d=new dx();
        d.study();
        d.aa();
        d.setId(1991);
         d.getId();
    }
}

image.png

老师,1991怎样打印出来?

还有有参构造函数在这有意义吗?

尚新途

image.png

image.png

image.png

有啊,你就是在用有参构造set赋值啊。


西秋
6楼

老师我想问下 假如抽象类里定义了普通成员方法,然后抽象类不能创建对象,子类是不是就不能调用这个普通成员方法呀

尚新途

抽象类天生就是被别人继承的,他在规定这个游戏规则,只有继承了这个抽象类,有了这个游戏规则,才能调用方法。

 Naturally Science
7楼

老师你好,Animal a=new Dog();a.shout();老师如果Animal是个抽象类,Dog类继承他,shout是个抽象方法的话那么a.shout调用时就可以得到结果,但是如果Animal不是抽象类,如果shout方法在父类中不存在话那么a.shout就用不不了这是为什么啊?我疑惑为什么通过抽象类可以调用到Dog中对他抽象方法的实现,这不应该是已经将new Dog()向上转化了吗

尚新途

如果硬要用父类的对象调子类的方法,可以:((子类)变量名).子类非继承方法

调都有的方法,编译时是调的父类的方法,只有在运行时,才会发现这个方法被子类重写了,然后走子类的方法

在调子类独有的方法,它因为是父类的对象指向子类的,所以它编译时只会去父类里找这个方法,找不到就报红了

若在编译时就要用父类的变量名调子类的方法,则需要将父类变量先强转为子类对象,然后来调

Luhuan
8楼

如果类中包含了抽象方法,则这个类只能被定义为抽象类,这句话反过来成立吗?就是抽象类一定要包含抽象方法吗?如果不需要,为什么?

尚新途

抽象类里可以有普通方法。抽象类只能被作为基类(父类),所以可以有普通方法,只不过普通方法和抽象方法是通过子类去具体实现的。

只想安静的生活
9楼

抽象类的使用要点:

1: 抽象类不能实例化,即不能用 new 来实例化抽象类。 


2: 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来 new 实例, 只能用来被子类调用。

 

问题1:抽象类为什么不能new?   对象实例化时, jvm分配内存 ,既然抽象类可以包含属性,有属性 jvm就会分配内存啊,分配了内存,存在哪里?堆?如果是堆 ,堆里面不都是new出来的对象么


问题2:抽象类有构造方法,但是又不能new,那构造器有什么用?用来调用父类的属性?那么又回到第一个问题了,有属性就会分配内存,那为什么不能new?


尚新途

1、抽象类只在分配了在栈中的引用,没有分配堆中的内存。

2、对,是为了继承了他的类可以调用这个抽象类,有属性,是在栈中去分配空间的,new 之后才是在堆中开辟空间的。

偶尔好心
10楼

图片.png


这里加有参无参构造干嘛  是干嘛用的  不加有影响吗

尚新途

有了有参构造后,无参构造就必须要加。没有无参构造系统默认的会给你一个无参构造,写了有参构造后,无参构造想要用就必须要有。

A
11楼

老师,这个问题怎么解决,百度查了,有个办法说是找maven但没找到在哪image.png

尚新途

image.png

just do it
12楼

image.png

这样是提示没有构造方法(子类继承抽象类,没有写无参构造方法),但是如果没有这个有参构造方法,子类继承该抽象类时,不写无参构造方法就不会报错,这是为什么。

image.png

image.png

尚新途

image.png

写了一个内部类?

尚新途

嗯,就是有点奇怪


尚新途


image.png

image.png


我写了一下没有问题啊,你那里写上构造方法,错误信息是什么呢

任仕诚
13楼
public abstract class Student { //抽象类
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    //构造方法
    public Student(String name) {
        this.name = name;
    }

    //抽象方法
    abstract public void study();
    abstract public void exam();
}

class abc {
    public static void main(String[] args) {

        Student a = new Student("sasa") {
            @Override
            public void study() {
                System.out.println("11111");
            }

            @Override
            public void exam() {
                System.out.println("sssssss");

            }
        };
        a.study();
        a.exam();
    }
}

老师这样也可以呀,a是表示新建了一个重写抽象方法的Student()么?可以帮忙解释一下不

尚新途

你这样写就已经创建了匿名内部类了,后面会学到的。

95827
14楼

抽象.png

抽象1.png

你好,老师,如上图所示,我这边没有在抽象类里面加无参构造器,系统没有报错,是不是IDEA里面给抽象类里面默认加了构造器了

以下是原码

package com.luzhongxu.abstractClass;

public abstract class Students {
    private String name;
    abstract public void study();
    abstract public void exam();
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
  //  Students(){ }  无参构造器
}




package com.luzhongxu.abstractClass;

public class Test {
    public static void main(String[] args) {
       // Students a = new Students("MMM");  抽象类不能创建对象
        Students s = new goodStudents();
        s.exam();
        s.study();

    }
}
class goodStudents extends Students{

    @Override
    public void study() {
        System.out.println("好好学习,好好听课");
    }

    @Override
    public void exam() {
        System.out.println("好好考试");
    }
}


尚新途

抽象类里可以有构造方法,无参构造会默认加入的在没有有参构造的情况下。

神经蛙
15楼

抽象类的构造方法不能用来 new 实例,只能用来被子类调用。能否用代码演示一下。

尚新途

图片.png

图片.png

图片.png

图片.png

尚新途

只能用来被子类调用怎么如何体现?

尚新途

抽象类自己不能new对象,那就不是只能通过子类去调用了吗。

尚新途

该怎么调用呢?

尚新途

抽象类里有方法或者抽象方法,你写一个子类继承这个抽象类,完后去把这个子类的对象new出来,就可以调这些方法了。如图:

图片.png

图片.png

尚新途

您说的这个明白了,我是看到资料里的这句话,想知道抽象类的构造方法怎么被子类调用呢?

20200722235538.png

尚新途

我第一次发的图回答的不是这个问题吗?

抽象类不能new,子类继承抽象类,子类new对象的时候,父类的构造方法也会执行。执行那不就是调用了,

尚新途

我以为这句话的意思是:

public class Student extends Person{
   Person(); 

}


尚新途

不是不是,按我第一次给你讲的那个理解

自我检测(5S)