百知教育学习 - 胡鑫喆 - 面向对象的三大特性
一、封装
-
概念:尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限
-
访问修饰符:private(可将属性修饰为私有,仅本类可见)
-
公共访问方法: get/set
-
public String getPassword(){
return Password;
}
public void setPassword(String Password){
if(Password !=6) return false; // 可在set方法里设置规则
this.Password=Password;
}
*
-
二、继承
-
程序中的继承是类与类特征和行为的一种赠与或获得
-
两个类之间的继承关系,必须满足**“is a”**的关系 子类 is a 父类 一般—特殊
-
-
单继承(extends): 一个类只能有一个直接父类
-
父类的哪些属性和方法能继承给子类<----> 子类能访问父类的哪些属性和方法?
访问修饰符 访问范围 继承性
private 本类内部 不可继承 私有的
(default) 本类+同包 同包子类可以继承 默认的
protected 本类+同包+子类 可以继承 受保护的
public 公开 可以继承 公开的
- 构造方法不可继承
-
组合/聚合复用原则 :对于违反里氏代换原则的两个类,由于不存在 is a关系,所以不能定义继承,可以用组合的方式实现类的代码复用
-
class PersonA{
public void teachJava(){
}
public void Rob(){
}
}
你想让PersonB有teachJava的方法,但是你不能让B继承A,如果继承的话,B也就有A的rob方法。class PersonB{
不能仅仅为了调用方法就继承,继承必须满足is a的关系PersonA personA=new PersonA();
这个时候你可以用PersonA一个对象,通过这个对象调用A的方法personA.teachJava();
}
-
-
方法的覆盖override : 子类用特殊的方法实现,替换掉父类继承给它的方法实现
- 语法 :方法名相同,参数表相同,返回值类型相同。如子类中的
public void eat(int a){}
与父类public void eat(){}
属于重载
- 语法 :方法名相同,参数表相同,返回值类型相同。如子类中的
-
对象的构造过程
- 1.分配空间
- 2.构造父类对象
- 3.初始化本类属性
- 4.调用本类构造方法
- A-----B-----C
- 1.分配空间
- 2.初始化A属性
- 3.调用A构造方法
- 4.初始化B属性
- 5.调用B构造方法
- 6.初始化C属性
- 7.调用C构造方法
-
super
-
super(); 用在构造方法中,指明调用父类哪个构造方法,必须出现在构造方法的第一行
如果一个构造方法的第一行不是super(…),也不是this(…)默认代码为super();
-
语法上并不要求一个类必须要有一个无参的构造器,但是在编程习惯上建议写上
-
-
super引用 :引用 指向父类对象
三、多态
-
生活中的多态
-
程序中的多态
-
多态中的方法覆盖
-
多态的应用
-
多态: 子类对象可以赋值给父类引用
-
1.只能对引用调用 其引用类型中声明的方法
-
2.运行时,根据对象实际类型,调用子类覆盖之后的方法
-
3.对象类型不变 强制类型转换,用于父类引用赋值给子类引用,无法改变对象类型
-
引用 instanceof 类名 “判断引用中的对象 是不是 类名” 用作在强制类型转换之前进行类型判断,避免类型转换异常
-
举例 : 类A有 m1(); m2(); 方法 类B是类A的子类 类B有 m2(); m3();方法
A a=new B();
a.m1(); 调用的是类A的
a.m2(); 调用的是类B的
a.m3(); 调用不成
但是 B b =(B)a; 编译没问题 但是运行出错
if( a instanceof B){
B b=(B) a; 引用间赋值是地址赋值,两个引用将共同指向同一对象
b.m3();
}
-
-
-
多态的作用 :把不同子类的对象,统一看做是父类对象来处理,屏蔽了不同子类的差异 ----》通用性
多态用在参数上 m(A a): m方法允许A类或A的某个子类对象作为实参
多态用在返回值上 A m() : m方法返回的是A类或A的某个子类对象
-
覆盖与重载的区别
- 重载可能发生在本类,也可能发生在父子类。重载要求1.方法名相同2.参数表不同,其他的不做要求(如返回值类型)
- 覆盖一定是在父子类,1.修饰符相同或更宽,2.返回值类型相同或者是子类,3.方法名相同,4.参数表相同,5.抛出的异常相同或更少。