Java学习笔记13.——面向对象进阶之继承
文章目录
前言
Java中三大特性,封装,继承,多态。
之前学了封装的知识点,对象代表什么,就得封装对应的数据,并提供封装数据对应的行为。
今天学习继承的知识点。
一、继承
1.继承是什么?
假设
当学生类中有姓名属性,性别属性,年龄属性,学习方法,吃饭方法,set/get方法
当老师类中有姓名属性,性别属性,年龄属性,教书方法,吃饭方法,set/get方法
如果自己编写会发现代码重复度太高了,这样不利于节省时间。
这时候就可以设计一种东西,把重复的代码提出来,然后去继承这些重复的代码,并添加上不重复的方法。
假设提出来的公共代码有姓名属性,性别属性,年龄属性,吃饭方法,set/get方法
Java中使用extends关键字来实现继承
具体使用情况如下:
public class Student extends Person{
}
这时候Student类之间继承了Person中的所有属性和方法,并且Student类中还可以加上学生的学习方法。
此时的学生类就是子类(派生类),Person就是父类(基类或超类)
2.继承的好处
1.父类中的都是重复性高的属性和方法,子类继承可以提高代码的复用性
2.子类可以在父类上增加其他功能,使子类更加强大
3.什么时候使用继承
当类与类之间具有共性(相同)代码时,且满足子类是父类的一种东西,就可以使用继承来优化代码。
比如学生类满足Person(人类)类,老师也满足人类就可以使用。
如果学生有id,名字,成绩和手机有id,名字,价格。虽然id,名字是相同的,但是类不属于同一个东西。学生是人,手机是商品不能混为一谈这种就不能使用继承。
4.继承的特点
Java只支持单继承,不支持多继承,但支持多层继承
只支持单继承:一个子类只能有一个父类,一个儿子只能有一个爸爸
不支持多继承:一个子类只能有一个父类,不能有多个父类。一个儿子不能有多个父亲
支持多层继承:一个子类继承了父类,该父类又继承了一个类。这里子类和父类2的关系还是父子类关系。
但是不代表没有继承的类就不是子类了。
每一个类都间接或直接的基础object类。
这是由虚拟机进行的,如果该类没有被继承就会继承object类,那继承了的类就属于间接继承object类,因为父类会直接继承object类。
注意:父类的私有修饰的不能被访问
因为父亲的私房钱你不能使用。
所以子类能继承父类中非私有的属性和方法。
5.继承练习
题目
现在有四种动物:布偶猫、中国狸花猫、哈士奇、泰迪。暂时不考虑属性,只要考虑行为。
请按照继承的思想特点进行继承体系的设计。
四种动物分别有以下的行为:
布偶猫:吃饭、喝水、抓老鼠中国狸花猫:吃饭、喝水、抓老鼠哈士奇:吃饭、喝水、看家、拆家泰迪:吃饭、喝水、看家、蹭一蹭
第一步分析
从下往上分析
第二步敲代码,从上往下
package a02StaticDemo3.cat;
public class Test {
public static void main(String[] args) {
Teddy teddy = new Teddy();
teddy.eat();
teddy.drink();
teddy.LookingHome();
teddy.sajiao();
System.out.println("-------------------------");
buou buou = new buou();
buou.eat();
buou.drink();
buou.CatingMice();
}
}
6.子类到底能继承父类中的哪些内容?
一个类中包含三个部分
构造方法 | 非私有 不能继承 | 私有private 不能继承 |
---|---|---|
成员变量 | 非私有 能继承 | 私有private 能继承 |
成员方法 | 非私有 能继承 | 私有private 不能继承 |
1.构造方法
一旦构造方法可以继承,那么就违背了构造方法的定义所以不管私有不私有,构造方法都不难继承
2.成员变量
虽然成员变量私有的可以继承,但是就像上了锁的箱子不能直接使用。
钥匙就是get/set方法
3.成员方法
我这是在给我自己做笔记,直接粘贴复制。
累加虚方法,实际上就是一个空间装下这些方法方便使用。所有的设计不过都是为了更好的使用,如果有冗余那就是设计得不够完美或者有东西没有考虑完全。
成员方法里面的方法里:
非private 非static 非final 修饰的方法就可以进入虚方发表中。
阿伟老师的PPT做得太好了,爱了爱了。
加载字节码文件时发现zi类还有父类就加载fu字节码文件,因为所有没有继承的类都继承object类,所以object类进入方法区。堆内容中,右边是子类的成员变量,左边是父类的成员变量。
二、特点
1.成员变量的特点
特点:就近原则
先在局部变量寻找,本类寻找,然后父类逐层往上
如果成员变量同名,那么就可以这样。
package a02StaticDemo3.Test;
public class Test2 {
public static void main(String[] args) {
Zi z = new Zi();
z.Name();
}
}
class Ye{
String name = "ye";
}
class Fu2 extends Ye{
// String name = "Fu";
}
class Zi extends Fu2{
String name = "Zi";
public void Name(){
String name = "ZiShow";
System.out.println(name);//ZiShow
System.out.println(this.name);//Zi
System.out.println(super.name);//ye,如果Fu2没被注释这里输出的就是Fu
}
}
super只能代表父类(间接,直接),不能叠加super比如
super.super.name;
2.成员方法的特点
特点:就近原则
public class Test3 {
public static void main(String[] args) {
OverseasStudent s = new OverseasStudent();
s.eat();
s.drink();
}
}
class Person{
public void eat(){
System.out.println("吃米饭,用筷子");
}
public void drink(){
System.out.println("喝水");
}
}
class OverseasStudent