Java是一门面向对象的高级语言,在学习Java的过程中要深入理解和体会其面向对象的思想本质,而今天要讲的就是面向对象三大特征中的继承与多态。
继承
一、概述
继承可以把子类中重复的代码抽取到父类中,减少代码冗余。继承后子类可以得到父类的属性和行为,也可在其基础上新增其他功能而变得更强大
格式:public class 子类 extends 父类 {}
形象化理解:例如我们要创建一个猫类和一个狗类,这两个类中都有年龄、颜色等成员变量,也有吃饭,玩耍等方法,那么我们就可以把这些重复的代码抽取到同一个父类中,也就是创建一个父类动物类,其中包含年龄、颜色等成员变量和吃饭,玩耍等方法,然后让猫类和狗类继承动物类这个父类即可。
父类动物类的创建
public class Animal {
private int age;
private String color;
public Animal() {
}
public Animal(int age, String color) {
this.age = age;
this.color = color;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void eat(String something){
System.out.println("动物在吃"+something);
}
public void play(String something){System.out.println("动物在玩"+something);}
}
猫类和狗类作为子类继承动物类这个父类
public class Dog extends Animal{
public Dog() {
}
public Dog(int age, String color) {
super(age, color);
}
@Override
public void eat(String something) {
System.out.println("狗在吃狗粮");
}
@Override
public void play(String something){
System.out.println("狗在玩飞盘");
}
}
public class Cat extends Animal{
public Cat() {
}
public Cat(int age, String color) {
super(age, color);
}
@Override
public void eat(String something) {
System.out.println("猫在吃猫粮");
}
@Override
public void play(String something) {
System.out.println("猫在玩毛线球");
}
}
初次看到这一堆代码难免有些心慌,但是不要紧,下面我们边讲边演示
二、继承的要求
1、Java只能单继承(一个子类继承一个父类),不能多继承但可以多层继承(可以继承父类后再被其他子类继承)
2、Java中所有类都直接或间接继承Object类
3、子类只能访问父类中非私有的成员(私有成员可以通过父类中的getter和setter间接访问)
例子中私有化成员变量都提供相应的setter和getter方法
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
三、继承的内容
1、父类的构造方法都不能被继承,所以子类要重写其自身的构造方法
例子中猫类和狗类中都写了其对应的空参构造和有参构造
public Dog() {
}
public Dog(int age, String color) {
super(age, color);
}
public Cat() {
}
public Cat(int age, String color) {
super(age, color);
}
2、父类虚方法表(非private,static,final)中的成员方法可以被子类继承
例子中的这些方法在虚方法表中,可以被子类继承
public void eat(String something){
System.out.println("动物在吃"+something);
}
public void play(String something){System.out.println("动物在玩"+something);}
四、内存的角度理解继承
1、方法区会加载父类的字节码文件
2、创建子类对象时堆中会有一部分空间存储父类成员变量(子类的成员变量与父类一致,但存储的内容可能各不相同)
五、继承的特点
1、成员变量的访问特点
就近原则:先在局部位置找,找不到再去本类成员位置找,还找不到再去父类成员位置找
this关键字:去本类成员位置找(找不到再逐级往上找)
super关键字:去父类成员位置找(找不到再逐级往上找)
2、成员方法的访问特点
方法的重写:子类继承父类虚方法表中的方法后可以重写方法,重写后的方法会覆盖掉继承过来的虚方法表中对应的方法,也就是子类对应的方法改变,父类对应的方法不变
重写建议:尽量和父类保持一致(名称,形参列表,访问权限,返回值等)
3、this,super关键字总结
多态
多态就是同类型的对象,表现出的不同形态
格式:父类类型 对象名称 = 子类对象;
要求:1、有继承关系
2、有父类引用指向子类对象
3、有方法重写
我们可以在测试类中利用多态创建一个对象
public class test {
Animal animal=new Cat(11,"white");
}
特点
1、变量调用:编译看左边,运行也看左边
编译看左边:javac编译代码时会看左边父类中有没有这个变量,如果有则编译成功,没有则失败
运行看右边:java运行代码的时候实际获取的是左边父类中成员变量的值
如图所示,实际获取的是 animal中的变量信息
public class test {
public static void main(String[] args) {
Animal animal=new Animal(11,"white");
Animal a=new Cat(14,"red");
System.out.println(a.getAge());//11
System.out.println(a.getColor());//white
}
}
2、方法调用:编译看左边,运行看右边
编译看左边:同上
运行看右边:java运行代码时实际上运行的是子类中的方法
如图所示,实际运行的是cat类中的方法
public class test {
public static void main(String[] args) {
Animal animal=new Animal(11,"white");
Animal a=new Cat(14,"red");
System.out.println(a.getAge());//11
System.out.println(a.getColor());//white
a.play("毛线球");//猫在玩毛线球
}
}
优势与弊端分析
优势:1、在多态的形式下,右边对象可以实现解耦合,便于扩展和维护。
2、定义方法时,父类对象作为参数可以接收所有子类对象,体现便利
弊端: 不能调用子类的特有功能(调用成员方法时,编译看左边,如果左边父类没有这个方法则会直接报错)
解决方法:变回子类类型
本文详细介绍了Java中的继承机制,包括概念、语法、继承的要求、内容、内存影响以及多态性。通过实例演示了如何创建父类和子类,展示了继承中成员变量和方法的访问规则,以及多态在实际应用中的优势和局限性。
7349

被折叠的 条评论
为什么被折叠?



