三分钟“手撕“三大特性之一的<继承>(上)

目录

一、为什么需要继承

二、什么是继承

三、继承怎么写

四、成员的访问

1.父类与子类的成员变量不同名

2.父类与子类的成员变量同名 

3.父类与子类的成员方法不同名

4.父类与子类的成员方法同名 

五、super关键字


一、为什么需要继承

先让我们看一段Java代码:

// Dog.java
public class Dog{
    string name;
    int age;
    float weight;

public void eat(){
    System.out.println(name + "正在吃饭");
}
public void sleep(){
    System.out.println(name + "正在睡觉");
}
void Bark(){
    System.out.println(name + "汪汪汪~~~");
}
}

// Cat.Java
public class Cat{
    string name;
    int age;
    float weight;

public void eat(){
    System.out.println(name + "正在吃饭");
}
    public void sleep()
{
    System.out.println(name + "正在睡觉");
}
void mew(){
    System.out.println(name + "喵喵喵~~~");
}
}

我们会发现有大量的代码是相同的。比如:名字年龄体重啊,吃饭睡觉啊。所以我们思考,有没有一种更加简便的写法,把大家都有的东西抽取出来,可以实现代码的复用(就是大家都可以用)减少了程序员的工作量。  

有,那就是继承

二、什么是继承

把公共的东西抽取出来,让对象去获得公共的东西(名字年龄吃饭等等)就叫做继承。对于抽取出来的东西做成一个类,我们叫做父类,对于自己额外有的东西(比如:狗狗的汪汪汪,猫猫的喵喵喵)做成一个类,我们叫做子类。 有什么好处呢?就是可以实现代码的复用,提高工作效率。

三、继承怎么写

继承的关键字是extend。具体如下:

 修饰符 class 子类 extends 父类 {

        // ...

}

所以对于上面狗狗和猫猫可以怎么继承呢?代码如下: 

// Animal.java
public class Animal{
    String name;
    int age;

public void eat(){
    System.out.println(name + "正在吃饭");
}
public void sleep(){
    System.out.println(name + "正在睡觉");
}
}
// Dog.java
public class Dog extends Animal{
void bark(){
    System.out.println(name + "汪汪汪~~~");
}
}
// Cat.Java
public class Cat extends Animal{
void mew(){
    System.out.println(name + "喵喵喵~~~");
}
}
// TestExtend.java
public class TestExtend {
public static void main(String[] args) {
    Dog dog = new Dog();
// dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的
    System.out.println(dog.name);
    System.out.println(dog.age);
// dog访问的eat()和sleep()方法也是从Animal中继承下来的
    dog.eat();
    dog.sleep();
    dog.bark();
}
}

1.子类会将父类的东西全部继承下来(也可以说copy下来了)。

2.子类需要有自己额外的共性(比如汪汪汪),不然就没必要继承了。 

四、成员的访问

1.父类与子类的成员变量不同名

public class Base {
    int a;
    int b;
}
public class Derived extends Base{
    int c;
public void method(){
    a = 10; // 访问从父类中继承下来的a
    b = 20; // 访问从父类中继承下来的b
    c = 30; // 访问子类自己的c
}
}

2.父类与子类的成员变量同名 

public class Base {
    int a;
    int b;
    int c;
}
/
public class Derived extends Base{
    int a; // 与父类中成员a同名,且类型相同
    char b; // 与父类中成员b同名,但类型不同
public void method(){
    a = 100; // 访问子类新增的a
    b = 101; // 访问子类新增的b
    c = 102; // 子类没有c,访问的肯定是从父类继承下来的c
 // d = 103; // 编译失败,因为父类和子类都没有定义成员变量b
}
}

 所以我们可以发现规律:

就近原则,不管怎么样,优先访问自己新增的,如果没有,就访问父类继承下来的,如果父类也没有,则报错! 

3.父类与子类的成员方法不同名

public class Base {
public void methodA(){
    System.out.println("Base中的methodA()");
}
}
public class Derived extends Base{
public void methodB(){
    System.out.println("Derived中的methodB()方法");
}
public void methodC(){
    methodB(); // 访问子类自己的methodB()
    methodA(); // 访问父类继承的methodA()
 // methodD(); // 编译失败,在整个继承体系中没有发现方法methodD()
}
}

4.父类与子类的成员方法同名 

public class Base {
public void methodA(){
    System.out.println("Base中的methodA()");
}
public void methodB(){
    System.out.println("Base中的methodB()");
}
}
public class Derived extends Base{
public void methodA(int a) {
    System.out.println("Derived中的method(int)方法");
}
public void methodB(){
    System.out.println("Derived中的methodB()方法");
}
public void methodC(){
    methodA(); // 没有传参,访问父类中的methodA()
    methodA(20); // 传递int参数,访问子类中的methodA(int)
    methodB(); // 直接访问,则永远访问到的都是子类中的methodB(),基类的无法访问到
}
}

我们依旧可以发现规律(与成员变量相同):

就近原则,不管怎么样,优先访问自己新增的,如果没有,就访问父类继承下来的,如果父类也没有,则报错! 

五、super关键字

既然假设子类有的话,就不会访问到父类。那我就想访问父类怎么办?这时候super关键字就孕育而生了。super的作用就是用来在子类的方法中访问父类的东西。 

public class Base {
    int a;
    int b;
public void methodA(){
    System.out.println("Base中的methodA()");
}
public void methodB(){
    System.out.println("Base中的methodB()");
}
}
public class Derived extends Base{
    int a; // 与父类中成员变量同名且类型相同
    char b; // 与父类中成员变量同名但类型不同
// 与父类中methodA()构成重载
public void methodA(int a) {
    System.out.println("Derived中的method()方法");
}
// 与基类中methodB()构成重写(即原型一致,重写后序详细介绍)
public void methodB(){
    System.out.println("Derived中的methodB()方法");
}
public void methodC(){
// 对于同名的成员变量,直接访问时,访问的都是子类的
    a = 100; // 等价于: this.a = 100;
    b = 101; // 等价于: this.b = 101;
// 注意:this是当前对象的引用
// 访问父类的成员变量时,需要借助super关键字
// super是获取到子类对象中从基类继承下来的部分
    super.a = 200;
    super.b = 201;
// 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法
    methodA(); // 没有传参,访问父类中的methodA()
    methodA(20); // 传递int参数,访问子类中的methodA(int)
// 如果在子类中要访问重写的基类方法,则需要借助super关键字
    methodB(); // 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到
    super.methodB(); // 访问基类的methodB()
}
}

在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

注意: super跟this一样,只能在非静态方法中使用。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值