继承
继承
何为继承
继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
继承是指在原有类的基础上,进行功能扩展,创建新的类型。
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
- JAVA中类只有单继承,没有多继承!
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
- 子类和父类之间,从意义上讲应该具有"is a"的关系。
- extends的意思是“扩展”,子类是父类的扩展。
继承的格式:
- 格式: public class 子类名 extends 父类名{}
- 例如: public class Zi extends Fu {}
- Fu:是父类,也被称为基类、超类
- Zi: 是子类,也被称为派生类
继承的优点和缺点
优点
- 实现了数据和方法的共享
- 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
- 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
- 提高了代码的可扩展性
缺点
- 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟看变化,削弱了子类的独立性
Object类
Object类是Javajava.lang包下的核心类,Object类是所有类的父类,何一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类;
class Person { }
class Person extends Object { }
方法重写
方法重写概述:子类中出现了和父类中一模一样的方法声明
方法重写的应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
@Override
是一个注解可以帮助我们检查重写方法的方法声明的正确性
例如:定义一个手机类Phone
public class Phone {
public void call(String name) {
System.out.println("给" + name + "打电话");
}
}
定义一个新手机类NewPhone
public class NewPhone extends Phone {
public void call(String name) {
System.out.println("开启视频功能");
// System.out.println("给" + name + "打电话");
super.call(name);
}
}
测试:PersonTest
public class PersonTest {
public static void main(String[] args) {
Phone p = new Phone();
p.call("张三");
System.out.println("--------");
NewPhone np = new NewPhone();
np.call("张三");
}
}
super关键字
super:代表父类存储空间的标识(可以理解为父类对象引用)
定义一个父类Fu
public class Fu {
public int age = 10;
}
定义一个子类Zi
public class Zi extends Fu {
public int age = 20;
public void show() {
int age = 30;
System.out.println(age); // 30
// 访问本类中的成员变量age
System.out.println(this.age);
// 访问Fu类中的成员变量age
System.out.println(super.age);
}
}
测试:Test
public calss Test {
public static void main (String[] args){
Zi z=new Zi();
z.show();
}
}
final关键字
当final关键字修饰一个类,则该类会成为最终类,即该类不能被继承(俗称“断子绝孙类”),但是该类可以有父类。
//类名为Fu的类被final关键字修饰,代表其不能被继承
final class Fu {
}
//现在类名为Zi的类想继承Fu这个类,编译器会报错
class Zi extends Fu {
}
当我们在定义被final修饰的成员变量时,该成员变量必须在其所在类对象创建之前被初始化,这种初始化有三种方法:
第一种,给其直接初始化(赋值):
第二种,在构造代码块中将其初始化(赋值):
构造代码块会在类对象的构造方法之前执行(即创建对象之前执行)
第三种,在成员变量所在类的构造方法中将其初始化(赋值):
(2) final修饰局部变量:该变量必须在使用之前赋值,且只能被赋值一次!
解释:final修饰局部变量,在定义时该变量可以不被直接初始化,但是在使用该变量之前,该变量必须完成初始化,否则报错!

浙公网安备 33010602011771号