第四周 面向对象进阶

Static

在类中,定义变量时,带有static修饰的变量是静态成员变量

或者说是这个类的公共变量,可以被共享访问

不需要通过具体的成员变量就可以使用

    private static String name;
    //name作为静态成员变量
    private int id;
    //id作为实例成员变量
    public static void main(){
        System.out.println(User.name);
        //name是这个类的公共变量

        User u1=new User();
        System.out.println(u1.id);
        //id就是对象u1的成员变量,当定义出新的成员时,新成员的变量也有id

静态方法只能访问静态的成员,不可以直接访问实例成员

实例方法可以访问静态成员也可以访问实例成员

静态方法中是不可以出现this关键字的。

继承

继承的概念

extends可以让一个类和另一个类建立1父子关系

public class Student extends People{}

Student被称为子类(派生类), People被称为父类(基类或超类)

当子类

继承父类后,就可以直接使用父类公共的属性和方法

继承的优点

继承可以提高代码的复用性

继承设计规范

子类们的相同特征(共性属性,共性方法)放在父类中定义,子类独有的属性和行为应该定义再子类自己里边

以下为一个新创建的子类对象的内存示意图

确实为一个整体对象,但分为两个部分

继承的特性

1,子类可以继承父类的行为和属性,但不能继承父类的构造器、

2,java是单继承模式,一个类只能继承一个父类

3,Java不支持多继承,但是支持多层继承

4,java中所有类都是Object的子类

5,子类不能继承父类的静态成员变量,虽然可以使用,但是是static的特点,父类共享给子类使用的;

6,子类可以继承父类的私有成员,只是不能直接访问

为什么不支持多继承?

假设可以实现多继承,一个子类拥有两个父类,而父类中含有两个不同的重名方法,那子类在执行方法时必定会出现错误

当多重继承父类时,

假如父类和父类的父类中含有重名的方法,子类会就近继承父类的方法;

当父类和子类拥有重名的方法会优先调用子类自己的,

就近原则

当涉及到元素访问时,

会优先访问子类局部

其次是子类成员

最后是父类

        System.out.println(name);
        //如果想要访问“子类名”,可以使用this.name指定访问当前子类对象的name
        System.out.println(this.name);
        //如果子类和父类存在重名的变量,想要使用父类的,可以使用super关键字
        System.out.println(super.name);

什么是方法重写

在继承体系中,子类出现了和父类中一模一样的方法声明,就称子类这个方法是重写的方法

方法重写的应用场景

1,当子类需要父类的功能,但父类的该功能不完全满足自己的需求时、

2,子类可以重写父类中的方法

3,重写时要在方法开头加上@Override,重写校验注解,同时可以作为重写的标志

重写时先使用super关键字,调用父类的方法,再加上子类所特有的部分

重写的要求

1,重写方法的名称,形参列表必须与被重写方法的名称和参数列表一致

2,私有方法不能被重写

3,子类重写父类方法时,访问权限必须大有或者等于父类(缺省<protected<public)

4,子类不能重写父类的静态方法,如果重写会报错

继承后,构造器的行为

调用子类所有构造器都会默认先访问父类中的无参构造器,再执行自己

为什么?

1,子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据

2,子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化

怎么调用父类构造器的?

子类构造器的第一行语句默认都是:super(),虽然可以不写,但是始终存在

继承后,子类构造器访问父类有参构造器的特点

super关键字可以在子类中调用父类的私有变量

数据进行如下流程的传递

super调用父类有参构造器的作用

初始化继承父类的数据

如果父类中没有无参数构造器,只有有参数构造器,会出现什么现象呢

会报错,因为子类默认会调用无参构造器

如何解决

子类构造器中可以通过书写super(....),手动调用父类的有参构造器

this和super的使用总结

this关键字可以通过提供不同的参数列表来调用本类的其他构造器

子类通过this()去调用本类的其他构造器,其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类的构造器

所以this和super都只能放在构造器里的第一行,且不能存在于同一个构造器中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值