一、继承
1.1 什么是继承
继承 extends
生活中: 孩子继承父辈的财产(物品),继承后孩子就可以使用
代码中: 子类 继承 父类,子类就可以使用父类的属性和方法
1.2 为什么要继承
有了继承,好处
代码减少重复,提供代码复用性
是多态的前提
1.3 如何写继承
在类声明上,使用extends声明要继承的类,如下
public class A extends B{ }以上,就是继承,读作: A类继承B类,其中A类是子类,B类是父类
特殊的:
java的继承是单继承, 即一个类只能继承一个父类
支持层次继承,A类继承B类,B类继承C类,A对象可以调用C对象中的属性和方法
// 父类Animal
public class Animal {
int age;
String name;
void eat() {
System.out.println("吃东西");
}
}
// 子类Dog
public class Dog extends Animal{
}
// 测试
public class Test {
public static void main(String[] args) {
Dog dog = new Dog( );// Dog是继承Animal
int age = dog.age;// 调用父类的属性
System.out.println("age = " + age);
dog.eat();// 调用父类的方法
}
}
1.4 继承中属性问题
子类可以使用父类的非私有属性,无法使用父类私有的属性
子类中可以定义自己特有的属性,自己对象可以调用
但是,父类对象无法向下使用子类中的属性
1.5 继承中方法问题
子类对象可以调用父类中非私有的方法,私有方法无法调用
子类中可以定义自己特有的方法,自己调用
父类对象是无法向下调用子类中的方法
子类中有与父类一样的方法 ---> 重写!!
1.6 继承中构造方法问题
继承中,创建子类时,
会先创建父类对象,将父类属性初始化
后再创建子类对象
这也解释了,子类对象为什么可以使用父类属性,因为父类对象创建了,属性初始化了,子类才可以直接使用
那么,子类创建对象时,是如何调用父类构造,创建父类对象的呢??
因为在构造方法的第一行有默认隐藏的super()在调用父类构造,创建父类对象
1.7 总结
子类继承父类,使用extends
继承后,子类能使用父类非私有的属性和方法
子类和父类方法有重复---> 重写
继承后,父类不能子类任何东西
继承时,先创建父类对象,再创建子类对象
super
二、重写
重写是在继承的时候,子类重写父类的方法.
什么是重写? 就是父类有一个方法,子类又重新定义一个一模一样的方法,叫做重写,又叫覆写(Override)
重写的要求:
子父类重写的方法 访问修饰符一样
特殊的: 子类访问修饰符 >= 父类的
子父类重写的方法 返回值类型一样
子父类重写的方法 方法名一样
子父类重写的方法 参数列表一样
子父类重写的方法 方法体不一样!
为什么子类要重写父类方法?
这些父类中的方法确实是需要的,且是共性的
但是父类执行的效果不理想,不适合子类 . 需要每个子类重写以满足自身的需求(情况)
总结: 父类方法不适合子类,所以子类需要重写!
三、this和super
创建子类对象时,会先创建父类对象,再创建子类对象
为什么? 是因为java语法设计,在构造方法第一行默认隐藏有个super() 调用父类的无参构造
super是什么? super是代表父类对象
super能干什么?
作用1: super(),调用父类无参构造 ; super(参数)调用父类有参数的构造方法
作用2: super代表父类对象,调用父类的属性和方法
super.属性
super.方法()
this和super
this | super | |
---|---|---|
是什么 | 代表当前类对象 | 代表父类对象 |
属性 | this.属性; (调用当前类属性, 如果自己没有也可以调用父类的属性) | supe.属性;只能调用父类属性 |
方法 | this.方法(); (调用当前类方法, 如果自己没有方法也可以调用父类的方法) | super.方法();只能调用父类方法 |
构造方法 | this(); 调用自己的无参构造 this(参数); 调用的是自己的有参构造 | super();调用父类无参构造 super(参数);调用父类有参构造 |
四、有父类时对象创建的过程
有父类时对象创建的过程,
先创建父类对象
在创建子类对象
在每个类创建对象时都先属性初始化再执行构造
五、访问修饰符
访问修饰符,又叫访问限制符,控制符
访问就是调用
修饰符/限制符/控制符 , 即控制能否调用
访问修饰符,主要是用来修饰
方法
属性
哪些修饰符
public
protected
缺省/默认
private
当前类 | 同包下其他类中 | 不同包的子类 | 不同包非子类 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | 父类不能调用,子类可以调用 | × |
缺省 | √ | √ | × | × |
private | √ | × | × | × |
访问权限范围从大到小:public > protected > 缺省 > private
一般情况下,实战中最常见是public和private