Lesson Eight 2018-04-23 02:07:01 封裝與隱藏:問題:當創建了類的對像以後,如果直接通過“對象.屬性”的方式對相應的對像屬性賦值的話,可能會出來不滿足實際情況的意外。 引出:通過“對像 .方法”的形式,來控制對像對屬性的訪問。對屬性的要求術可以通過方法來體現。 解決:1 ...
Lesson Eight 2018-04-23 02:07:01
封裝與隱藏:
問題:當創建了類的對像以後,如果直接通過“對象.屬性”的方式對相應的對像屬性賦值的話,可能會出來不滿足實際情況的意外。
引出:通過“對像 .方法”的形式,來控制對像對屬性的訪問。對屬性的要求術可以通過方法來體現。
解決:1.將類的屬性私有化,2.提供公共的方法(setter & getter)來實現調用。 即封裝。
class Person { // 將成員屬性私有化 private String name; private int age; // 1.將類的屬性私有化,2.提供公共的方法(setter & getter)來實現調用。 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } // 條件判斷控制數據寫入 public void setAge(int age) { if (age > 0 && age < 130) { this.age = age; } else { // System.out.println("輸入有誤"); throw new RuntimeException("輸入有誤"); } } }
許可權修飾符:
private(類的內部)
預設(類的內部、同一個包)
prtected(類的內部、同一個包、子類)
public(類的內部、同一個包、子類、任何地方)
1.以上許可權從小到大排列,可以修飾屬性和方法
2.對於class 的許可權修飾只能有 public 和default
如圖:
構造器 (constructor、構造方法)
一、構造器的作用: 1.創建對象 2.給創建的對象的屬性賦值
1.設計類時,若不顯式聲明類的構造器的話,程式會預設提供一個空參構造器
2.一旦顯式的定義了類的構造器,那預設的構造器就不再提供
3.如何聲明類的構造器。 格式: 許可權修飾符 類名(形參){}
4.類的多個構造器之間構成重載
二、類對象的屬性賦值的先後順序:
1.屬性的預設初始化 (JDK自動完成)
2.屬性的顯式初始化 (人為手動完成)
3.通過構造器給屬性初始化 (人為手動完成)
4.通過“對像.方法”的方式給屬性賦值 (人為手動完成)
三、註意:
1.創建對像的時候會自行調用構造器(構造方法)
2.可以有多個,根據參數類型的不同和參數列表的不同進行區分
3.構造器就像一個特別的方法,跟方法有以下的區別:
3.1構造器名稱必須和類型相同,方法則不需要
3.2構造器不是允許有返回值,方法則必須有返回值 如果有返回值就等同於普通方法
3.2構造器不可以通過方法來調用,方法由需要通過對像來調用
public static void main(String[] args) { // TODO Auto-generated method stub Person p1 = new Person(); Person p2 = new Person("fkuennhvo"); Person p3 = new Person("fkuennhvo",24); System.out.println(p1.getName()); System.out.println(p2.getName()+p2.getAge()); System.out.println(p3.getName()+p3.getAge()); } } class Person{ //屬性 private String name; private int age; //構造器 public Person(){ } public Person(String n){ name = n; } public Person(String name , int age){ this.name = name; this.age = age; } //方法 public void setName(String n){ name = n; } public void setAge(int a){ age = a ; } public String getName(){ return name; } public int getAge(){ return age; } }
有個沒解決的問題:!
public static void main(String[] args) { // TODO Auto-generated method stub // Scanner scanner = new Scanner(System.in); TestTriAngle t = new TestTriAngle(); int S = t.S; // 為什麼最後結果還是為0!!! System.out.println(S); } } // 獲取三角形的寬(K)和高(C) class TriAngle { private int C, K; public int getC() { return C; } public void setC(int c) { C = c; } public int getK() { return K; } public void setK(int k) { K = k; } // 帶參構造,接收寬和高 public TriAngle(int C, int K) { this.C = C; this.K = K; } } // 用於計算三角形的面積 // S = C*K/2 class TestTriAngle { int S; public void Tri() { // 創建帶參構造器並傳入寬,高進去。 TriAngle T = new TriAngle(3, 4); this.S = T.getC() * T.getK() / 2; // 問題,這個 this.S 難道不是指向那個成員變數的嗎? } }