Java - 继承

在java中继承的含义就是 子类继承父类的成员方法

继承的最大意义:让代码实现复用

Dog类通过 extends Animal   这样Dog 就成了 Animal的子类 

Dog      也可以叫做    派生类

Animal 也可以叫做 : 基类 或者  超类

 

在main方法中 通过Dog类型 ,new 一个dog对象,那么通过引用变量就可以调用父类中的成员变量成员方法

class Animal {
    public String name;
    public int age;

    public void fun () {
        System.out.println("父类的方法");
    }
}
class Dog extends Animal {
    public String color;

    public void poll () {
        System.out.println("子类的方法");
    } 
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "三月";
        dog.age = 10;
        dog.fun();

    }
}

运行结果为:

 在继承中有几个需要了解的点: 接下来就让我们先看第一个

构造方法: 在继承关系上,当我们在构造子类的时候,首先要通过子类去帮父类进行构造

先看下下面这个代码:

我们知道在Dog类中会自动提供一个无参构造方法,那下面报错的原因是什么:

回到上面那句话,我们要通过子类的构造方法去帮助父类完成构造.

 代码改成这样就可以了:

 因为Dog继承了Animal,那么编译器执行的时候,就要通过子类的构造方法去构造父类.所以上面报错的原因就在于:无参构造会提供一个super(); 但是父类中没有无参构造,故我们就不能通过子类去帮助父类构造父类,所以就会显示红线(错误).

第二个点: 重复

在子类中如果出现了跟父类中一样的成员变量/成员方法

大家可以想一下下面这个代码的运行结果:

class Animal {
    public String name = "Lihua";
    public int age;
}
class Dog extends Animal {
    public String name = "zhangsan";

    public void fun () {
        System.out.println("姓名 :" + name);
    }
}
public class Test1 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.fun();
    }
}

运行结果:

在继承关系下 : 如果成员变量重名 或者  成员方法重名  那么就会调用子类本身自己的成员变量跟方法.

那如果我们就是想要调用 父类的成员变量 或者 成员方法呢

到这里我们就又要引出一个关键字super

还是上面的代码  我们加上super:

class Animal {
    public String name = "Lihua";
    public int age;
}
class Dog extends Animal {
    public String name = "zhangsan";

    public void fun () {
        System.out.println("姓名 :" + super.name);
    }
}
public class Test1 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.fun();
    }
}

运行结果:

要强调的一点 :  被private修饰的成员变量 或 成员方法 是不能在子类中使用的.

 

 

 第三个点: 方法的重载

先抛要求 :  

1.方法的名称必须相同

2.方法的参数列表必须不同

3.返回值没有要求

class A {
    public String name;
    //让两个变量进行 减法运算
    public int reduce (int a, int b) {
        return a - b;
    }
}
class B extends A{

    public float reduce(float a, float b) {
        return a - b;
    }
}
public class Test {
    public static void main(String[] args) {
        B b = new B();
        int ret1 = b.reduce(10,9);
        float ret2 = b.reduce(19.5f,19.4f);
        System.out.println(ret1);
        System.out.println(ret2);
    }
}

在子类中的reduce方法与父类中的reduce命名相同,但是他们的参数列表不同,所以他们构成方法的重载,在调用这个方法的时候,通过你的输入的值来判断调用那个方法.(如果两个值都是int类型那么就会调用父类的reduce方法,如果两个数都是float类型 则调用子类的reduce方法).

第四点 : 密封类 : 

在class前加上final关键字  表示这个类就是个密封类  那么他就不能被继承.

直接看代码 : 

 final : final 修饰类表明该类不想被继承,fianl修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容可以 修改的.

 解释一下后半句 : 

通过下面这幅图 : array中存储的是 第一次new出来的地址(0x567) . 并且它是被final修饰的  所以它就不可以再改变array里面存储的地址(0x567)了. 但是呢,可以改变array里面的数组的值.

 

 

如果是成员变量定义为final 语法规定必须同时给定一个初始值 !

否则会报错 :

 

 最后一点 : 

final 修饰的方法 可以被重载 但是不能被重写!!!!!

重载:

重写 :

 那么继承就到这里了,希望可以帮助到大家~~~~~~

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值