1. 程式人生 > >java封裝、構造方法、this

java封裝、構造方法、this

java

一、封裝

特性:安全、將變化隔離、便於使用、提供重復性

例子

[root@bch04 java]# cat EmployeeDemo.java 
class Employee {
    private String id;
    private String name;
    private String gender;
 
    //提供公有的set和get方法
    //public 成員修飾符,公共的,誰都可以訪問
    //private 成員修飾符,私有的,只有自己可以訪問
 
    public void setName(String n) {
        name = n;
    }
 
    public void setId(String i) {
        id = i;
    }
    
    public void setGender(String gen) {
        if ("male".equals(gen) || "female".equals(gen)) {
            gender =gen;
        } else {
            System.out.println("please input \"male\" or \"female\"");  
        }
 
    }
    
 
    public String getName() {
        return name;
    }
 
    public String getId() {
        return id;
    }
 
    public String getGender() {
        return gender;
    }
 
 
    public void work() {
        System.out.println(id +":" +name +":" +gender +":" +"working");
    } 
}
 
public class EmployeeDemo {
public static void main(String[] args) {
 
        //創建對象
        Employee tom = new Employee();
 
        //調用公有方法,給成員賦值變量
        tom.setName("tom");
        tom.setId("1");
        tom.setGender("male");
 
        //獲取實例變量的值
        System.out.println(tom.getName());
        System.out.println(tom.getId());
        System.out.println(tom.getGender());
 
        //調用成員方法
        tom.work();
    }
 
}
 
//運行結果 
[root@bch04 java]# java EmployeeDemo 
tom
1
male
1:tom:male:working

[root@bch04 java]# cat Demo.java 
class Calculator {
    public String name = "my Carculator";
    public double num1;
    public double num2;
    public char option;
 
    public void init(double a, char op, double b) {
        num1 = a;
        num2 = b;
        option = op;
    }
  
    public void calculate() {
        switch (option) {
            case '+': System.out.println(name +":" +num1 +"+" +num2 +"=" +(num1+num2));
                      break;
            case '-': System.out.println(name +":" +num1 +"-" +num2 +"=" +(num1-num2));
                      break;
            case '*': System.out.println(name +":" +num1 +"*" +num2 +"=" +(num1*num2));
                      break;
            case '%': System.out.println(name +":" +num1 +"%" +num2 +"=" +(num1%num2));
                      break;
            case '/': if (num2 != 0) {
                             System.out.println(name +":" +num1 +"/" +num2 +"=" +(num1/num2));
                         } else {
                             System.out.println("num2 can not be 0 !");     
                         }
                         break;
            default : System.out.println("null");
        } 
 
    }
 
}
 
class Demo {
    public static void main(String[] args) {
        Calculator cal = new Calculator();
        cal.init(10 ,'%' ,3);
        cal.calculate();
        System.out.println("bye");
    } 
}
 
//運行結果 
[root@bch04 java]# java Demo
my Carculator:10.0%3.0=1.0
bye


二、構造方法

1. 定義:

對象創建出來時,沒有值:

技術分享圖片


對象創建出來時,有值:

技術分享圖片


構造方法作用:對對象進行初始化

技術分享圖片

2. 構造函數的特點:

1)在對象建立時由jvm調用,給對象初始化

2)在創建對象時調用

3)函數名與類名一致

4)沒有返回值類型

5)當類中沒有定義構造函數時,系統默認加上一個空參數的構造函數,有則覆蓋

6)一個類中可以定義多個構造函數,以進行不同的初始化,以重載的形式體現

3. 構造代碼塊的特點:

1)給所有的對象進行統一初始化

2)創建對象時就運行,優先於構造函數

3)一般用於將所有構造方法中公共的信息抽取出來

4)與構造函數區別:全部對象和部分對象的區別

例子

[root@bch04 java]# cat Demo9.java 
class Boy {
  String name;
  int age;
  String gender;
 
   // 構造代碼塊,給所有對象進行初始化
  {
       System.out.println("哭。。。");
  }
     
  Boy() {
       System.out.println("無參構造");
  }
 
  Boy(String n, int a, String g) {
       name = n;
       age = a;
       gender = g;
       System.out.println("有參構造");
  }
 
  void run() {
       System.out.println("跑...");
  }
 
}
 
public class Demo9 {
  public static void main(String[] args) {
       System.out.println();
       Boy b = new Boy();
       Boy b2 = new Boy("jack", 1, "男");
  }
}
 
//運行結果
[root@bch04 java]# java Demo9
 
哭。。。
無參構造
哭。。。
有參構造


三、this關鍵字

1)表示所在函數所屬對象的引用

2this只能在非靜態中(沒有static修飾)函數使用

3)構造函數間相互調用必須放在構造函數的第一個語句中

4)可以解決構造函數中對象屬性和函數形參的同名問題

class Person {
       String name;
       int age;
 
       Person() {
       }
 
       Person(String n){
              name=n;
       }
 
       Person(String n, int a) {
              //構造函數不能直接通過函數名直接調用,編譯報錯!!!
              Person(n);
              age = a;
       }
}

例子

//在構造函數中打印this與創建對象時打印對象名p,結果一樣,說明this和p是一樣,都是內存地址值
class Student {
    String name;
    String gender;
    int age;
 
    Student() {
    }
 
    Student(String name) {
       this();
       this.name = name;
    }
 
    Student(String name, String gender, int age) {
       this(name);
       System.out.println(this);  //Student@659e0bfd
       this.gender = gender;
       this.age = age;
    }
 
    void speak() {
       run();
       System.out.println("姓名:" + name + " 性別:" + gender + " 年齡:" + age
              + " 嘿嘿");
    }
 
    void run() {
       System.out.println("run.....");
    }
 
}
 
class Demo2 {
    public static void main(String[] args) {
       Student p = new Student("tom", "male", 28);
       System.out.println(p); // Student@659e0bfd
       p.speak();
    }
}
 
//運行結果
[root@bch04 java]# java Demo2
Student@659e0bfd
Student@659e0bfd
run.....
姓名:tom 性別:male 年齡:28 嘿嘿



java封裝、構造方法、this