继承
一、理论
继承的说明:
子承父业:------继承关系 //父亲有啥,儿子有啥
Java当中继承:父亲有多少,n个儿子就有多少。更类似于师徒关系。
在创建对象时一般不创建父类对象,因为,没有意义。
二、继承的格式
class 父类名称 {
}
class 子类名称 extends 父类名称{
}
继承是为了解决“共性抽取”
代码示例
//父类
public class FuLei {
String name = "王健林";
int age = 60;
}
//子类
public class ZiLei extends FuLei {
String namezi = "王思聪";
int agezi = 20;
}
//测试类
public class Test {
public static void main(String[] args) {
ZiLei zi = new ZiLei();
System.out.println(zi.name);
System.out.println(zi.age);
System.out.println(zi.namezi);
System.out.println(zi.agezi);
}
}
//子类可以调用父类person中的内容
三、继承当中的成员变量
相同的成员变量:
在输出时,先找自己,自己没有再找父类(就近原则)
如果都有,想要直接找子类中的 用this.变量名称
想要直接找父类中的 用super.变量名称
代码示例:
//父类
public class FuLei {
String name = "王健林";
int age = 60;
}
//子类
public class ZiLei extends FuLei {
String name = "王思聪";
int age = 20;
public void text(){
System.out.println(super.name);
System.out.println(super.age);
System.out.println(this.name);
System.out.println(this.age);
}
}
//测试类
public class Test {
public static void main(String[] args) {
ZiLei zi = new ZiLei();
zi.text();
}
}
四、继承当中的成员方法
父类和子类存在不同的方法:
根据调用的先后,依次使用
父类和子类存在相同的方法:
就近原则,子类有优先使用子类的方法
代码示例:
//父类
public class FuLei {
String name = "王健林";
int age = 60;
public void method(){
System.out.println("父类方法");
}
public void method01(){
System.out.println("父类中不同的方法");
}
//子类
public class ZiLei extends FuLei {
String name = "王思聪";
int age = 20;
public void method(){
System.out.println("子类方法");
}
public void text(){
System.out.println(super.name);
System.out.println(super.age);
System.out.println(this.name);
System.out.println(this.age);
}
}
//测试类
public class Test {
public static void main(String[] args) {
ZiLei zi = new ZiLei();
zi.method01();
zi.text();
zi.method();
}
}
五、方法重写
方法重载和方法重写的对比:
方法重载(同一个类,同名方法,参数不同。区别是同一个类)
方法重写(父子关系,相同方法。区别是两个类)
重写的应用场景:
在继承关系中,如果父类的方法无法满足现有子类的需求时,可以使用方法重写。
在方法重写时,子类可以通过super.方法名 调用父类的方法来补充所需内容
在子类方法中使用 @Override验证方法重写是否成功,报错则代表失败
代码示例:
public class Phone {
public void eat(){
System.out.println("显示号码");
}
}
public class NewPhone extends Phone{
@Override
public void eat(){
super.eat();
System.out.println("显示头像");
System.out.println("显示名称");
System.out.println("显示归属地");
}
}
public class Test {
public static void main(String[] args) {
Phone old = new Phone();
old.eat();
System.out.println("----------");
NewPhone xin = new NewPhone();
xin.eat();
}
}
方法重写注意事项(访问权限修饰符):
使用public修饰在任何地方都可以使用
使用private修饰只能在同一个类中使用
使用默认修饰,只能在同一个包中使用
使用protected修饰 ,在不同包时只能在子类中使用
常用 public主要修饰类、成员方法、构造方法
pricate主要修饰成员变量
方法重写注意事项:
父类私有方法不能进行方法重写
一大一小 (父类的重写方法的权限修饰符>=父类方法的权限修饰符 子类重写方法的返回值类型 <= 父类方法的返回值类型)
六、继承当中的构造方法
就是一个赋值的过程
在有参方法创建子类对象的时候,优先执行父类构造方法,目的是为了给父类 的成员变量赋值,因为子类可能会使用到父类的成员变量。
在无参方法创建子类对象的时候,默认会生成一个super() ,使其优先执行父类构造方法。
所有的类默认的父类是object
构造方法的内部调用
this() 这种写法只能写在构造方法的第一行,表示调用自己的无参数构造方法
this(参数) 这种写法只能写在构造方法的第一行有效语句,表示调用自己的有参数构造方法
super() 这种写法只能写在构造方法的第一行有效语句,表示调用父类的无参数构造方法
super(参数) 这种写法只能写在构造方法的第一行有效语句,表示调用父类的有参数构造方法
注意:父类构造方法在创建子类对象的时候,是一定会调用的,并且是先父类后子类
this关键字: 当前类的对象引用,在内存图中,指的是自己的空间
super关键字:当前类的父类引用,在内存图中,指的是父类的空间
调用成员变量
this.变量名称
super.变量名称
七、继承的特点
单一继承,多层继承
好处:
提高代码的复用性
缺点:
耦合性强。(依赖关系紧密,子类的操作必须依赖父类)