编程日记:Java学习之路(九)

继承

一、面向对象——继承

面向对象的三大特征:

封装——继承——多态

什么是类?什么是类的对象?

举一个简单的例子,我们人,属于人类,那么人就是一个类,小明是人类,那么小明就是人类的对象,无论是人类还是猴类都是属于动物类,那么动物类就是人类和猴类的父类 

  • 父类是从子类中把子类的共性进一步抽象的结果
  • 子类是特殊的父类
  • 继承关系:
    • 子类继承父类
    • public class SuperClass { }
      class SubClass extends SuperClass{} 

对象的创建过程(V1.0)

  • 分配空间
  • 给所有的属性附初始值
  • 调用构造方法

对象的创建过程(v2.0)

  • 分配空间
  • 递归的创建父类对象
  • 给本类所有的属性附初始值
  • 调用本类的构造方法
public class Animal { }
class Dog extends Animal{}
class Husky extends Dog{}

 父类中的属性和方法都是从子类中抽象出来的,所以父类中所有的属性和方法子类都有,子类可以继承父类中的属性和方法

构造方法 是不能继承的,私有的属性和方法可以继承但是没有访问权限

访问权限修饰符

public 所有类
protected 子类
package private 同类包
private 本类

如果希望一个类中的属性或者方法只能让子类访问,而其他类不能访问,则需要使用protected修饰符

继承的作用:

  • 提高代码的可重用性
  • 提高代码的可扩展性

单继承:

每个类只有一个直接父类,类继承图为树形结构,任意两个类之间只有一条路径,类的关系比较简单

多继承:每个类可以有多个直接父类,类继承图为图形结构,任意两个类之间有多条路径,类的关系复杂

任何一个面向对象的语言都要支持继承

Java是一个单继承的语言

定义类的继承关系时:

  • extends关键字后面只能有一个类
  • 可以多重继承

二、方法的覆盖

什么是方法的覆盖?

子类继承了父类的方法和属性,父类中的方法和属性子类中都有,父类的方法往往不能符合子类的要求,如果子类用一个特殊的方法实现,替代掉父类中一般的方法实现,就是方法的覆盖

方法覆盖时的语法要求:

  • 访问权限修饰符:
    • 子类方法的访问权限和父类方法的访问权限相比,要相同或者更宽
    • 里氏代换原则
    • 父类方法为private除外
  • 方法的三要素:
    • 方法名要相同
    • 参数表要相同
      • 如果不同则为重载
    • 返回值类型要相同
      • 可以返回父类方法返回值类型的子类
      • 里氏代换原则
  • 抛出异常:
    • 里氏代换原则

三、super关键字

父类对象是子类对象的一部分

super的作用1:

表示当前对象所属的父类对象的引用,可以访问父类对象被覆盖的属性和方法

  • super.属性  //表示访问自己所属的父类对象的属性
  • super.方法(参数)  //表示调用自己所属的父类对象的方法

使用this可以用来区分属性和局部变量

使用super可以用来区分父类对象和子类对象的属性

常见用法:

  • 当子类对象的属性和父类对象的属性重名时用来访问父类对象的属性
  • 当子类覆盖弗雷德方发师用来调用父类对象的方法

创建子类对象必先创建父类对象

作用2:

用在构造方法中,表示使用相应的构造方法创建父类对象

super(参数) //执行相应构造方法创建父类对象

  • 只能用在构造方法中
  •  根据参数表决定调用父类的哪个构造方法创建父类对象
  • 必须是构造方法中的第一行代码
  • 如果第一行既不是this(参数表),也不是super(参数表),则编译器自动添加super()

创建动物类

 1 public class Animal {
 2     private int n;
 3     Animal(){
 4         System.out.println("Animal()");
 5     }
 6     Animal(int n){
 7         System.out.println("Animal(int n)");
 8         this.n = n;
 9     }
10 }

创建狗类

 1 public class Dog extends Animal{
 2     private int n;
 3     Dog(){
 4         System.out.println("dog");
 5     }
 6 
 7     public Dog(int n){
 8         super(300);
 9         System.out.println("Dog():"+n);
10         this.n=n;
11     }
12 }

创建猫类

 1 public class Cat extends Animal{
 2     private int n;
 3 
 4     Cat(){
 5         super(300);
 6         System.out.println("Cat");
 7     }
 8 
 9     public Cat(int n){
10         System.out.println("Cat(int n)"+n);
11         this.n = n;
12     }
13 }

测试类

 1 public class Test {
 2     public static void main(String[] args){
 3         System.out.println("-----Dog 类继承-----");
 4         Dog d1 = new Dog();
 5         Dog d2 = new Dog(100);
 6         System.out.println("-----Cat 类继承-----");
 7         Cat c1 = new Cat();
 8         Cat c2 = new Cat(200);
 9     }
10 }

显示结果

-----Dog 类继承-----
Animal()
dog
Animal(int n)
Dog():100
-----Cat 类继承-----
Animal(int n)
Cat
Animal()
Cat(int n)200

 

posted @ 2021-11-29 10:31  MachineHe  阅读(44)  评论(0)    收藏  举报