继承学习总结
继承
1、格式:
class 子类名 extends 父类名 { }
2、特点:
(1)Java只支持单继承
(2)java中支持多层继承
3、访问权限规则
public>protected>默认>private
(1)public任意访问
(2)protected同个包下任意访问,不同包下子类可以访问
(3)默认权限只能在同一包下任意访问
(4)private只能在当前类访问
4、继承的好处
(1)提高了代码的复用性 (多个类相同的成员可以放到同一个类中)
(2)提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
5、继承的弊端
类与类之间产生了 关系,类的耦合性增强,如果父类发生了改变,子类实现也就会随之发生变化
6、应用场景
类与类之间存在is…A关系(比如:猫和狗是动物的一种)
7、方法重写注意事项
(1)父类中私有的东西不能被重写
(2)父类中静态方法不能被子类重写
(3)子类重写时,访问权限必须大于等于父类
8、初始化顺序
子类初始化的时候后一定先初始化父类
9、继承规则
在继承关系中可以继承成员变量和成员方法,但是不能继承构造函数。子类初始化的时候一定要先初始化父类,在每个子类构造函数的 第一条语句添加super(…)(必须是第一条语句)
super关键字
1、this&super
this:代表当前对象的而引用
super:代表父类存储空间的标识
2、this&super访问成员变量
this.成员变量:访问本类成员变量
super.成员变量:访问父类成员变量
3、this&super访问成员方法
this.成员方法:访问本类成员方法
super.成员方法:访问父类成员方法
4、构造方法
this(…):访问本类构造方法
super(…):访问父类构造方法
抽象类
1、特点:
(1)抽象类和抽象方法必须使用abstract关键字修饰
(2)抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
(3)抽象类无法实例化
(4)抽象类可以有构造方法并不服务于抽象类创造对象,抽象类无法创造对象,他的作用只是为了帮助实现类创造对象)
(5)抽象类的子类要么重写抽象类中的所有抽象方法,要么自己本身就是抽象类
2、应用场景
在抽取子类共性 时,有些方法是在父类中没有具体实现的,也就是说某些方法,不同的子类会有不同的实现,无法固定代码。
3、案例
案例需求
定义猫类(Cat)和狗类(Dog)
猫类成员方法:eat(猫吃鱼)drink(喝水…)
狗类成员方法:eat(狗吃肉)drink(喝水…)
实现步骤
1. 猫类和狗类中存在共性内容,应向上抽取出一个动物类(Animal)
2. 父类Animal中,无法将 eat 方法具体实现描述清楚,所以定义为抽象方法
3. 抽象方法需要存活在抽象类中,将Animal定义为抽象类
4. 让 Cat 和 Dog 分别继承 Animal,重写eat方法
5. 测试类中创建 Cat 和 Dog 对象,调用方法测试
代码实现
- 动物类
public abstract class Animal {
public void drink(){
System.out.println("喝水");
}
public Animal(){
}
public abstract void eat();
}
- 猫类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
- 狗类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
- 测试类
public static void main(String[] args) {
Dog d = new Dog();
d.eat();
d.drink();
Cat c = new Cat();
c.drink();
c.eat();
//Animal a = new Animal();
//a.eat();
}
final关键字
1、可以修饰方法、变量、类
2、特点:
(1)被final修饰的方法不能被子类重写
(2)被final修饰的变量在第一次赋值之后就不能被赋值了,就变成了一个常量(常量命名:如果是一个单词就所有字母大写,如果是多个单词,仍然是所有字母大写,但是单词之间添加下划线)
(final修饰基本数据类型时,代表的是其值不能更改,修饰引用变量时,代表的是其引用的地址值不能更改,但是对象的属性值可以更改)
(final修饰成员变量的时候,要注意初始化时机,第一个就是在变量创建的时候给值,第二个就是在构造函数结束之前进行赋值)
(3)被final修饰的类就不能被继承了 ,也就是不能有子类
代码块
1、局部代码块
在方法中定义,限定变量生命周期
2、构造代码块
在类中方法外定义,每次构造方法执行的时候都会执行一次该代码,并且会在构造方法之前执行。作用:将多个构造方法中相同的代码抽取到构造代码块中,提高代码复用率
3、静态代码块
在类中方法外定义,使用static关键字进行修饰,随着类的加载而加载,并且只会执行一次。作用:在类加载的时候进行一些数据初始化的操作