JAVA复习Day8 继承 多态 重点
8.4面向对象编程三大特征(上接day7)
8.4.4继承的引入
当两个类的属性和方法有很多是相同的,就引出了继承(代码的复用性)
8.4.5继承的原理图
当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的方法和属性,这样子类就可以不用在重新定义这些属性和方法,只需要通过extends来声明继承父类即可
8.4.6继承的基本语法
class 子类 extends 父类{
} 子类就会自动拥有父类定义的属性和方法
package com;
public class student {//父类
public String name;//共有属性
public int age;//共有属性
private double score;//共有属性
public void setscore(double score) {
this.score=score;
}//共有方法
public void show(){
System.out.println("学生名:"+name+"\t年龄:"+age+"\t成绩:"+score);
}//共有方法
}
package com;
public class graduate extends student {//子类
public void test(){//方法名字一致,只不过有细小的区别
System.out.println("大学生"+name+"正在考数学");
}
}
package com;
public class pupil extends student{//子类
public void test(){
System.out.println("小学生正在考数学");
}
}
package com;
public class main {
public static void main(String[] args) {
pupil pupil = new pupil();
pupil.name="小明";
pupil.age=34;
pupil.test();
pupil.setscore(56);
pupil.show();
graduate student = new graduate();
student.name="小王";
student.age=78;
student.setscore(99);
student.test();
student.show();
}
}
8.4.7继承的细节
1、子类继承了所有的属性和方法,但是私有属性和访问不能在子类直接访问,要通过父类提供的公共的方法去访问
package com;
public class base {//父类
public int n1 = 100;
protected int n2 = 200;
int n3 = 300;
private int n4 = 400;//私有数据
public base() {//无参构造器
System.out.println("base()");
}
public int getN4(){
return n4;
}//公有类的方法,得到n4的私有数据
public void text100() {
System.out.println("text100");
}
protected void text200() {
System.out.println("text200");
}
void text300() {
System.out.println("text300");
}
private void text400() {
System.out.println("text400");
}
}
package com;
public class sub extends base {//子类
public sub() {
System.out.println("sub()");
}
public void sayok(){
System.out.println(n1+"\t"+n2+"\t"+n3+"\t");
text200();
text100();
text300();
System.out.println("n4="+getN4());//getn4就是这个公共方法
}
}
package com;
public class main {
public static void main(String[] args) {
sub sub = new sub();
sub.sayok();
}
}
正是由于私有的方法和属性在别的里面不能访问,只能在同类里面访问,所以就写一个公共的方法来获取私有数据和私有的方法
2、子类必须调用父类的构造器,完成父类的初始化
由于子类要继承父类的所以方法和属性,所以父类第一件事要做的就是调用构造器
见上图的代码和运行结果图
3、当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的那个构造器完成对父类的初始化工作,否则编译不会通过 由二可知,必须调用父类的构造器
4、如果希望指定去调用父类的某个构造器,则显示的调用,super()
5、super只能在构造器中使用,在使用时放在构造器的第一行这里可以这样理解,由于创建子类必须要提前完成对父类的初始化,所以必须要放在构造器的第一行
6、super()和this()都只能放在构造器的第一行,因此者两个方法不能共存在一个构造器
7、JAVA所有类都是object的子类
8、父类构造器的调用不限于直接父类,将一直往上追溯直到object类
9、子类最多只能继承一个父类(直接继承),即java中是单继承机制
10、不能滥用继承,子类和父类之间必须满足is-a的逻辑关系