继承
1、概述
-
引入:多个类的相同特征(成员变量及方法)造成代码的重复冗长,将其公共部分提取出来形成一个新类(父类)再关联到具有共同特征的类中(子类),可提高代码的复用性
-
继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义追加属性和方法
2、格式
-
//public class 子类名 extends 父类名{} public class Zi extends Fu {} /*父类也被称为基类、超类 子类也被称为派生类 */
-
示例
-
//子类 public class Zi extends Fu{ public void method(){ System.out.println("method方法被调用") } } //父类 public class Fu{ public void show(){ System.out.println("show方法被调用") } } //测试类 public class Demo{ public static void main(String[] args){ Fu f = new Fu(); f.show(); //show 方法被调用 f.method(); //报错(父类不能调用子类) Zi z = new Zi(); z.method(); //method方法被调用 z.show(); //show 方法被调用(子类能调用父类) } }
3、继承的优点及缺点
- 优点:提高代码的复用性(多个类的相同成员可以放到一个父类中);提高代码的维护性(只需修改父类即可)
- 缺点:削弱了子类的独立性(类的耦合性增强、当父类变化子类也跟着变化)
4、继承使用的条件
- 假设法:两个类满足A是B的一种或B是A的一种,包含关系可以用继承
5、this及super用法(改变默认访问规则)
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
---|---|---|---|
this(访问本类) | this.成员变量 | this(…) | this.成员方法() |
super(访问父类) | super.成员变量 | super(…) | super.成员方法() |
6、继承中变量的访问特点
-
在子类方法中访问一个变量查找顺序:子类局部(方法中)–>子类成员范围–>父类成员范围(还没有就报出<不考虑父亲的父亲>)
-
this和super修饰的成员变量
在子类方法中指定访问各位置中的变量:变量名.this(访问成员变量)、变量名.super(访问的是父类成员变量)
public class Zi extends Fu { private int age = 10; public void show(){ int age = 20; System.out.println(age); //20 System.out.println(this.age);//10 System.out.println(super.age);//30 (父类age = 30) } }
7、继承中构造方法的访问特点
- 子类中所有的构造方法默认都会访问父类中无参构造方法(子类会继承父类的数据,可能还会使用父类的数据,所以子类初始化之前一定要先完成父类数据的初始化;每个子类构造方法的第一条语句默认都是super()。)
- 如果父类中没有无参构造方法,只有带参构造方法(1、使用super去显示的调用父类的带参构造方法;2、在父类中提供无参构造方法[推荐])
8、继承中成员方法的访问特点
- 通过子类对象访问一个方法:子类成员范围–>父类成员范围–>都没有就报错(不考虑父亲的父亲)
9、super内存图(要视频请留言)
10、方法重写
-
格式:子类和父类的方法声明一样
-
作用:沿袭父类功能又能定义子类特有内容
//Phone类 public class Phone { @Override//注解:表明以下方法为重写(检查方法声明的正确性) public void call(String name){ System.out.println("给"+name+"打电话"); } } //NewPhone类 public class NewPhone extends Phone{ public void call(String name){ System.out.println("so clever"); super.call(name); } } //Demo测试类 public class Demo { public static void main(String[] args) { Phone p = new Phone(); p.call("迪丽热巴"); System.out.println("========"); NewPhone np = new NewPhone(); np.call("古力娜扎"); } } //输出效果 给迪丽热巴打电话 ======== so clever 给古力娜扎打电话
-
注意事项:
-
私有方法不能被重写(父类私有成员子类是不能继承的)
-
子类方法访问权限不能更低(public>默认>private)
//父类 public class Fu { private void show(){ System.out.println("父类中show方法"); } void method(){ System.out.println("父类中method方法"); } } //子类 public class Zi extends Fu { /* @Override//父类私有不能重写不能继承 private void show(){ System.out.println("zi类中show方法"); } @Override public void show(){ System.out.println("zi类中show方法"); @Override void show(){ System.out.println("zi类中show方法"); */ @Override//子类方法权限可以大于或等于父类权限 public void method(){ System.out.println("zi类中method方法"); } /*@Override// 默认访问权限低于public void method(){ System.out.println("zi类中method方法"); }*/ }
11、java中继承的注意事项
-
Java中只支持单继承,不支持多继承
-
Java中支持多层继承
12、包(package)
-
包就是文件夹
-
包作用是对类进行分类管理
-
包的定义格式
范例:package com.woai;
-
手动创建包:在源文件中写入包路径--------创建文件夹--------执行时带包路径执行
-
自动建包:在源文件中写入包路径
-
导包:不同包下调用其他包中类的方法时需写上:另一个包路径.路径—>导包(import 包名)
13、修饰符
-
分类:权限修饰符、状态修饰符
-
权限修饰符(private、默认、protected、public)
-
修饰符 同一个类中 同一个包中子类或无关类 不同包子类 不同包无关类 private y 默认 y y protected y y y public y y y y -
状态修饰符(final最终态、static静态)
- final修饰的方法为最终方法,不能被重写
- final修饰的成员变量是常量,不能在重新赋值
- final修饰的类为最终类不能被继承
- final修饰局部变量
- 基本类型:基本类型的数据值不能改变
- 引用变量:引用类型的地址值不能发生改变,内容可变
- static
- 其修饰的成员变量被所以对象共享了
- 可以使用对象名或类名调用,推荐使用类名。
- static访问特点
- 非静态的成员方法:能访问静态和非静态成员方法及变量
- 静态成员方法:只能访问静态的成员方法及变量