0
点赞
收藏
分享

微信扫一扫

2022-04-15 西安 javaSE(08)

扒皮狼 2022-04-15 阅读 65
java

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

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

}

一个有歧义的结论:

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


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

子类可以继承父类的实例方法

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

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

方法重写注意点:
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(实参);调用父类中对应参数的构造器。
含义:在初始化子类实例成员前,调用父类构造器完成父类成员初始化操作


总结 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 boolean equals(Object obj)比较俩个对象的地址值是否相等。

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()方法
    }


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

权限访问级别从大到小:
     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(在外界不想创建对象时)
类中的构造器代码块:
           只能是缺省。
类中的静态代码块:
           只能是缺省。
局部内容(方法中):
           只能是缺省

举报

相关推荐

0 条评论