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