面向对象Day02-继承
一、继承
1.1 生活中的继承
-
皇位继承 ------------------------ 儿子不需要打江山,可以直接坐江山
-
努尔哈赤 ---------------------东三省 做主的范围 东三省
-
皇太极-----------------------继承的努尔哈赤 可以直接对东三省做主 自己打下了内外蒙古 做主范围 东三省 + 内外蒙古
-
顺治 -------------------------继承了皇太极 可以直接对东三省+ 内外蒙古做主 自己打下了汉地十八省 做主范围 东三省 + 内外蒙 + 汉地十八省
-
康熙---------------------------继承顺治 可以直接对东三省 + 内外蒙 + 汉地十八省做主,自己打下了台湾,准格尔汗国 做主范围 东三省 + 内外蒙 + 汉地十八省 + 台湾 + 准格尔汗国
-
雍正 -------------------------- 继承康熙 做主范围 东三省 + 内外蒙 + 汉地十八省 + 台湾 + 准格尔汗国
-
乾隆 -------------------------继承雍正 直接做主 东三省 + 内外蒙 + 汉地十八省 + 台湾 + 准格尔汗国, 打下了新疆,加强了对西藏的管理 , 做主范围东三省 + 内外蒙 + 汉地十八省 + 台湾 + 准格尔汗国 + 新疆 + 西藏
子类可以操作父类中允许被操作的属性和方法,也可以操作自己独有的属性和方法
父类仅可以操作父类中允许被操作的属性和方法,不可以操作子类独有的属性和方法
-
-
财产继承 ------------------------- 儿子不需要挣家业,可以自由支配家业
-
工作继承 -------------------------- 儿子不需要找工作,可以直接上班领工资
1.2 Java中的继承
-
理解:如果一些类中的属性和方法是相同的,那么可以把这些类中相同的属性和方法提取到一个新的类中,然后利用extends关键字让原来的类和新类产生联系,这种联系称之为继承,而这个时候原来的类就是子类,也叫派生类; 新的类称之为父类,也叫基类或者超类
-
作用:提高代码复用性
-
通过extends关键字实现继承
-
超类/ 基类/父类: 共有的属性和方法
-
派生类/子类: 特有的属性和方法
-
可以访问
-
子类可以访问:父类的属性和方法 + 子类的属性和方法
-
父类可以访问: 只能访问父类的属性和方法,不能访问子类的属性和方法
-
-
具有传递性
-
注意事项
-
一个父类可以有多个子类,一个子类只能有一个父类 -----------------继承的单一性
-
通过继承,子类可以继承父类全部的数据域,但是只有一部分数据域对子类可见,所以子类也只能使用这一部分数据域
-
子类可以继承父类的全部非静态的属性和非静态的方法(包括私有的和公共的)<Java官方文档明确表明:父类私有属性和私有方法子类不能继承>
但是私有属性不能直接访问,可以通过get,set方法间接访问,私用方法不能直接调用,私有方法也不可以直接使用
-
子类可以直接使用父类非私有的属性和方法
-
-
-
优点
-
提高代码的复用性
-
提高安全性,避免方法产生混乱
-
统一结构
练习:
学生类:
成员属性:姓名,年龄,家庭住址,学号,班级
成员方法:学习,吃饭, 睡觉 说话
教师类:
成员属性:姓名,年龄,家庭住址,工资
成员方法:讲课,吃饭, 睡觉 说话
医生类:
成员属性:姓名,年龄,家庭住址,级别(title)
成员方法:做手术,吃饭, 睡觉 说话
is a
狗是一只宠物
猫是一只宠物
兔子是一只宠物
狗是一个人 ,
Person
Dog
Animal -
二、访问修饰符
-
使用范围
关键字 **本类中 同包类中 其他包子类 其他任意类中 public 可以 可以 可以 可以 protected 可以 可以 可以 默认的 可以 可以 private 可以 -
注意事项
-
权限修饰符的范围从大到小依次是: public > protected > 默认的 > private
-
需要注意的是,默认的权限修饰符只能在本类及同包类中使用,同包子类本质上依然是同包类
-
protected 在子类中可以使用指的是子类的对象可以访问父类的成员,但是在非同包子类中子类的对象可以访问父类的成员,但是父类的对象不能访问父类的成员
-
三、方法的重写
-
应用场景:子类可以继承父类中的方法,而不需要重新编写相同的方法,但是有时候子类并不想原封不动的继承父类的方法或者父类的方法不能满足子类的使用,此时子类需要将父类的方法做出一定的修改(修改方法体)这就需要使用到方法的重写,方法的重写也叫方法的覆盖。
-
概念:在父子类中存在方法签名(方法名+参数列表)完全一致的非静态方法,就构成了方法的重写(覆盖)
-
遵循原则:方法的重写要遵循“两同两小一大”原则
-
方法签名完全一致
-
如果父类中的返回值是基本数据类型/void/最终类(被final修饰)那么子类中要重写的方法的返回值类型必须一致(如果父类中的方法被private修饰的话,子类是无法继承这个方法的,即使子类重新定了这个方法,也不能叫重写)
-
如果父类的方法返回值类型是一个引用类型,子类方法的返回值类型是父类方法的返回值类型,或者是父类的返回值类型的子类类型
-
子类方法的访问修饰符的范围要大于等于父类的访问修饰符的权限范围
-
子类方法抛出的异常类型小于或等于父类方法抛出的异常范围
-
简要概括
-
两同
-
方法签名一致: 方法名相同,参数列表相同
-
-
两小
-
子类方法的返回值类型小于或等于父类方法的返回值类型
-
子类方法抛出的异常类型比父类方法抛出的异常类型小于或等于
-
-
一大
子类的访问修饰符权限大于等于父类
-
-
四、super 关键字
-
super关键在表示在子类中对父类对象的引用,可以看做是一个虚拟对象
-
在子类中可以通过super调用父类的非静态属性和非静态方法
-
在子类的构造方法中,可以通过super关键字调用父类中对应形式的构造犯法,如果不指定,默认调用服了中的无参构造
-
如果父类中提供了含参的构造方法,那么子类必须手动定义super()语句来调用父类中对应形式的含参构造
-
super()语句必须放在构造方法的第一行,所以super()语句不能和this()语句一起出现
五、补充
-
泛化: 从程序设计的角度而言叫做泛化,从代码实现的角度来说就叫继承,泛化就是继承。
-
继承要符合 is a 的关系
-
一个学生是一个人 对 class Student extends Persion{} 没问题
-
一个老师是一个人 对 class Teacher extends Person{} 没问题
-
一只猫是一个宠物 对 class Cat extends Pet{} 没问题
-
一个医生是一只宠物 不对 class Docter extends Pet{} 是不对的
-
-
继承是子类继承父类的成员变量和普通方法,不包括父类的构造方法,父类的构造方法是被子类通过super()来调用的,而不是继承的
笔试题
-
请介绍全局变量和局部变量的区别
参考答案
Java中的变量分为成员变量和局部变量,它们的区别如下:
成员变量:
-
定义范围:定义在类中
-
作用范围:整个类
-
内存位置:堆中, 堆会赋予初始值
-
生命周期:在对象被创建的时候被创建,在对象被销毁的时候被销毁
-
未被static修饰的成员变量也叫实例变量,它存储于对象所在的堆内存中,生命周期与对象相同;
-
被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。
局部变量:
-
定义范围:定义在方法中
-
作用范围:对应的方法或者语句块
-
内存位置:存储在栈中,不会默认初始化,需要手动赋值
-
生命周期:在方法被调用或者语句块执行的时候被创建,方法或语句块执行完毕即被销毁
注意事项
Java中没有真正的全局变量,面试官应该是出于其他语言的习惯说全局变量的,他的本意应该是指成员变量。
-
-
请介绍一下实例变量的默认值
参考答案
实例变量若为引用数据类型,其默认值一律为null。若为基本数据类型,其默认值如下:
-
byte:0
-
short:0
-
int:0
-
long:0L
-
float:0.0F
-
double:0.0
-
char:'\u0000'
-
boolean:false
注意事项
上述默认值规则适用于所有的成员变量,所以对于类变量也是适用的。
-
-
说一说你对Java访问权限的了解
参考答案
Java语言为我们提供了三种访问修饰符,即private、protected、public,在使用这些修饰符修饰目标时,一共可以形成四种访问权限,即private、default、protected、public,注意在不加任何修饰符时为default访问权限。
在修饰成员变量/成员方法时,该成员的四种访问权限的含义如下:
-
private:该成员可以被该类内部成员访问;
-
default:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问;
-
protected:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问,还可以被它的子类访问;
-
public:该成员可以被任意包下,任意类的成员进行访问。
在修饰类时,该类只有两种访问权限,对应的访问权限的含义如下:
-
default:该类可以被同一包下其他的类访问;
-
public:该类可以被任意包下,任意的类所访问。
-