@TOC
一. 封装
1.定义
封装(Encapsulation)
把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法)才能对数据进行操作访问
生活中电视机遥控器就是一个封装的产物
2.好处
①隐藏实现的细节
②对数据进行验证,保证安全合理
3.实现步骤
将属性私有化(private)——>提供一个公共的(public)set 方法用于对属性判断赋值——>提供一个公共的get方法获得属性值
4.代码实现
案例引入:
1.Account类要求具有属性:姓名(长度为2位3位或4位)、余额(必须>20).
密码(必须是六位),如果不满足,则给出提示信息,并给默认值
2通过setXxx的方法给Account的属性赋值。
class Account{
public String name; //姓名
private double leftmoney; //余额
private String password; //密码
public String getName() {
return name;
}
public void setName(String name) {
if (name.length()==2||name.length()==3||name.length()==4) {
//名字是2,3,4个字
this.name = name;
}else {
System.out.println("输入的名字有误");
}
}
public double getleftmoney() {
return leftmoney;
}
public void setleftmoney(double leftmoney) {
if(leftmoney>20) { //余额大于20
this.leftmoney = leftmoney;
}else {
System.out.println("您输入的余额有误");
}
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
if (password.length()==6) { //密码必须是六位
this.password = password;
}else{
System.out.println("输入的密码不符合要求");
}
}
public String outmsg(){
//可以增加权限的校验
return "姓名"+name+"余额"+leftmoney+"密码"+password;
}
}
5.总结
在以上set方法中对姓名,余额,密码进行的操作就是封装的一种体现,由于使用的是get方法获得的属性所以起到了隐藏实现细节的功能,对以上属性值的逻辑判定与限定实现了对数据进行验证,保证合理安全的功能
二. 继承
继承是面向对象最显著的一个特性
1.定义
继承(extends) extends 关键字的意思是“扩展”。子类是父类的扩展。
多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同属性和方法,所有子类不需要重新定义,通过extends声明继承父类即可
2.好处
①代码复用性提高
②代码扩展性和维护性提高
3.实现步骤
[修饰符列表] class 类名 extends 父类名{
类体 = 属性 + 方法
}
4.代码实现
案例引入:
编写Computer类,包含CPU、内存、硬盘等属性,getDetails Computer的详细信息
编写PC子类,继承Computer类,添加特有属性 品牌brand
编写NotePad子类,继承Computer类,添加特有属性color
编写Test类,在main方法中创建PC和NotePad对象,分别给对象中特有的属性赋值,
以及从Computer类继承的属性赋值,并使用方法并打印输出信息。
class Computer {
String CPU;
String memory;
String hard_disk;
public Computer(String CPU, String memory, String hard_disk) {
this.CPU = CPU;
this.memory = memory;
this.hard_disk = hard_disk;
}
}
class PC extends Computer {
String brand;
//这里也体现:继承设计的基本思想,父类的构造器完成父类属性初始化
// 子类的构造器完成子类属性初始化
public PC(String CPU, String memory, String hard_disk, String brand) {
super(CPU, memory, hard_disk);
this.brand = brand;
}
public void outmsg01() {
System.out.println("CPU为" + CPU + "内存为" + memory + "硬盘为" + hard_disk + "品牌为" + brand);
}
}
class NotePad extends Computer {
String color;
//构造器完成子类属性初始化
public NotePad(String CPU, String memory, String hard_disk, String color) {
super(CPU, memory, hard_disk);
this.color = color;
}
public void outmsg02() {
System.out.println("CPU为" + CPU + "内存为" + memory + "硬盘为" + hard_disk + "颜色为" + color);
}
}
5.总结
子类PC和Notepad继承了父类computer的CPU,memory,hard_disk属性,以至于在对应的子类中不需要再声明属性,只需要引用即可,这极大地提高了代码的复用性!!
6.使用细节
①子类继承了父类所有的属性和方法,非私有属性和方法可以在子类直接访问,但是私有属性和方法不可以在子类直接访问,要通过父类提供的公共方法访问
②子类必须调用父类的构造器完成父类初始化
③当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会调用父类的无参构造器,如果父类没有无参构造器,则必须在子类的构造器中使用super关键字去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不会通过
④如果希望指定去调用父类构造器,则显式的调用一下,super(形参列表)
⑤super关键字必须放在第一行,只能在构造器中使用
⑥super()和this()都只能放在构造器的第一行,因此构造器中智能有一种
⑦所有类都是object的子类
⑧父类构造器的调用不限于直接父类!将一直往上追溯到object类
⑨子类最多只能继承一个父类,Java中是单继承机制
⑩不能滥用继承,子类和父类之间必须满足逻辑关系
三. 继承的本质
当我们加载子类时他会按照就近原则访问加载相应的父类