这篇专栏的笔记是面向对象三大特性之一:继承
继承是父类和子类之间的关系。其中,父类又叫基类,子类又叫派生类。
特点:Java中的继承是单继承,即每个类只能有一个父类。
作用:1.子类拥有父类非私有的成员变量和方法。
2.实现代码复用。
1、单继承
1.注意extends中的"s"。
2.创建子类对象时,会先执行父类的构造方法,再执行子类的构造方法。
//Animal.java
public class Animal {
public Animal(){
System.out.println("Animal(父类)构造方法");
}
String id = "动物";
}
//注意extends中的"s"
class Cat extends Animal{
public Cat(){
System.out.println("Cat(子类)构造方法");
}
String id = "猫";
}
//Init.java
public class Init {
public static void main(String[] args) {
Cat c = new Cat();
System.out.println("Age:" + c.id);
}
}
/*
运行结果:
Animal(父类)构造方法
Cat(子类)构造方法
id:猫
*/
2、多重继承
1.Cat类继承了Animal类之后,Ragdoll类继承了Cat类。
2.创建Ragdoll类对象时,会按照继承顺序执行构造方法。
//Animal.java
public class Animal {
public Animal(){
System.out.println("Animal(父类)构造方法");
}
String id = "动物";
}
class Cat extends Animal{
public Cat(){
System.out.println("Cat(子类)构造方法");
}
String id = "猫";
}
class Ragdoll extends Cat{
public Ragdoll(){
System.out.println("Ragdoll(子类的子类构造方法)");
}
String id = "布偶猫";
}
//Init.java
public class Init {
public static void main(String[] args) {
Ragdoll c = new Ragdoll();
System.out.println("id:" + c.id);
}
}
/*
运行结果:
Animal(父类)构造方法
Cat(子类)构造方法
Ragdoll(子类的子类构造方法)
id:布偶猫
*/
3、多个类继承同一个类
1.Cat类和Dog类继承同一个Animal类。
//多个类继承同一个类
public class Animal {
String id = "动物";
}
class Cat extends Animal{
String id = "猫";
}
class Dog extends Animal{
String id = "狗";
}
4、不支持多继承(注意!)
1.Cat类同时继承Animal类和Being类。(报错)
//Cat类同时继承Animal类和Being类。(报错)
class Animal {
String id = "动物";
}
class Being{
String id = "生物";
}
class Cat extends Animal, Being{
String id = "猫";
}
5、继承特性
1.父类中定义了私有和非私有的成员变量,子类没有定义变量。
2.子类只继承了父类非私有的成员变量。
//Animal.java
//Animal.java
public class Animal {
String id = "动物";
private int age = 3;
}
class Cat extends Animal{
}
//Init.java
public class Init {
public static void main(String[] args) {
Cat c = new Cat();
System.out.println("id:" + c.id);
//子类不继承父类私有变量
System.out.println("age:" + c.age);
}
}
6、final关键字
1.类、方法、变量都可以被final修饰。
2.被final修饰后,类不能被继承,方法不能被重写,变量不能被再次赋值。
(代码块在图5下方)
类:
图1 被final修饰的类不能被继承
方法:
图2 被final修饰的方法不能被重写
变量:
图3 被final修饰的变量不能被再次赋值
图4 被final修饰的变量没有初始化,可以在构造方法中赋值
图5 若被final修饰的变量既没有初始化,也没有在构造方法中赋值,则报错
//类不能被继承
final class Animal {
String id = "动物";
}
class Cat extends Animal{}
//方法不能被重写
class Animal {
void a(){};
final void b(){};
}
class Cat extends Animal{
void a(){};
void b(){};
}
//变量不能被再次赋值
class Animal {
int a = 3;
final int b = 5;
public Animal(){
a = 4;
b = 6;
}
}
//若被final修饰的变量没有初始化,仍可以在构造方法中赋值
class Animal {
final int b;
public Animal(){
b = 6;
}
}
//若被final修饰的变量既没有初始化,也没有在构造方法中赋值,则报错
class Animal {
final int b;
public Animal(){}
}
氷鸢鸢鸢
2020.2.4