我们都知道,java的三大特性,也就是面向对象的三大特性 :封装 继承 多态
封装分为属性的封装和方法的封装,那么封装的特性是什么的?为什么我们需要进行封装? 我们先看下面的例子
public class DepositCard {
String type;
String cardNumber;
String password;
public DepositCard(String type, String cardNumber, String password) {
super();
this.type = type;
this.cardNumber = cardNumber;
this.password = password;
}
}
public class TestCard {
public static void main(String[] args) {
DepositCard depositCard = new DepositCard("招商银行","60011.....","123456");
String pwd = depositCard.password;
System.out.println(pwd);
pwd = "111111";
System.out.println(pwd);
}
}
运行结果、
<pre name="code" class="java">123456
111111
上述代码,我们设计了一个银行储蓄卡类,它自身有一些,卡的种类,卡的账号,卡的密码这些特性,通过它的有参构造在创建实例的时候赋予这么属性。
程序运行 第一步,我们先通过有参构造创建了一个实例,创建的这张银行卡,是
招商银行
卡号为
60011.....
密码为
123456
,接下来直接修改了这张银行卡的密码,OK 从java语法来说没什么问题,但从咱们生活角度来看就有很大问题,对于一张银行卡来说,它的密码是不应该被随便访问和修改,像生活中哪怕我们要修改自己的银行卡密码,也需要去银行办理一些手续。所以在java 面向对象中解决这个问题,采用封装的特性,任何对象都有一个明确的边界,这个边界对对象内部一些属性和方法起到保护的作用
语法:
1.属性的封装
为属性增加 private (私有) 修饰符 ,指只能在本类内部使用; 在项目开发中,除非是像常量类 ,工具类 这些我们需要让它们全类共有的,一般的javaBean 我们都会加上private 并且提供get/set方法
public class DepositCard {
private String type;
private String cardNumber;
private String password;
public DepositCard(String type, String cardNumber, String password) {
super();
this.type = type;
this.cardNumber = cardNumber;
this.password = password;
}
/**
* 返回 #{bare_field_comment}
*
* @return #{bare_field_comment}
*/
public String getType() {
return type;
}
/**
* 设置 #{bare_field_comment}
*
* @param type
* #{bare_field_comment}
*/
public void setType(String type) {
this.type = type;
}
/**
* 返回 #{bare_field_comment}
*
* @return #{bare_field_comment}
*/
public String getCardNumber() {
return cardNumber;
}
/**
* 设置 #{bare_field_comment}
*
* @param cardNumber
* #{bare_field_comment}
*/
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
/**
* 返回 #{bare_field_comment}
*
* @return #{bare_field_comment}
*/
public String getPassword() {
return password;
}
/**
* 设置 #{bare_field_comment}
*
* @param password
* #{bare_field_comment}
*/
public void setPassword(String password) {
this.password = password;
}
}
我们通过get() 方法来获取password属性,通过set()方法来设置属性
public class TestCard {
public static void main(String[] args) {
DepositCard depositCard = new DepositCard("招商银行","60011.....","123456");
System.out.println(depositCard.getPassword());
depositCard.setPassword("111111");
System.out.println(depositCard.getPassword());
}
}
这个就可以来控制他人对对象的访问,例如,我们要求密码只能查看不能修改,只需提供get() 方法不提供set() 方法来保证 "只读",或者我们要求修改的密码必须为6位,可以在set() 方法做手脚
public void setPassword(String password) {
if(password.length()!=6){
throw new RuntimeException("密码长度必须为6");
}
this.password = password;
}
public class TestCard {
public static void main(String[] args) {
DepositCard depositCard = new DepositCard("招商银行","60011.....","123456");
System.out.println(depositCard.getPassword());
try {
depositCard.setPassword("1111111");
} catch (Exception e) {
System.out.println("设置密码失败 : "+e.getMessage());
}
System.out.println(depositCard.getPassword());
}
}
运行结果:
123456
设置密码失败 : 密码长度必须为6
123456
2.方法的封装
也是在需要封装的方法上增加 private修饰符,例如我们设计一个teacher类
public class Teacher {
public void teaching(){
System.out.println("提供教学~~~~~~");
}
private void eat(){
System.out.println("吃东西~~~~~~~~");
}
}
对外暴露了教学的方法,是提供给别人调用的,eat() 不需要暴露出去只是自己使用,在项目中,像一个类中 抽出来的公用代码,我们一般直接private 修饰,不对外暴露。
注:private修饰的方法是不能被继承的