class Person{ ... } class Student extends Person{ .. }
这是java类的继承的基本格式。(class 子类名 extends 父类名{})
概述:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类只要继承那个类即可。
好处:1.提高了代码的复用性。
2.提高了代码的维护性。
3.让类与类之间产生了关系,是多态的前提。
弊端:耦合性增强,打破了封装性。
特点:只支持单继承,不支持多继承,支持多层继承。
注意事项:1.子类只能继承父类所有非私有的成员。
2.子类不能继承父类的构造方法,可以通过super关键字去访问。
3.不要为了部分功能而去继承。
采用继承的情况:体现“is a ”的关系。如:桃子是水果。
继承中成员变量的关系:当父类与子类成员变量名称一样时。
在子类中访问一个变量的查找顺序:
子类方法的局部范围——子类成员——父类成员——找不到报错
this和super的 使用
定义:
this:代表本类对应的引用
super:代表父类存储空间的标识(父类引用)
使用:
1.调用成员变量
this.成员变量(成员方法) 调用本类的成员变量(成员方法)
super.成员变量(成员方法) 调用父类的成员变量(成员方法)
2.调用构造方法
this(...)调用本类的构造方法
super(...)调用父类的构造方法
继承中构造方法的关系:
1.子类中所有构造方法都默认访问父类中的无参构造方法
原因:因为子类会继承父类中的数据,可能还会使用父类的数据。
注意:每个子类默认的每一个构造方法的第一条语句都是super();
2.子父类的初始化:(分层初始化)先初始化父类数据,再初始化化子类数据。
方法重写:
class Phone{ public void call(String name) { System.out.printIn("call"+name); } } public NewPhone:Phone{ public void call(String name) { super.call(name); System.out.printIn("可以听音乐了“); } } class Test{ public static void main(String []args){ NewPhone n=new NewPhone(); n.call("yyy"); } }
运行结果:call yyy
可以听音乐了
注意事项:1.父类中的私有方法不能被重写
2.子类重写父类方法时,访问权限不能更低。
子类重写父类方法时最好一模一样。
案例:
class Person{ private String name; private int age; public Person(String n,int a){ name=n; age=a; } public String getName(){ return name; } public void setName(String s){ name=s; } public int getAge(){ return age; } public void setAge(int a){ age=a; } } class Student extends Person{ public Student(){} public Student(String name,int age){ super(name,age); } } class Teacher extends Person{ ... } class Test{ public static void main(String []args){ Student s1=new Student(); s1.setName("yyy"); s1.setAge(20); System.out.println(s1.getName+s1.getAge); } }