6、继承
好处:
提高了代码的复用性
提高了代码的维护性
让类与类之间产生了关系,是多态的前提(耦合性很强)
概述:
单独的这个类被称为父类,基类或超类,这多个类可以成为子类或者派生类
格式
class Fu{
}
class Zi extends Fu {
}
class Student extends Person {
public Student() {
}
}
class Teacher extends Person{
public Teacher() {
}
}
class Person {
String name;
int age;
public Person() {
}
public void eat() {
System.out.println("吃饭");
}
}
特点
A.Java 只支持单继承,不支持多继承
B.Java中支持多层继承(继承体系)
public class ExtendDemo {
public static void main(String[] args) {
Son s =new Son();
s.method();//使用爷爷的
s.show(); //使用父亲的
}
}
class GrandFather {
public void method() {
System.out.println("我是爷爷");
}
}
class Father extends GrandFather {
public void show() {
System.out.println("我是老子");
}
}
class Son extends Father {
}
注意事项
A.子类只能继承父类所有非私有的成员(成员方法和成员变量)
但是可以在父类定义共有方法,用共有方法访问父类的私有成员变量,再调用这个公有方法
public class ExtendDemo {
public static void main(String[] args) {
Son s =new Son();
s.show();
}
}
class Father {
private int num1 = 20;
private int num2 = 10;
public void show() {
System.out.println(num1);
System.out.println(num2);
}
}
class Son extends Father {
}
B.子类不能继承父类的构造方法,但是可以通过super(关键字)去访问父类的构造方法
C.不要为了部分功能去继承
什么时候使用继承?
继承体现的是一种关系:“is a”
Person
Student
Teacher
水果
苹果
香蕉
采用假设法:如果有两个类A、B,A是B的一种,或者,B是A的一种
类的组成部分关系
类:
成员变量、成员方法、构造方法
成员变量关系:
A:子类中成员变量和父类中成员变量名称不同
B:子类中成员变量和父类中成员变量名称相同,在子类中变量查找顺序:1子类方法局部范围 2子类成员范围 3父类成员范围 4还找不到就报错.(类与类之间平级不能访问另一个类内部的内容)
就近原则。
访问局部范围num、本类成员范围num、父类成员范围num
this和 super的应用与区别
区别:
this 代表本类对应的引用
super 父类存储空间标识(父类引用)
怎么用?
1、调用成员变量:this.成员变量 、super.成员变量
2、调用构造方法:this(…) 、 super(…)
3、调用成员方法 :this.成员方法 、super.成员方法
public class ExtendDemo {
public static void main(String[] args) {
Son s = new Son();
s.show();
}
}
class Father {
public int num = 10;
}
class Son extends Father {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num); //输出本类成员num
System.out.println(super.num);//输出父类成员num
}
}
继承中构造方法关系
子类中所有的构造方法默认都会访问父类中空参数构造方法
因为子类会继承父类中数据,可能还会使用父类数据。所以,子类初始化之前一定要完成父类数据的初始化
注意:
子类构造方法第一条语句 默认 super();super()写不写都存在。
注意事项:如果父类没有无参构造方法,子类构造方法报错。
面试题
看程序写结果
一、
二、
类的加载: 静态代码块父 、静态代码块子
构造: 构造代码块父、构造方法父、构造代码块子、构造方法子
三、
main方法–>new Z 继承X 走X------走父亲(一个类)初始化,先走成员变量初始化—走new Y-----classY ------打印Y------class X成员变量初始化完毕-----走构造方法 X()-----打印X-----同理父类结束进入子类
结果: Y—X ----Y----Z
继承中成员方法关系
子类中方法和父类中声明不一样
子类中方法和父类中声明一样
子类对象调用方法:
先找子类中有没有这个方法,有就使用
再看父类中有没有这个方法,有就使用
没有就报错
方法重写的应用
方法重写:子类中出现了和父类中方法声明一摸一样的方法
沿袭了父类的功能,又定义了子类特有的内容
方法重载: 本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关
子类对象调用方法时:
先找子类本身,再找父类
public class PhoneDemo {
public static void main(String[] args) {
NewPhone np = new NewPhone();
np.call("林青霞");
}
}
class Phone{
public void call(String name) {
System.out.println("给"+name+"打电话");
}
}
class NewPhone extends Phone{
public void call(String name) {
//System.out.println("给"+name+"打电话");
super.call(name);
System.out.println("可以听天气预报");
}
}
注意事项:
父类私有方法不能被重写 ,因为父类私有方法子类根本无法继承
子类重写父类方法时,访问权限不能更低。最好一致
面试题
1 、Override:方法重写 、Overload:方法重载 的区别?方法重载能改变返回值类型吗?
Override:在子类,出现和父类中一模一样的方法声明现象
Overload:同一类中出现的方法名相同,参数列表不同的现象
方法重载能改变返回值类型,因为他和返回值类型无关。
2、this 关键字 和 super 关键字分别代表什么?以及他们各自的使用场景和作用
this:代表当前类的对象引用
super:代表父类存储空间的标识(可以理解为父类的引用,通过这个东西可以访问父类的成员)
场景:
成员变量:
this.成员变量
super.成员变量
构造方法 :
this.(…)
super(…)
成员方法:
this.成员方法
super.成员方法