訪問修飾符和封裝
2023-04-12
1. 訪問修飾符
1.1 基本介紹 278
java 提供四種訪問控制修飾符號,用于控制方法和屬性(成員變量)的訪問權限(范圍):
1) 公開級別:用 public 修飾,對外公開
2) 受保護級別:用 protected 修飾,對子類和同一個包中的類公開
3) 默認級別:沒有修飾符號,向同一個包的類公開.
4) 私有級別:用 private 修飾,只有類本身可以訪問,不對外公開.

1.2 注意事項 279

在A類中定義不同的屬性和方法
package com.stulzl.test41;
public class A
{
//四個屬性,分別使用不同的訪問修飾符來修飾
public int n1=100;
protected int n2=200;
int n3=300;
private int n4=400;
//方法
public void m1()
{
//在同一類中,可以訪問 public protected 默認 private 修飾屬性和方法
System.out.println("n1="+n1+" n2="+n2+" n3="+n3+" n4="+n4);
}
//方法的修飾和屬性一樣
protected void m2(){}
void m3(){}
private void m4(){}
//在同一類中,可以訪問 public protected 默認 private 修飾屬性和方法
public void hi()
{
m1();
m2();
m3();
m4();
}
}
在B類中引用A類中的屬性和方法
package com.stulzl.test41;
public class B
{
public void say()
{
A a = new A();
//在同一個包下,可以訪問 public , protected 和 默認修飾屬性或方法,不能訪問 private 屬性或方法
System.out.println("n1="+a.n1+"n2="+a.n2+"n3="+a.n3);
//在同一個包下,可以訪問 public , protected 和 默認修飾屬性或方法,不能訪問 private 屬性或方法
a.m1();
a.m2();
a.m3();
}
}
在Test41中運行,驗證(同類)(同包)不同屬性的區(qū)別,看看能否輸出
package com.stulzl.test41;
public class Test41
{
public static void main(String[] args)
{
A a = new A();//100 200 300 400//測試同類
a.m1();
B b = new B();//100 200 300//測試同胞
b.say();
}
}
在不同包引用A類中的屬性和方法
package com.stulzl.pkg;
import com.stulzl.test41.A;
public class Test
{
public static void main(String[] args)
{
A a = new A();
//在不同包下可以訪問public修飾的屬性或者方法
//但不能訪問protected,默認,private修飾的屬性或者方法
System.out.println("n1="+a.n1);//100 //驗證不同包
//在不同包下可以訪問public修飾的屬性或者方法
//但不能訪問protected,默認,private修飾的屬性或者方法
a.m1();
}
}
2. 基本介紹
面向對象編程有三大特征:封裝、繼承和多態(tài)。
3. 封裝(encapsulation) 280

4. 封裝的理解和好處 280

5. 封裝的實現(xiàn)步驟(三步)281

