第九章 继承

一、final关键字

public class FinalTest {
    //final可以修饰变量,修饰完的变量成为常量
    public void doSomething(final Student student){
        //在方法调用的时候会进行第一次赋值,所以在通过new创建对象就是给
        //Student对象进行二次赋值,所以报错
        //Student = new Student();
    }
    //final可以修饰方法,但是final修饰的方法不可以被重写
    public final void saySomething(){
        System.out.println("final修饰的方法");
    }
}
//final可以修饰类 但是final修饰的类没有子类只有父类
final class Test01 extends Test02{}
class Test02 extends FinalTest{
    public void method(){
        //final修饰的方法可以被继承到
        saySomething();
    }

}
//class Test03 extends Test01{}
class Test04{}

final修饰的类不能被继承,因此没有子类

final修饰的方法不能被重写:private、static修饰的方法不能被重写,默认为final修饰

final可以用来修饰常量

final修饰方法的形参:不能改变形参的值

二、继承

1.创建父类

public class Person {
    String name="张飞";
    private  int age;
    public Person(){
        System.out.println("父类的构造方法");
    }
    public void method(){
        System.out.println("父类中的方法");
    }
    public void lea(){
        System.out.println("1");
    }
    public void work(){
        System.out.println("父亲的工作是挣钱养家");
    }


}

2.子类中的实现


public class Student extends Person {
 @Override
    public void work() {
        System.out.println("孩子的工作是努力学习");
    }
    public Student(){
        //在子类的构造方法中可以调用父类的构造方法,用于初始化父类属性
        //如果父类是无参的构造方法,那么子类可以省略显示调用父类的构造方法,但是如果
        //父类没有无参的构造方法,子类必须显示调用父类的构造方法,否则编译报错
        //  super(a:10);//必须放在方法的第一行
        System.out.println("子类的构造方法");
    }
    String name = "张楠";
    public void doSomething(){
        //当父类中的成员跟子类中的成员名字相同时,在子类中会将父类的成员屏蔽掉,
        //可以通过super调用父类的成员,解决这个问题
        System.out.println(name);
        System.out.println(super.name);

    }

    public static void main(String[] args) {

        Student s = new Student();
        System.out.println(s.name);
        //父类中用private修饰的成员,属于父类独有的,子类不能在集成到了
        //      System.out.println(s.age);
        s.method();
        s.work();
        s.doSomething();
        s.lea();

    }
}

三、方法重写(覆写、覆盖)

方法重写,当父类方法不能满足子类需要的时候,可以通过方法重写,解决重写方法的名字,直接回车

方法重写的规则:

1.要有继承,并且在子类中重写

2.重写方法与被重写方法:

(1)方法名称相同

(2)参数个数、类型、顺序相同

(3)返回类型一致或是协变返回类型

(4)协变返回类型:重写方法的返回类型是被重写方法返回类型的子类(或实现类类型)

3.private修饰的方法不能被重写

4.子类方法不能缩小父类方法的访问权限

5.子类方法不能抛出比父类方法更多的异常

6.非静态方法不能被static修饰的方法重写

7.static修饰的方法不能被重写,但static修饰的变量和方法都可以被屏蔽

四、类的继承

extends 表示继承关系,关键字在左侧的是子类,右侧是父类

子类又叫派生类,父类又叫基类或超类

继承之后子类会自动拥有父类的成员 java是单继承,只有一个父类

子类将继承父类的非私有属性和方法

一种在保持对象差异性的同时共享对象相似性的复用

通过继承,子类自动拥有父类的所有成员(成员变量和方法),父类的构造方法不能被子类继承

子类的引用可以访问继承父类成员,父类的引用不能访问子类中独有的成员

类声明时,使用extends关键字表示两个类的继承关系

权限修饰符:

1.子类不能继承父类中用private修饰的成员

2.子类与父类不在同一个包时,不能继承父类中用private修饰和默认的成员

java不支持多继承

五、重写与重载的比较

相同点:方法名相同

不同点:

1.使用条件:

(1)方法重写必须有继承,在子类中重写

(2)方法重载在同一个类中

2.参数

(1)方法重写参数类型、个数、顺序一致

(2)方法重载参数类型、个数、顺序至少一个不一致

3.返回类型

(1)方法重写方法返回类型必须一致或可协变

(2)方法重载对返回类型无要求,可以一致或不一致

4.次数:

(1)父类的一个方法只能被一个子类重写一次

(2)一个类中可以有一个方法的多个重载方法

5.权限和异常

(1)方法重写对方法的访问权限和抛出的异常有特殊的要求

(2)方法重载没有限制

重写只有发生在父类与子类之间,而重载可以发生在同一个类中

简述方法重载和方法重写的区别:

(1)方法重载和方法重写是Java多态性的不同表现。重载是一个类中多态性的一种表现,重写是父类与子类之间多态性的一种表现。

(2)如果在同一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,与返回值无关,则称为方法的重载。

(3)如果在子类中定义某方法与其父类有相同的名称、参数和返回值,我们说该方法被重写。子类的对象使用这个方法时,将调用子类中定义的。

六、作用域

方法内定义局部变量屏蔽类中同名的成员变量

子类继承父类:

1.子类中定义与父类同名的成员变量时,在子类范围内,屏蔽父类的成员变量

2.子类某成员方法重写父类方法,在子类范围内,屏蔽父类的成员方法

3.子类某静态方法与父类方法同名,在子类范围内,屏蔽父类的方法

七、super关键字

super:代表本类继承的直接父类当前的对象

用法:

1.在子类构造方法中通过super关键字调用这个类的父类的构造方法

(1)构造方法调用顺序:根基类、…、父类的父类、父类、子类

(2)默认调用无参构造方法

(3)父类若无无参构造方法,必须在子类构造方法中显式调用父类构造方法,否则编译报错

注:只能放在方法第一行,this()与super()不能在同一方法中使用

    例如:super();或super(1,‘L’,50);

2.实例方法内局部变量或参数与成员变量同名,成员变量在实例方法内被屏蔽时,可以使用super关键字调用

例如:super.no=no;

注:静态方法中不能使用this和super关键字

八、不变模式

1.不变模式只设计到一个类,一个类的内部状态创建后,在整个生命周期都不会发生变化时,这样的类就叫不变类,使用不变类的做法就叫做不变模式

2.弱不变模式:一个类的实例状态是不变的,但是这个类的子类实例具有可能会变化的状态

(1)类的成员变量权限修饰符为private,set方法不设置成员变量

(2)缺点:子对象可以是可变对象

3.强不变模式:一个类的实例状态是不变的,这个类的子类实例也具有不可变化的状态。实现的途径是类所有的方法都是final类型,或者类本身用final修饰(没有子类)

九、对象池

1.虚拟机在启动的时候会实例化9个对象池,这9个对象池分别用来存储8种基本类型的包装类对象和String对象

2.String使用对象的方法:第一种方法在对象池种拿对象,第二种方法直接生成新的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值