

老师,我在测试抽象方法是否能被实现的时候,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{}
不是不是,按我第一次给你讲的那个理解