一、类的继承
1、继承的概念
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种书屋之间形成一种关系体系。例如猫和狗都属于动物,程序中便描述为猫和狗继承自动物,同理波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗都继承自狗,这些动物之间会形成一个体系。
在 Java 中,类的继承是指在一个仙有泪的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称为父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用 extends 关键字。
//定义 Animal 类
class Animal{
String name;
void shout(){
System.out.println("动物发出叫声");
}
}
//定义 Dog 类继承 Ainmal 类
class Dog extends Animal{
public void printName(){
System.out.println("name=" + name);
}
}
class ExtendsDemo1{
public static void main(String[] args){
Dog dog = new Dog();
dog.name = "沙皮狗";
dog.printName();
dog.shout();
}
}
运行结果如下:
继承的特点:
- 类只支持但继承,不允许多重继承,也就是说一个类只能有一个直接父类;
//这种情况是不合法的!
class A{}
class B{}
class C extends A,B{}
- 多个类可以继承一个父类;
//这种情况是允许的!
class A{}
class B extends A{}
class C extends A{}
- 多层继承是可以的,即一个类的父类可以再去继承另外的父类;
//这种情况是允许的!
class A{}
class B extends A{}
class C extends B{}
- 子类和父类是一种相对概念,也就是说一个类时某个类父类的同时,也可以是另一个类的子类。
继承的作用:
- 继承的出现提高了代码的复用性;
- 让类与类之间产生了关系,提供了多态的前提。
定义继承需要注意:
- 不要仅为了获取其他类中的某个功能而去继承;
- 类与类之间要有所属关系,xx1 是 xx2 的一种。
2、重写父类方法
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。需要注意的是,在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
//定义 Animal 类
class Animal{
void shout(){
System.out.println("动物发出叫声");
}
}
//定义 Dog 类继承 Ainmal 类
class Dog extends Animal{
void shout(){
System.out.println("汪汪······");
}
}
//定义测试类
class ExtendsDemo1{
public static void main(String[] args){
Dog dog = new Dog();
dog.shout();
}
}
运行结果如下:
注意:子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限,如父类中的方法是 public 的,子类的方法就不能是 private 的。
3、super 关键字
当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在 Java 中专门提供了一个 super 关键字用于访问父类的成员,例如访问父类的成员变量、成员方法和构造方法。
super 关键字的具体用法:
- 使用 super 关键字调用父类的成员变量和成员方法;
> super . 成员变量
> super . 成员方法([参数1,参数2···])
class Animal{
String name = "动物";
void shout(){
System.out.println("动物发出叫声...");
}
}
class Dog extends Animal{
String name = "犬类";
void shout(){
super.shout();
}
void printName(){
System.out.println("name="+super.name);
}
}
public class Example{
public void main(String[] args){
Dog dog = new Dog();
dog.shout();
dog.printNmae();
}
}
- 使用 super 关键字调用父类的构造方法;
> super([参数1,参数2...])
class Animal{
public Animal(String name){
System.out.println("我是一只"+name);
}
}
class Dog extends Animal{
public Dog(){
super("沙皮狗");
}
}
public class Example{
public void main(String[] args){
Dog dog = new Dog();
}
}
需要注意的是:
- 通过 super 调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次;
- 子类中所有的构造函数默认都会访问父类中空参数的构造函数,因为每一个构造函数的第一行都有一句默认的 super();
- 当父类中没有空参数的构造函数时,子类的构造函数必须通过 this 或 super 语句指定要访问的构造函数。
二、final 关键字
final 关键字可用于修饰类、变量和方法,它有 " 这是无法改变的 " 和 " 最终 " 的含义,因此被 final 修饰的类、变量和方法将具有以下特性:
- final 修饰的类是不能继承的;
- final 修饰的方法不能被子类重写;
- final 修饰的变量(成员变量和局部变量)是常量,只能赋值一次。
1、final 关键字修饰类
Java 中的类被 final 关键字修饰后,该类将不可以被继承,也就是不能派生子类。
//使用 final 修饰Animal类
final class Animal{}
//Dog继承Animal类
class Dog extends Animal{}
//测试类
public class Example{
public void main(String[] args){
Dog dog = new Dog();
}
}
编译程序报错:
2、final 关键字修饰方法
当一个类的方法被 final 关键字修饰后,这个类的子类将不能重写该方法。
//定义Animal类
class Animal{
//使用final修饰