☰
抽象类不能 new,那它的构造方法给谁用?——Java 抽象类学习笔记
2026/10/16 3:15:26 网站建设 项目流程

Java学习记录

日期:10.14

抽象类不能 new,那它的构造方法给谁用?

疑问:抽象类不能实例化(不能 new 创建对象),为什么还可以写构造方法?

答案:抽象类的构造方法是给子类的 super() 调用的,用来初始化子类对象中
属于父类的那部分成员变量。真正创建对象的是 new 关键字,构造方法只负责初始化。

(下面有代码)

📖今日知识点 ——抽象类和抽象方法

1、由来:

多态让父类方法体成为多余,于是有了抽象方法;抽象方法又要求类必须是抽象类。

2、抽象类和抽象方法
抽象方法:

将共性的行为(方法)抽取到父类之后。因为每一个子类的方法体是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

抽象类:

如果一个类中存在抽象方法,那么该类就必须声明为抽象类

3、抽象类和抽象方法的定义格式:
抽象方法 public abstract 返回值类型 方法名(参数列表); 抽象类 public abstract class 类名{...}

💻练习代码

packagecom.itheima.test4;publicabstractclassAnimal{/* Animal类(抽象类): 属性:名字,颜色 行为:eat()抽象方法,喝水 *///属性:名字,颜色privateStringname;// 名字privateStringcolor;// 颜色//无参构造方法publicAnimal(){}//有参构造方法publicAnimal(Stringname,Stringcolor){this.name=name;this.color=color;}//set/get方法publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetColor(){returncolor;}publicvoidsetColor(Stringcolor){this.color=color;}//行为:eat()抽象方法,选中eat,alt+enter//好处1:让父类不再纠结方法体到底在写什么//好处2:强制子类必须重写抽象方法,否则报错publicabstractvoideat();//行为:喝水publicvoiddrink(){System.out.println("喝水");}}
packagecom.itheima.test4;publicclassCatextendsAnimal{//无参和有参构造方法publicCat(){}publicCat(Stringname,Stringcolor){super(name,color);}@Overridepublicvoideat(){System.out.println("猫吃鱼");}//猫抓老鼠publicvoidcatchMouse(){System.out.println("猫抓老鼠");}}
packagecom.itheima.test4;publicclassDogextendsAnimal{publicDog(){}publicDog(Stringname,Stringcolor){super(name,color);}@Overridepublicvoideat(){System.out.println("狗吃骨头");}publicvoidwatchHome(){System.out.println("狗看家");}}
packagecom.itheima.test4;publicclassTest{publicstaticvoidmain(String[]args){/* Animal类(抽象类): 属性:名字,颜色 行为:eat()抽象方法,喝水 猫类: 行为:猫吃鱼,猫抓老鼠 狗类: 行为:狗吃骨头,狗看家 *///创建猫类对象Catc=newCat("小花","白色");c.eat();c.catchMouse();c.drink();System.out.println("一只名叫"+c.getName()+" 、颜色为"+c.getColor()+"的猫");//创建狗类对象Dogd=newDog("小黑","黑色");d.eat();d.watchHome();d.drink();System.out.println("一只名叫"+d.getName()+" 、颜色为"+d.getColor()+"的狗");}}

📖今日知识点 ——抽象类和抽象方法的注意事项

注意点:

1.抽象类不能实例化(不能创建它的对象)

如果可以创建抽象类的对象的话,用对象调用一个没有方法体的抽象方法,没有任何意义。

2.抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

抽象类中不一定有抽象方法:作用:(为了不让外界创建本类的对象)
比如有Fu抽象类,子类要继承父类的话就要重写抽象类中的所有抽象方法,可是有些用不到。此时就可以创建一个中间类继承Fu,对所有的抽象方法进行空实现,就是方法体里空着不写。子类再继承中间类,想要用哪方法就重写哪个方法。

3.抽象类中可以有构造方法

构造方法的作用(为了给成员变量赋值):是创建对象的吗?❌️,
创建对象用new关键字:
Student s = new Student();
1、加载字节码文件
2、在栈里面声明局部变量s
3、在堆里面开辟一个小空间(对象)name,age
4、默认初始化
5、显示初始化
6、构造方法初始化
7、赋地址值

4.抽象类的子类,要么重写抽象类中的所有抽象方法,要么子类也是抽象类

要么子类也是抽象类:意义不大,还要写一个孙子类继承子类,,并且重写所有的抽象方法。外界才可以创建子类的对象,调用里边的方法。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询