2022-04-15 西安 javaSE(08)继承,方法重写,super关键字,Object类,权限访问级别

2022-04-15 西安 javaSE(08)继承,方法重写,super关键字,Object类,权限访问级别_第1张图片


继承

继承

子类继承父类,也就拥有了父类中 protected 和 public 修饰的方法和字段,同时,子类还可以扩展一些自己的方法和字段,也可以重写继承过来方法。

//继承的格式
public class 子类类名 extends 父类类名{

}

继承:
        1.子类继承父类后,子类拥有和父类相同的属性和行为。
        2.一个子类只能拥有一个直接父类(单继承,反之一个父类可以 拥有多个直接子类。)
        3.java不支持多继承,但是支持多层继承。
        4.在java中所有类都隐式继承一个类(Object)

继承的好处:
1.提高代码的复用性,提高开发效率
2.提高代码的扩展性。

继承关系中静态成员:
        父类有静态变量和静态方法,子类可以继承父类的静态成员。

一个有歧义的结论:

子类可以继承父类的私有成员(debug看到),但受限于private关键字的特点,无法直接进行访问。如果想进行访问,需要借助公共的获取方式。


方法重写

继承关系中或实现关系中。出现了方法名相同,形参列表相同,权限访问级别和返回类型遵循相关规则的现象,称为方法重写.

方法重写作用:为了后期功能的扩展,并保留原有的功能

子类方法重写的必须满足的全部前提条件:

  • 1、必须要有继承关系或者实现关系
  • 2、重写方法的方法名必须和被重写方法的方法名相同
  • 3、重写方法的形参列表必须和被重写方法的形参列表相同
  • 4、重写方法的权限访问级别大 >= 被重写方法的权限访问级别,并遵循注意点。
  •      public >protected>(缺省[sheng])>private
  • 5、在内存中,重写方法的返回类型必须和被重写的方法的返回类型相同。

注解:java提供用来检测语法格式的特定接口
@Override:检测子类方法是否满足重写规则的注解。写在子类重写的方法上
这个注解可以将不符合java重写语法规则的情况在编译期就报错。

方法重写注意点:
1.父类的私有方法不可以被子类重写(可以使用@Override验证)
2.父子类跨包: public和protected修饰权限的父类方法可以被重写。
或者说 缺省修饰的父类方法只能在父子类同一个包下被子类重写。
3.父类的静态方法不可以被子类进行重写(可以使用@Override验证),但是也得遵循方法重写的语法规则
4.在代码中,
   4.1父类被重写方法的返回类型是void时:子类重写父类该方法时,返回类型也必须是void,否则编译报错
   4.2父类被重写方法的返回类型是基本类型时:子类重写父类该方法时,返回类型也必须是该基本类型(类型提升也报错)。
   4.3父类被重写方法的返回类型是引用类型时:子类重写父类该方法时,返回类型可以是该类型(父类被重写的方法返回值类型)本身,也可以是该类型的子类类型。其实就是多态


继承关系构造器的特点

1、初始化子类成员之前,先初始化父类成员,由子类构造器中第一部分内容加载父类构造器
2.当一个类构造器中没有任何this(实参)或super(实参),jvm才会默认自动分配一个super(),用来在初始化子类成员前先初始化父类引用成员。
3.父类的构造器子类不可以继承。


super关键字

super关键字第一种用法
场景:子类的构造器当中或者子类的实例方法中。

  • super.实例变量名;用来区分子父类实例变量名;
  • super.实例方法名(实参);

super关键字的第二种用法:
场景:子类的构造器中。
格式:super(实参);调用父类中对应参数的构造器。
含义:在初始化子类实例成员前,调用父类构造器完成父类成员初始化操作

总结 this和super关键字
1.在静态成员中不可以使用this关键字和super关键字。
2.在创建继承关系中的子类对象时,在子类的构造器中或实例方法可以正常
打印this关键字,但是不可以打印super关键字

System.out.println(this);//编译不报错
System.out.println(super);//编译报错

3.在构造器中,this(实参)或super(实参)必须编写在第一行。
4.在构造器中,this(实参)或super(实参)不可以同时使用。(显式隐式都不行)


Object类   java.lang

1.Object类是类层次的顶级父类
2.所有对象(包括数组)都可以调用Object类中的方法
3.所有的接口中都隐式含有Object类中所有方法的抽象形式。

类的构造器 public Object()

该构造器不是用来创建Object类的对象。
而是创建Object类子类的对象时,在初始化子类成员值之前,通过super()调用Object类的构造器初始化其父类的成员。

public boolean equals(Object obj)比较俩个对象的地址值是否相等。

面试题:equals和==的区别
==,它是既可以比较基本类型的数据也可以比较引用类型的数据。
当比较基本类型的数据时,比较的是基本类型的数据值是否相等。
当比较引用类型的数据时,比较的是引用类型的地址值是否相等。

equals只能比较引用类型的地址值是否相等【Object类的equals方法】,不能比较基本类型。
当比较引用类型重写Object类后的equals(),需要根据重写后的规则进行比较。

public String toString()   返回该对象的字符串表示
在使用输出语句打印对象名(包含数组)时,其实就是在隐式调用toString()方法,打印char类型数组除外

    public static void main(String[] args) {
        int[] ints={1,2,3};
        System.out.println(ints.toString());//[I@28d93b30 调用Object的toString
        System.out.println(ints);//[I@28d93b30
        System.out.println("---------------------------");
        char[] chars={'a','b','c'};
        System.out.println(chars.toString());//[C@1b6d3586 调用Object的toString
        System.out.println(chars);//abc  char类型的字符拼接。此时没有隐式调用toString()方法
    }

2022-04-15 西安 javaSE(08)继承,方法重写,super关键字,Object类,权限访问级别_第2张图片


权限访问级别

4种权限访问级别

封装思想的核心就是权限访问级别,给不同的内容添加不同的权限访问级别

权限访问级别从大到小:
     public >protected>(缺省[sheng])>private

private:
private修饰的内容只能在本类中有效,在本类之外无法访问。

缺省:
修饰范围:兼容private级别的作用范围。


缺省在同一个包下,有无继承关系。都是可以访问的
缺省级别的内容在本包(同一个包)中有效。在本包之外无法进行访问。

protected:
修饰范围:兼容“缺省级别”的作用范围

protected修饰的内容在同一个项目同一个模块且有继承关系时中有效。
如果在同一个模块中,可以直接使用。
如果不在同一个·模块中,可以使用(alt+enter)万能键强行导入)
这样会修改了项目的配置文件,改变.ideal文件夹下,workspace.xml

public级别:
修饰范围:兼容protected修饰的范围


public修饰的内容在同一个项目有效(不管有无继承关系)。在同一个项目同一个模块有效。
在同一个项目不同模块也会修改项目的配置文件。


权限访问级别的补充

类(class,interface,enum)文件  权限级别:
         只能是public和缺省。(推荐使用public)
类中的成员量权限级别:
        4种都可以,但是推荐使用private,对外提供公共的访问方式
类中的成员方法权限级别:
        4种都可以,推荐使用public(常规方法),protected(复杂的继承关系),private(自己抽取的方法)
类中的成员内部类:
        4种都可以,推荐使用缺省和private

类中的其他代码:
        类中的构造器,权限级别:
          4种都可以,推荐使用public(常规)和private(在外界不想创建对象时)
        类中的构造器代码块:  只能是缺省。
        类中的静态代码块:  只能是缺省。
        局部内容(方法中):  只能是缺省

你可能感兴趣的:(java)