Java基础复习——DAY4 (继承)

本文介绍了Java面向对象编程中的继承概念,包括格式、利弊、变量和构造方法的访问特性,以及成员方法的访问规则。重点讲解了方法重写的应用和注意事项,通过实例演示了如何在子类中重写父类方法。涉及的实例包括Person和Teacher类,以及猫狗类的继承关系。
摘要由CSDN通过智能技术生成

1.继承

1.1概念和格式

概述:继承是面向对象三大特征之一。可以使子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。

格式:

public class 子类名 extends 父类名{..} 

1.2继承的利弊

  • 提高复用性(多个类相同的成员可以放到同一个类中)和维护性(修改一处即可)
  • 类的耦合增强,削弱子类独立性
  • 什么时候能用?
    存在关系 is a的时候:苹果是水果,猫是动物,

1.3继承中变量的访问特点

  • 子类局部变量>子类成员变量>父类成员变量>没有报错就近原则?
  • super(父类的引用)
    在这里插入图片描述

1.4继承构造方法访问特点

子类中所有的构造方法的访问都会默认访问父类无参构造方法
原因:

  • 子类会继承父类的数据,可能还会用到父类的数据。所以子类初始化前会先初始化父类
  • 每一个子类的默认构造方法的第一条语句默认都是:super()

如果父类没有无参构造方法,只有带参构造方法,怎么办?

  • 子类构造方法第一句用super关键字去显示调用父类的带参构造方法
  • 父类写一个无参构造方法 (推荐)

1.5继承中成员方法的访问特点

通过子类访问一个方法和访问变量一样(就近原则)

子类成员范围找>父类成员范围>报错

1.6继承内存图

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述方法内的局部变量在栈内存中

卧槽花点时间看看

1.7方法重写(1.5既视感)

概述:

  • 子类中出现和父类中一模一样的方法声明

应用:

  • 当子类需要父类的功能,而功能主体子类有自己特有的内容,可以重写父类的方法,这样,沿袭父类的功能又定义子类的特有内容
    eg:手机类 新手机类

写代码的时候用@override然后在下面写方法重写(一个注释,检查方法重写声明的正确性)

1.8继承注意事项

方法重写:

  • 私有方法(privat)不能被重写(private 不能被继承)
  • 子类方法权限不能更低(public>默认>private)

继承:

  • java只支持单继承,不能继承多个
  • 可以支持多层继承
package teacher;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package teacher;

public class Teacher extends Person {
    public Teacher() {
    }

    public Teacher(String name, int age) {

        super(name, age);
    }

    public void teach() {
        System.out.println("用爱教育每个学生!");
    }

}

package teacher;

public class PersonDemo {
    public static void main(String[] args) {
        Teacher t1 = new Teacher();
        t1.setName("文天圣");
        t1.setAge(20);
        System.out.print(t1.getName()+","+t1.getAge()+"岁,");
        t1.teach();//文天圣,20岁,用爱教育每个学生!

        Teacher t2 = new Teacher("陈彦池",100);
        System.out.print(t2.getName()+","+t2.getAge()+"岁,");
        t2.teach();//陈彦池,100岁,用爱教育每个学生!

    }
}

小结: 上述代码,teacher继承person,但是不能继承父类private的成员变量,所以需要用父类的方法进行赋值。

猫狗案例:

package catanddog;

public class Animal {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package catanddog;

import groovyjarjarantlr4.v4.codegen.model.SrcOp;

public class Cat extends Animal {
    public Cat() {
    }

    public Cat(String name, int age) {
        super(name, age);
    }

    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

package catanddog;

public class Dog extends Animal {
    public Dog() {
    }

    public Dog(String name, int age) {
        super(name, age);
    }

    public void lookDoor() {
        System.out.println("狗看门");
    }
}

package catanddog;

public class AnimalDemo {
    public static void main(String[] args) {
        Cat c1 = new Cat();
        c1.setName("汤姆");
        c1.setAge(20);
        System.out.println(c1.getName() + "," + c1.getAge());
        c1.catchMouse();

        Cat c2 = new Cat("加菲", 30);
        System.out.println(c2.getName() + "," + c2.getAge());
        c2.catchMouse();
/*      汤姆,20
        猫抓老鼠
        加菲,30
        猫抓老鼠*/

        Dog d1 = new Dog();//同理

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值