6. 快速入門 282
那么在 java 中如何實現(xiàn)這種類似的控制呢?
請大家看一個小程序不能隨便查看人的年齡,工資等隱私,并對設置的年齡進行合理的驗證。年齡合理就設置,否則給默認 年齡, 必須在 1-120, 年齡, 工資不能直接查看 , name 的長度在 2-6 字符 之間
package com.stulzl.test42;
import java.util.Scanner;
//請大家看一個小程序不能隨便查看人的年齡,工資等隱私,并對設置的年齡進行合理的驗證。
// 年齡合理就設置,否則給默認 年齡, 必須在 1-120,
// 年齡, 工資不能直接查看 ,name 的長度在 2-6 字符 之間
public class Test42
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("jack");
person.setAge(30);
person.setSalary(30000);
//輸出信息
System.out.println(person.info());
System.out.println("salary="+person.getSalary());
}
}
class Person
{
public String name;//名字公開
private int age;//年齡私有
private int salary;//工資私有
//自己寫 setXxx 和 getXxx 太慢,我們使用快捷鍵
//然后根據(jù)要求來完善我們的代碼
public String getName() {
return name;
}
//name 的長度在 2-6 字符 之間
public void setName(String name) {
//假如對數(shù)據(jù)的校驗
if(name.length()>=2 && name.length()<=6)
{
this.name=name;
}
else
{
System.out.println("名字長度不對,給出默認名");
this.name = "無名氏";
}
}
public int getAge() {
return age;
}
//年齡, 必須在 1-120
public void setAge(int age) {
//設置驗證
if(age>=1 && age<=120)
{
this.age=age;
}
else
{
System.out.println("你設置的年齡不對必須在 1-120,先給一個默認年齡");
this.age = 18;//給一個默認年齡
}
}
//工資不能直接查看
public int getSalary() {
//增加對當前對當前對象的權限判定
Scanner scanner = new Scanner(System.in);
System.out.println("查看工資請輸入密碼");
String key = scanner.next();
if(key.equals("123"))
{
return salary;
}
else
{
System.out.println("密碼錯誤");
return -1;//錯誤返回-1
}
}
public void setSalary(int salary) {
this.salary = salary;
}
//寫一個方法返回信息
public String info()
{
return "信息為 name="+name+" age="+age;
}
}
6.2 封裝和構造器結合
補充上題
package com.stulzl.test42;
import java.util.Scanner;
public class Test42
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("jack");
person.setAge(30);
person.setSalary(30000);
//輸出信息
System.out.println(person.info());
System.out.println("salary="+person.getSalary());
//使用構造器輸出
System.out.println("=====smith信息=====");
Person person1 = new Person("smith",80,20000);
System.out.println(person1.info());
System.out.println("salary="+person1.getSalary());
}
}
class Person
{
public String name;//名字公開
private int age;//年齡私有
private int salary;//工資私有
//無參構造器
public Person() {//這個無參構造器是輸出jack信息的,因為宅main中jack的person()沒有傳值,而我們又寫了一個
// 有參構造器為了輸出smith信息,但是Jack的person()無傳參和smith的person1()有傳參,
// 防止jack和smith在輸出信息而是用到構造器時矛盾,所以接一個無參構造器給jack使用
}
//三個屬性的構造器
public Person(String name, int age, int salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//我們可以將set方法寫在構造器中,這樣仍然可以驗證
setName(name);
setAge(age);
setSalary(salary);
}
//自己寫 setXxx 和 getXxx 太慢,我們使用快捷鍵
//然后根據(jù)要求來完善我們的代碼
public String getName() {
return name;
}
//name 的長度在 2-6 字符 之間
public void setName(String name) {
//假如對數(shù)據(jù)的校驗
if(name.length()>=2 && name.length()<=6)
{
this.name=name;
}
else
{
System.out.println("名字長度不對,給出默認名");
this.name = "無名氏";
}
}
public int getAge() {
return age;
}
//年齡, 必須在 1-120
public void setAge(int age) {
//設置驗證
if(age>=1 && age<=120)
{
this.age=age;
}
else
{
System.out.println("你設置的年齡不對必須在 1-120,先給一個默認年齡");
this.age = 18;//給一個默認年齡
}
}
//工資不能直接查看
public int getSalary() {
//增加對當前對當前對象的權限判定
Scanner scanner = new Scanner(System.in);
System.out.println("查看工資請輸入密碼");
String key = scanner.next();
if(key.equals("123"))
{
return salary;
}
else
{
System.out.println("密碼錯誤");
return -1;//錯誤返回-1
}
}
public void setSalary(int salary) {
this.salary = salary;
}
//寫一個方法返回信息
public String info()
{
return "信息為 name="+name+" age="+age;
}
}
本文僅代表作者觀點,版權歸原創(chuàng)者所有,如需轉載請在文中注明來源及作者名字。
免責聲明:本文系轉載編輯文章,僅作分享之用。如分享內容、圖片侵犯到您的版權或非授權發(fā)布,請及時與我們聯(lián)系進行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com





