Java初学笔记(继承+方法重写)(11.21)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、继承

1)概念

(1)继承是面向对象编程的三大特性之一,可以解决编程中代码冗余的问题,是实现代码重用的重要手段之一,且增加了软件的可扩充性。

(2)Java中只支持单根继承,即每个类只能有一个直接父类。Java编程语言,这时可以利用接口来实现与多重继承相似的效果。如果一个类没有指定父类(即没有继承任何类),那么这个类默认继承Object类。

2)继承的语法格式

[访问修饰符] class <SubClass> extends <SuperClass>{
//代码
}
案例:
package P;
public class Son extends Father{
}

3)继承中的访问修饰符

(1)访问修饰符如果是public,那么该类在整个项目中可见。
(2)若不写访问修饰符,则该类只在当前包中可见。
(3)可以继承public修饰的属性和方法,不论子类和父类是否在同一个包里。
(4)可以继承protected和默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一个包里。

package P;
//在P包Father类中用四种修饰符修饰四个属性
public class Father {
    public String name;
    protected int age;
    char gender;
    private double money;
}
--------------------------------------------------------------
package P;
public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.name = "张三";
        son.age = 19;
        son.gender = '男';
        //同一个包中的子类不能直接访问父类中的私有属性
        //son.money = 100;
    }
}
package PT;
import P.Father;
public class Son extends Father {
}
--------------------------------------------------------------
package PT;
public class PTTest {
    public static void main(String[] args) {
        Son son = new Son();
        son.name = "张开";
        //不同包的子类无法直接访问父类中使用protected修饰的属性
        //son.age = 19;
        //不同包中的子类无法直接访问父类中使用默认修饰符修饰的属性
        //son.gender = '男';
        //不同包中的子类无法直接访问父类中使用private修饰符修饰的属性
        //son.money = 200;
    }
}

(2)在Java中,子类可以从父类中继承以下内容:

1.在子类继承父类的时候,子类默认调用父类的构造函数。子类中通过super关键字来调用父构造方法。

2.如果父类有默认构造函数,子类实例化时自动调用。但如果父类没有默认构造函数,即无参构造函数,子类构造函数必须通过super调用父类的构造函数。

3.子类不可继承父类的构造函数,只能调用。子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

4.如果父类的属性均为private修饰,则可以通过共有的getter,setter方法来调用。


二、super关键字

1)调用父类成员

(1)super可以理解为父类的,super()可以用来调用属性、方法、构造器。

(2)super在父类和子类有同名属性时,你想在子类调用父类的同名属性,super.不可以省略。

(3) super()只能出现在构造方法第一行,通过当前的构造方法去调用父类中其它的构造方法,目的是:在创建子类对象的时候,先初始化父类型特征。

(4)this()和super()不能共存,他们都是只能出现在构造方法第一行。当一个构造方法第一行:既没有this()有没有super(),默认会有一个super()。

public class Dog extends Animal{
    private String strain;
    public Dog() {
    //默认调用Animal类中的无参构造方法
    }
    //表示使用Animal类中的有参构造方法
    public Dog(String name, int health, int love, String strain) {
    //继承父类中的属性
        super(name, health, love);
        this.strain = strain;
    }

2)实例化子类对象

(1)在Java中,一个类的构造方法在如下两种情况下总是会被执行。

1.创建该类的对象(实例化)

2.创建该类的子类的对象(子类的实例化)

(2)当在Java语言中创建一个对象时,Java虚拟机会按照父类—子类的顺序执行一系列的构造方法。

(3)子类继承父类时构造方法的调用规则如下:

1.如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,是否写“super();”语句,效果是一样的。

2.如果子类的构造方法中通过super显示地调用了父类的有参构造方法,那么将执行父类相应的构造方法。


三、方法重写(overriding)

(1)如果从父类继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写(覆写),以满足需求。重写时,可以用 [super.方法] 的方式来保留父类的方法。

  • 构造方法不能被重写

(2)方法重写规则:

1.方法名相同
2.参数列表相同
3.返回值类型必须和被重写方法的返回值类型相同或其是其子类
4.访问权限修饰符不能严于父类(多态机制冲突)
5.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被覆盖为静态方法
6.子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法
7.父类的私有方法不能被子类覆盖
8.不能抛出比父类方法更多的异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值