Java学习笔记——面向对象之继承

目录

一、继承的概念

二、语法

三、继承类型

四、继承的特性

(一)继承的优缺点

(二)继承的特点

(三)继承的成员变量访问特点

五、继承关键字

(一)extends

(二)implements

(三)super 和 this

(四)final

六、构造器


一、继承的概念

继承是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。

二、语法

通过extends关键字可实现继承:

class 父类 {
}
 
class 子类 extends 父类 {
}

三、继承类型

继承类型图形示例语法
单继承
多重继承
不同类继承同一个类

注: Java不支持多继承,即不支持一个子类同时继承多个父类。

四、继承的特性

(一)继承的优缺点

1、优点

  • 提高了代码的复用性
  • 提高了代码的维护性
  • 让类与类之间产生了关系,是多态的前提

2、缺点

  • 继承是侵入性的
  • 降低了代码的灵活性:继承导致子类必须拥有父类非私有属性的方法
  • 增强了代码的耦合性:代码与代码之间存在关联可称为“耦合”

(二)继承的特点

  • 子类拥有父类非私有的属性和方法;
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展;
  • 子类可以用自己的方式实现父类的方法;
  • Java不支持多继承;

(三)继承的成员变量访问特点

五、继承关键字

继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。

(一)extends

在Java中,一个子类只能继承一个父类,extends只能继承一个父类。

代码实例

public class Animal{}
public class Cat extends Animal{}

(二)implements

使用 implements 关键字可以变相的使Java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

代码实例

public interface A{}
public interface B{}
public class C implements A, B{}

(三)super 和 this

  • super:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
  • this:指向自己的引用

代码实例

class Animal{
    public void eat(){
        System.out.println("Animal: eat");
    }
    public void sleep(){
        System.out.println("Animal: sleep");
    }
}

class Cat extends Animal{
    public void eat(){
        System.out.println("Dog: eat");
    }

    public void eatTest(){
        this.eat();  // 调用自己的eat()方法
        super.eat();  // 调用父类的eat()方法
    }
}
public class Day16 {
    public static void main(String[] args){
            Animal a = new Animal();
            a.eat();
            Cat c = new Cat();
            c.eatTest();
    }
}

输出结果

(四)final

  • final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
  • final 含义为 "最终的"。
  • 使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写。 

当我们把父类Animal中的sleep()方法改为final时,此时子类Cat是无法继承该方法的。 

六、构造器

  • 子类不继承父类的构造器(构造方法或构造函数)
  • 若父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
  • 若父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

代码实例

// 父类Animal
class Animal{
    private int n;
    Animal(){
        System.out.println("SuperClass: Animal()");
    }
    Animal(int n){
        System.out.println("SuperClass: Animal(int n)");
        this.n = n;
    }
}

// 子类Cat
class Cat extends Animal{
    private int n;
    Cat(){ // 自动调用父类的无参数构造器
        System.out.println("SubClass: Cat()");
    }
    public Cat(int n){ // 调用父类中带有参数的构造器
        super(10);
        System.out.println("SubClass: Cat(int n)");
        this.n = n;
    }
}

// 子类Dog
class Dog extends Animal{
    private int n;
    Dog(){ // 调用父类中带有参数的构造器
        super(20);
        System.out.println("SubClass: Dog()");
    }
    public Dog(int n){ // 自动调用父类的无参数构造器
        System.out.println("Subclass: Dog(int n)" + n);
    }
}

public class Day16 {
    public static void main(String[] args){
        System.out.println("Cat子类继承");
        Cat c1 = new Cat();
        Cat c2 = new Cat(100);
        System.out.println("Dog子类继承");
        Dog d1 = new Dog();
        Dog d2 = new Dog(1000);
    }
}

输出结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值