八、面向对象三大特性

1. 封装:

  1. 概念:尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限。
    2. private的访问修饰符,修饰属性,达到本类可见的效果。
    3. get/set方法是外界访问私有属性的唯一通道,方法内部可对数据进行过滤。(可在set方法中添加过滤条件)
    4. 提供公共访问方法,以保证数据可以正常录入。
public class User {
    
    
	private String cardNo;
	private String password;
	private String username;
	private String identifyCard;
	private String phone;
	private double balance;
	
	public User() {
    
    }

	public User(String cardNo, String password, String username, String identifyCard, String phone, double balance) {
    
    
		this.cardNo = cardNo;
		this.password = password;
		this.username = username;
		this.identifyCard = identifyCard;
		this.phone = phone;
		this.balance = balance;
	}

	public String getCardNo() {
    
    
		return cardNo;
	}

	public void setCardNo(String cardNo) {
    
    
		this.cardNo = cardNo;
	}

	public String getPassword() {
    
    
		return password;
	}

	public void setPassword(String password) {
    
    
		this.password = password;
	}

	public String getUsername() {
    
    
		return username;
	}

	public void setUsername(String username) {
    
    
		this.username = username;
	}

	public String getIdentifyCard() {
    
    
		return identifyCard;
	}

	public void setIdentifyCard(String identifyCard) {
    
    
		this.identifyCard = identifyCard;
	}

	public String getPhone() {
    
    
		return phone;
	}

	public void setPhone(String phone) {
    
    
		this.phone = phone;
	}

	public double getBalance() {
    
    
		return balance;
	}

	public void setBalance(double balance) {
    
    
		this.balance = balance;
	}

}

2. 继承:

I. 程序中的继承,是类与类之间特征和行为的一种赠与或获得。
II. 类与类之间必须满足“is a”的关系。
III. 父类的选择:功能越精细,重合点越多的,越接近直接父类。
IV. 父类的抽象:根据程序需要使用到的多个具体类,进行共性的提取,进而定义父类。
V. 在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用。
VI. 产生继承关系之后,子类可以使用父类中的属性和方法,也可定义子类独有的属性和方法。
VII. 完整的子类 = 父类共性 + 子类独有
VIII. 好处:既提高代码的复用性,又提高代码的可扩展性。
IX. Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加。
X. 访问修饰符://其他:不在一个包中,还没有继承关系

在这里插入图片描述
在这里插入图片描述

一个包中是不可以有同名类的!
XI. 不可继承:
1). 父类的构造方法,子类不可继承。
2). 父类中由private修饰的成员,不可继承(不可见)。
3). 父类中由default修饰的成员,子类不在同包时,不可继承(不可见)。
XII. 方法的覆盖/重写(Override)
1). 当父类提供的方法无法满足子类需求时,可以在子类中定义和父类相同的方法进行覆盖。
2). 要求:
a). 方法名、参数表、返回值,必须与父类完全相同。(除了修饰符其他都要完全一样才是覆盖)
b). 访问修饰符应与父类相同或比父类更宽泛。
3). 执行机制:子类覆盖父类方法后,优先执行子类覆盖后的方法版本。

3.super关键字:

I. 第一种用法:在子类中,可以通过" super. "的形式访问父类的属性和方法,可解决一定的属性遮蔽、方法覆盖后的父类成员调用问题。
在这里插入图片描述
在这里插入图片描述
II. 第二种用法:super() 表示在子类构造方法的首行,调用父类的无参构造方法。
在这里插入图片描述

4. 继承关系下的对象创建:

I. 继承关系下,构建子类对象时,会先构建父类对象。
II. 由“父类共性”+ “子类独有”组合成一个完整的子类对象。

5. 继承关系下的对象创建流程:(有点像递归)

I. 构建父类对象
II. 初始化自身属性
III. 执行自身构造方法中的逻辑代码
注意:
I. 如果子类构造方法中,没有显示定义super()或super(实参),则默认提供super()。
II. 同一个子类构造方法中,super()、this()不可同时存在。(因为super()和this()都要第一行)

6.多态:

I. 概念:父类引用指向子类对象,从而产生多种形态。
II. 构成多态的前提,二者之间必须具有直接或间接的继承关系,父类引用可指向子类对象,进而形成多态。
III. 父类引用仅可调用父类中所声明的属性和方法,不可调用子类独有的属性和方法。
在这里插入图片描述
在这里插入图片描述
IV. 多态两种应用场景:
1). 场景一:使用父类作为方法形参,实现多态需要子类重写run()方法
在这里插入图片描述
2). 场景二:使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。
用父类引用装子类,最后通过instanceof判断类型,拆箱为真实的子类
在这里插入图片描述在这里插入图片描述
V. 装箱和拆箱:
1). 装箱:父类引用中保存真实子类对象,称为向上转型(多态核心概念)。
Animal a = new Dog();
2). 拆箱:将父类应用中的真实子类对象,强转回子类本身类型,称为向下转型。
Animal a = new Dog();
Dog dog = (Dog) a;
3). 注意:向下转型时,如果父类引用中的子类对象的类型与目标类型不匹配,则会发生类型转换异常。java.lang.ClassCastException

VI. instanceof关键字:
1). 语法:父类引用 instanceof 类型(返回boolean类型的结果)
在这里插入图片描述
VII. 总结:
1). 多态的两种应用场景:
a). 使用父类作为方法形参,实现多态。
调用方法时,可传递的实参类型包括:本类型对象+其所有的子类对象。
b). 使用父类作为方法返回值,实现多态。
调用方法后,可得到的结果类型包括:本类型对象+其所有的子类对象。
2). 多态的作用:
a). 屏蔽子类间的差异。
b). 灵活、耦合度低。
时间与空间的平衡、效率与安全的平衡

猜你喜欢

转载自blog.csdn.net/sylvia_lily/article/details/114459285