目录
一、继承的定义
将多个类中重复的属性或者方法抽取出来成为一个父类(超类),子类继承自父类,具有父类中的方法和属性
二、继承的特点
- 子类只能继承一个父类(单继承),可以多层继承,例如C继承自B,B继承自A,那么C同样可以调用A类的属性或者方法
- 子类继承父类的普通属性和方法
- 子类不能继承父类的构造方法,但是在子类的构造方法第一行隐式的存在一个super(),用来调用父类的构造方法
- 子类无法继承父类中被private修饰的属性或者方法
- 子类可以继承父类中的静态方法和静态属性
- 父类中必须有无参构造方法,才能被继承,只有有参构造方法无法被继承
三、继承的使用方法
- 将多个类中共有的属性或者方法按照需求抽取出来放在一个类中
- 子类通过在类名后面+extends+父类名,即可继承于父类
四、案例
//父类
public class Animal{
String name;
//静态属性
static int age;
//静态方法
public static void eat(){
System.out.println("吃东西");
}
public void sleep(){
System.out.println("在睡觉");
}
public String toString(){
return name+"————"+age;
}
}
//子类
public class Cat extends Animal{
}
//测试类
public class Test{
public static void main(String[] args){
Cat cat=new Cat();
cat.name="西瓜";
Cat.age=3;
cat.eat();
cat.sleep;
cat.toString();
}
}
/**最后输出结果为
吃东西
在睡觉
西瓜————3
可以看出子类将父类的属性和方法都继承了下来
*/
五、super关键字
1.定义
代指当前子类的父类对象
2.作用
2.1 super.属性——调用父类的属性
2.2 super.方法——调用父类的方法
2.3 super()——调用父类的构造方法
注意:super关键字不能用在static修饰的方法中,因为static修饰的方法随着字节码一起被加载进内存,此时父类对象还没开始创建
3.案例
//父类
public class Father{
String name;
}
//子类
public class Son{
public void test(){
String name="子类";
//通过super.属性调用到父类的name属性
System.out.println(super.name+name)
}
}
六、关于子类能否继承父类构造方法的验证
1.关于是否继承父类构造方法的验证
//父类
public class Father{
public Father(){
System.out.println("父类的无参构造方法")
}
public Father(String name){
System.out.println("父类的有参构造方法")
}
}
//子类
public class Son extends Father{
public Son(String name){
System.out.println("子类的有参构造方法")
}
}
/**1.子类Son继承于父类Father,由于子类中写了有参构造方法并且没有手写无参构造方法,所以说子类目前没有无参构造方法(即无法通过无参的方式实例化对象)。
2.如果可以通过无参的方法创建出Son对象,说明父类的无参构造方法被子类继承,反之证明没有被继承
*/
//实验类
public class Test{
public static void main(String[] args){
/**3.该行代码报错,证明cat类中没有无参构造方法即子类没有继承父类的构造方法,同理也可以证明出父类的有参构造方法也没有被继承*/
// Cat cat=new Cat();
Cat cat=new Cat("测试");
}
}
2.关于子类中super()问题的解析
①.上面代码的Test类运行后,可以发现打印出来父类无参构造方法中的语句,既然子类无法继承父类的构造方法那为什么会打印出父类构造方法中的代码?
解析:子类不会继承父类的构造方法,但是在子类的构造方法的第一行会通过super()隐式的调用父类的构造方法,所以在Test类中才会打印父类的无参构造方法中的语句
(这也就是在底层其实是在子类构造方法中创建出父类的对象,这也是为什么子类可以调用父类的属性和方法的原因,其实就是通过这个创建出来的父类对象实现调用父类的属性和方法)
②能否在构造方法中同时存在this()、super()方法?
解析:在构造函数中,无法同时存在this()和super()因为一个是调用本类的无参构造方法,一个是调用父类的无参构造方法,2个方法都需要放在构造方法的第一行,所以无法同时存在于一个构造方法之中
如果子类的构造方法之中有this()那么就不会默认存在super()方法
③能否不要super()方法
解析:在子类的构造方法中一定要有一个super()方法,不然会报错无法继承父类