老师,我在测试抽象方法是否能被实现的时候,idea自动给我补全了一点代码,然后我加入了输出语句。这个抽象方法不是被实现了吗?为什么说抽象类无法被实现呢?
我为了探究该对象是谁的实例,我在Mouse的构造方法里加入了打印初始化对象的信息。结果显示,这个对象是AbstractTest的实例。但是我明明没有用AbstractTest继承Mouse啊。我就想是否是编译器自动认为AbstractTest是Mouse的子类,然后我在AbstracteTest类加上extends Mouse,结果提示我必须实现shot方法,可是我不是已经实现了吗?而且为什么说抽象方法必须被子类实现呢?AbstrcteTest类也不是Mouse的子类啊
代码不完整,重写发一下
这两处怎么会出错呢?
把这个代码给我吧,放在红线上异常信息是什么呢
ChouXiang { ()()() { System..println()} } Dog ChouXiang{ () { } () { } } Cat ChouXiang{ () { } () { } }
乱码了
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换成其他的就行了
明白了,在不同的包中就可以了
对的
多态中为什么同一个对象不能被强行转换类型两次
什么意思,强行转换两次那为什么不一次转成最终类型
老师您好,我现在new的是dog对象,并不是抽象类animal,为什么也会报错呢
你是不是写成内部类了
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(); } }
老师,1991怎样打印出来?
还有有参构造函数在这有意义吗?
有啊,你就是在用有参构造set赋值啊。
老师我想问下 假如抽象类里定义了普通成员方法,然后抽象类不能创建对象,子类是不是就不能调用这个普通成员方法呀
抽象类天生就是被别人继承的,他在规定这个游戏规则,只有继承了这个抽象类,有了这个游戏规则,才能调用方法。
老师你好,Animal a=new Dog();a.shout();老师如果Animal是个抽象类,Dog类继承他,shout是个抽象方法的话那么a.shout调用时就可以得到结果,但是如果Animal不是抽象类,如果shout方法在父类中不存在话那么a.shout就用不不了这是为什么啊?我疑惑为什么通过抽象类可以调用到Dog中对他抽象方法的实现,这不应该是已经将new Dog()向上转化了吗
如果硬要用父类的对象调子类的方法,可以:((子类)变量名).子类非继承方法
调都有的方法,编译时是调的父类的方法,只有在运行时,才会发现这个方法被子类重写了,然后走子类的方法
在调子类独有的方法,它因为是父类的对象指向子类的,所以它编译时只会去父类里找这个方法,找不到就报红了
若在编译时就要用父类的变量名调子类的方法,则需要将父类变量先强转为子类对象,然后来调
如果类中包含了抽象方法,则这个类只能被定义为抽象类,这句话反过来成立吗?就是抽象类一定要包含抽象方法吗?如果不需要,为什么?
抽象类里可以有普通方法。抽象类只能被作为基类(父类),所以可以有普通方法,只不过普通方法和抽象方法是通过子类去具体实现的。
抽象类的使用要点:
1: 抽象类不能实例化,即不能用 new 来实例化抽象类。
2: 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来 new 实例, 只能用来被子类调用。
问题1:抽象类为什么不能new? 对象实例化时, jvm分配内存 ,既然抽象类可以包含属性,有属性 jvm就会分配内存啊,分配了内存,存在哪里?堆?如果是堆 ,堆里面不都是new出来的对象么
问题2:抽象类有构造方法,但是又不能new,那构造器有什么用?用来调用父类的属性?那么又回到第一个问题了,有属性就会分配内存,那为什么不能new?
1、抽象类只在分配了在栈中的引用,没有分配堆中的内存。
2、对,是为了继承了他的类可以调用这个抽象类,有属性,是在栈中去分配空间的,new 之后才是在堆中开辟空间的。
这里加有参无参构造干嘛 是干嘛用的 不加有影响吗
有了有参构造后,无参构造就必须要加。没有无参构造系统默认的会给你一个无参构造,写了有参构造后,无参构造想要用就必须要有。
老师,这个问题怎么解决,百度查了,有个办法说是找maven但没找到在哪
这样是提示没有构造方法(子类继承抽象类,没有写无参构造方法),但是如果没有这个有参构造方法,子类继承该抽象类时,不写无参构造方法就不会报错,这是为什么。
写了一个内部类?
嗯,就是有点奇怪
我写了一下没有问题啊,你那里写上构造方法,错误信息是什么呢
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()么?可以帮忙解释一下不
你这样写就已经创建了匿名内部类了,后面会学到的。
你好,老师,如上图所示,我这边没有在抽象类里面加无参构造器,系统没有报错,是不是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("好好考试"); } }
抽象类里可以有构造方法,无参构造会默认加入的在没有有参构造的情况下。
抽象类的构造方法不能用来 new 实例,只能用来被子类调用。能否用代码演示一下。
只能用来被子类调用怎么如何体现?
抽象类自己不能new对象,那就不是只能通过子类去调用了吗。
该怎么调用呢?
抽象类里有方法或者抽象方法,你写一个子类继承这个抽象类,完后去把这个子类的对象new出来,就可以调这些方法了。如图:
您说的这个明白了,我是看到资料里的这句话,想知道抽象类的构造方法怎么被子类调用呢?
我第一次发的图回答的不是这个问题吗?
抽象类不能new,子类继承抽象类,子类new对象的时候,父类的构造方法也会执行。执行那不就是调用了,
我以为这句话的意思是:
public class Student extends Person{}
不是不是,按我第一次给你讲的那个理解