封装、继承、多态
1. 封装
1.1 介绍
封装(encapsulation)就是把抽象出的数据 [属性] 和对数据的操作 [方法] 封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作 [方法] ,才能对数据进行操作。
1.2 封装的理解和好处
1) 隐藏实现细节:方法(连接数据库)<--调用(传入参数..)
2) 可以对数据进行验证,保证安全合理
Person {name, age}
Person p = new Person();
p.name = "jack" ;
p.age = 1200;
1.3 封装的实现步骤 (三步)
1) 将属性进行私有化private【不能直接修改属性】
2) 提供一个公共的(public) set 方法,用于对属性判断并赋值
public void setXxx (类型参数名)0/Xx表示某个属性
//加入数据验证的业务逻辑
属性 = 参数名;
}
3) 提供一个公共的(public)get方法,用于获取属性的值
public 数据类型 getXxx() { //权限判断,Xx某个属性
return xx;
}
案例练习:
创建程序,在其中定义两个类: Account和AccountTest类 体会Java的封装性。
1. Account类要求具有属性: 姓名(长度为2位3位或4位)、余额(必须>20)、密码(必须是六位),如果不满足,则给出提示信息,并给默认值(程序员自己定)
2. 通过setXxx的方法给Account的属性赋值。
3. 在AccountTest中测试
package com.zakedu.encap;
/**
*创建程序,在其中定义两个类:Account和AccountTest类体会Java的封装性。
*Account类要求具有属性:姓名(长度为2位3位或4位)、余额(必须>20)、
*密码(必须是六位),如果不满足,则给出提示信息,并给默认值(程序员自己定)
*通过setXxx的方法给Account的属性赋值。
*在AccountTest中测试
*/
public class Account {
//为了封装,将3个属性设置为private
private String name;
private double balance;
private String pwd;
//提供两个构造器
public Account() {
}
public Account(String name, double balance, String pwd) {
this.setName(name);
this.setBalance(balance);
this.setPwd(pwd);
}
public String getName() {
return name;
}
//姓名(长度为2位3位或4位)
public void setName(String name) {
if (name.length() >= 2 && name.length() <= 4) {
this.name = name;
} else {
System.out.println("姓名要求(长度为 2 位 3 位或4位),默认值 无名");
this.name = "无名";
}}
public double getBalance() {
return balance;
}
//余额(必须>20)
public void setBalance(double balance) {
if (balance > 20) {
this.balance = balance;
} else {
System.out.println("余额(必须>20) 默认为 0");
} }
public String getPwd() {
return pwd;
}
//密码(必须是六位)
public void setPwd(String pwd) {
if (pwd.length() == 6) {
this.pwd = pwd;
}else{
System.out.println("密码(必须是六位)默认密码为000000");
this.pwd="000000";
}
}
//显示账号信息
public void showInfo(){
//可以增加权限的校验
System.out.println("账号信息name="+name+"余额="+balance+"密码"+pwd);
// if(){
// System.out.println("账号信息name="+name+"余额="+balance+"密码");
// }else{
// System.out.println("你无权查看...");
// }
} }
package com.zakedu.encap;
public class TestAccount{
public static void main(String[]args){
//创建Account
Account account =new Account();
account.setName("jack");
account.setBalance(60);
account.setPwd("123456");
account.showInfo();
} }
2. 继承
2.1 继承基本介绍
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。
2.2 继承的基本语法
继承给编程带来的便利:
1) 代码的复用性提高了 2) 代码的扩展性和维护性提高了
2.3 继承的细节问题
1) 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访 问,要通过父类提供公共的方法去访问
2) 子类必须调用父类的构造器,完成父类的初始化
3) 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无 参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
4) 如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表)
5) super在使用时,必须放在构造器第一行 (super只能在构造器中使用)
6) super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
7) java所有类都是Object类的子类,Object是所有类的基类.
8) 父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)
9) 子类最多只能继承一个父类(指直接继承),即java中是单继承机制。
10) 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系
2.4 继承的本质分析:
案例:
public class ExtendsTheory {
public static void main(String[] args) {
Son son = new Son();//内存的布局
//?-> 这时请大家注意,要按照查找关系来返回信息
//(1) 首先看子类是否有该属性
//(2) 如果子类有这个属性,并且可以访问,则返回信息
//(3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息..)
//(4) 如果父类没有就按照(3)的规则,继续找上级父类,直到Object...
System.out.println(son.name);//返回就是大头儿子
//System.o