子类继承父类,也就拥有了父类中 protected 和 public 修饰的方法和字段,同时,子类还可以扩展一些自己的方法和字段,也可以重写继承过来方法。
//继承的格式
public class 子类类名 extends 父类类名{
}
继承:
1.子类继承父类后,子类拥有和父类相同的属性和行为。
2.一个子类只能拥有一个直接父类(单继承,反之一个父类可以 拥有多个直接子类。)
3.java不支持多继承,但是支持多层继承。
4.在java中所有类都隐式继承一个类(Object)继承的好处:
1.提高代码的复用性,提高开发效率
2.提高代码的扩展性。继承关系中静态成员:
父类有静态变量和静态方法,子类可以继承父类的静态成员。
一个有歧义的结论:
子类可以继承父类的私有成员(debug看到),但受限于private关键字的特点,无法直接进行访问。如果想进行访问,需要借助公共的获取方式。
在继承关系中或实现关系中。出现了方法名相同,形参列表相同,权限访问级别和返回类型遵循相关规则的现象,称为方法重写.
方法重写作用:为了后期功能的扩展,并保留原有的功能
子类方法重写的必须满足的全部前提条件:
注解: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(实参);调用父类中对应参数的构造器。
含义:在初始化子类实例成员前,调用父类构造器完成父类成员初始化操作
总结 this和super关键字
1.在静态成员中不可以使用this关键字和super关键字。
2.在创建继承关系中的子类对象时,在子类的构造器中或实例方法可以正常
打印this关键字,但是不可以打印super关键字。
System.out.println(this);//编译不报错
System.out.println(super);//编译报错
3.在构造器中,this(实参)或super(实参)必须编写在第一行。
4.在构造器中,this(实参)或super(实参)不可以同时使用。(显式隐式都不行)
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()方法
}
封装思想的核心就是权限访问级别,给不同的内容添加不同的权限访问级别
权限访问级别从大到小:
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(在外界不想创建对象时)
类中的构造器代码块: 只能是缺省。
类中的静态代码块: 只能是缺省。
局部内容(方法中): 只能是缺省