继承

继承

何为继承

继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
继承是指在原有类的基础上,进行功能扩展,创建新的类型。

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • 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修饰的成员变量时,该成员变量必须在其所在类对象创建之前被初始化,这种初始化有三种方法:

第一种,给其直接初始化(赋值):

fina1

第二种,在构造代码块中将其初始化(赋值):

final2

构造代码块会在类对象的构造方法之前执行(即创建对象之前执行)

第三种,在成员变量所在类的构造方法中将其初始化(赋值):

final3

(2) final修饰局部变量:该变量必须在使用之前赋值,且只能被赋值一次!

final3(2)

解释:final修饰局部变量,在定义时该变量可以不被直接初始化,但是在使用该变量之前,该变量必须完成初始化,否则报错!

final3(3)

posted @ 2024-08-02 20:44  坤坤真爱粉  阅读(31)  评论(0)    收藏  举报