Java入门(七)
面向对象-继承
多个类中存在相同属性和行为时,将这些内容抽取道单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可
继承的好处:
- 提高了代码的复用性
- 提高了代码的维护性
- 让类与类之间产生了关系,是多态的前提
继承的弊端:
- 让类与类之间产生了关系,使得耦合增强了
- 开发原则:高内聚(自己完成某件事的能力),低耦合(类与类的关系)
⚠️ Java类中只支持单继承,不支持多继承,可以通过多层继承来实现继承多个类
简单的学生类继承人类:
public class Student extends Person{
public void study(){
System.out.print("study");
}
}
Java继承中成员变量的特点:成员变量名称相等的时候,在子类方法中访问变量的优先级顺序为就近原则:
- 在方法的局部范围找
- 在子类的成员范围找
- 在父类的成员范围找
Super关键字
public class Student extends Person{
public int age = 20;
public void printAge(){
int age = 10;
System.out.println(age);
System.out.println(this.age);
System.out.println(super.age);
}
}
this代表本类对象的引用而super代表父类的存储空间,也可以理解为代表父类对象的引用
继承中的构造方法
子类构造方法继承父类前都会先执行父亲无参构造方法,因为子类继承父类会继承父类的非私有成员,在子类初始化之前,一定要完成父类数据的初始化,⚠️ 在子类的构造方法中,默认第一行有一条语句:Super() 如果父类中没有无参构造方法,推荐在父类中手动添加无参构造方法,也可以通过super去访问父类的带参构造方法
继承中成员方法的特点
子类方法和父类方法调用的声明不一样,执行子类中的方法,所以首先在子类中找,没有的化然后再去父类中找
方法重写
子类和父类一样的方法声明的情况
当子类需要父类的功能,而功能主体子类又有自己的特有内容的时候,就考虑使用方法重写,这样既保证了父亲的功能,还添加了子类的特有内容
public class Student extends Person{
@Override
public void printAge(){
System.out.println("20");
super.printAge();
}
}
可以用@Override表明该方法是重写父类的方法
⚠️ 父类私有方法不能被重写,子类重写父类方法时,访问权限不能更低 private < 默认修饰符 < public, 比如父类用public,子类只能用public,父类用默认修饰符,子类可以用public和默认修饰符
继承练习
通过有参和无参两种方法给学生对象赋值
学生有参构造的时候用super调用父类构造
public class Student extends Person{
public Student(){}
public Student(String name, int age){
super(name, age);
}
public void study(){
System.out.println("study");
}
}
class hello {
public static void main(String[] args) {
Student sc = new Student();
sc.setName("TIM");
sc.study();
System.out.println(sc.getName());
Student s = new Student("Jerry",20);
System.out.println(s.getName());
}
}
多态
同一个对象在不同时刻体现出来的不同状体
Java多态的前提
- 有继承关系
- 有方法重写
- 有父类引用指向子类对象
比如Animal a = new Cat();
多态成员访问特点:
成员变量:编译看左边,执行看左边,比如 a.weight 或者 a.age 看的都是 Animal 类中的成员变量
成员方法:编译看左边,执行看右边,比如 a.eat() 用的是 Cat 类的成员方法,但是检查的时候检查Animal类中是否有重写
为什么会这样子呢? 因为成员方法有重写,而变量没有
多态的好处:
提高了程序的扩展性
多态的弊端:
不能使用子类的特有功能
多态中的转型
向上转型:由子到父,父类引用指向子类对象,比如多态中 Animal a = new Cat()
向下转型:从父到子,父类引用转为子类对象
由于多态的弊端导致了无法访问子类特有的方法,如果这时候 Cat c = new Cat() 虽然可以访问子类特有方法了,但是内存中会存在两个Cat对象,这时候就要想办法把多态的猫还原,就要使用多态的转型了,父类引用转为子类对象
Cat c = (Cat) a;
类型转换内存模型
本文地址:https://blog.csdn.net/fang19970714/article/details/114266097