class 子类名 extends 父类名{
//类名
}
通过extends实现继承。
子类可定义自己的成员变量与成员方法。
子类继承父类的全部成员(属性和方法),除private的成员和方法
注:Java中只支持单继承,且父类的构造方法不会自动继承。
1.用什么方法让子类借用父类的构造方法呢?
使用super关键字
super关键字代表父类
super.父类成员变量
super.父类成员方法(参数列表)
super(参数列表);
注:super();与this();有类似但也不同
相同:
必须是该方法的第一条执行语句,且单个构造方法中只能出现一次。
2.特别注意:
私有的成员不能被继承
java中 子继承父 是单继承
构造方法不能自动继承,需要调用父类的构造方法,但子类在创建对象时要对继承来自父类的成员进行初始化,因此,在创建子类时除了执行子类的构造方法外,还需要调用父类的构造方法,具体遵循原则如下:
①当子类未定义构造方法时,创建对象时将无条件地调用父类的无参构造方法;
②对于父类的含参数构造方法,子类可以在自己构造方法中使用super调用它,但super调用语句必须是子类构造方法中的第一个可执行语句;
③子类在自己的构造方法中如果没有用super明确调用父类的构造方法,则在创建对象时,将自动先执行父类的无参构造方法,然后再执行自己定义的构造方法。
如果父类有了有参的构造方法,无参的构造方法就不会使用
this和super不能同时出现,super也需要放在第一句,这与this冲突。
注意:如果我们没有明确声明父类,则默认父类是java.lang.Object类,因此Object类是Java中所有类的直接或间接父类
3. 显式构造方法和隐式构造方法
创建有参构造函数后,系统就不再有默认无参构造函数。
如果没有任何构造函数,系统会默认有一个无参构造函数
子类的构造方法如果没有显式的调用父类的构造方法会默认添加super();即父类的无参构造方法,如果父类没有无参构造方法就会报错
但是接下来我说的就是一个小重点—>在继承当中,子类继承父类的属性和继承方法的方式上有所差别:
—>**父类属性不可被重写,只会被调用,父类方法可以被重写,也可以被调用**
—>一般情况下,当子类中存在和父类同名属性,父类属性会隐藏起来,使用子类的属性,但父类的变量仍占据空间,可用super或父类名来访问。
在多态的情况下,属性被调用时会激活父类属性子类属性隐藏起来
但子类的方法不会隐藏,一旦被重写,只能使用super来调用父类方法在子类中使用
4.重写和重载的区别:
重写:子类和父类方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。
注:子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
即用子类对象调用子类中的重写方法。super.方法名() 用于调用父类中的方法
重载:一个类中的方法与另一个方法同名,但是参数表达不同。
重写方法需注意:
在继承关系中,当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法。
如果在子类中想调用父类中的那个被重写的方法,我们可以用super.方法名(参数列表)
重写方法时,不能使用比父类中被重写的方法更底的访问权限 。
public ->protected -> default ->private
(高到低)
5.多态
多态三要素:
继承
方法重写
父类引用子类对象
变量是没有多态的
多态也存在弊端,当运用多态机制时,父类引用指向子类,因为保存编译时是从左往右,会看父类中有无此方法,所以子类特有的方法在调用时会出现错误,无法使用,但可以用强制转换,把父类当子类对象使用。
多态的好处,就是参数都是父类的子类,这样可以把其子类当作参数使用,类型为父类。
对象转型:
1.把子类对象当做父类对象来使用,父类引用指向对象
Pet p=new Cat();
2.强制转换
Cat c=(Cat)p;
执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常。
instanceof操作符判断一个实例对象是否属于一个类。
例如:Printer p=new Blackprinter();
Colorprinter c=(Colorprinter)p;
运行时就会报错,因为编译时,认为是Clorprinter是printer类,运行时是Blackprinter类型
instanceof是java的关键字
instanceof的语法格式如下:
对象 instanceof 类名
返回值为布尔值(true、false)