1. 程式人生 > >Java 類與物件全解析

Java 類與物件全解析

如何建立物件和如何書寫一個類?

程式碼舉例:

public class Demo01 {
    public static void main(String[] args) {
        //例項化一個物件 名字為 animal
        Animal animal = new Animal();       
        //如何訪問成員變數?  物件.變數  物件建立在堆記憶體有初始值 
        //如果成員變數在 = 前面叫賦值 如果在等號後面叫獲取
        animal.name = "來福";
        //獲取成員變數
        System.out
.println(animal.name); //呼叫方法 animal.sayHi(); animal.sleep(); animal.eat(); } } // 建立一個動物類 class Animal{ //成員變數的作用域 整個類中都能訪問到 String name = "旺財"; //動物的姓名 int age = 2; //動物的年齡 String gender = "公"; //性別 //成員方法
public void sayHi() { System.out.println("名字:" + name); System.out.println(age +"歲"); System.out.println("性別:" + gender); } //睡覺 public void sleep() { String name = "小強"; //區域性變數 System.out.println(name + "在睡覺"
); } //吃飯 public void eat() { System.out.println(name + "在吃飯"); } }

上面我們具體程式碼舉例了寫一個類和如何示例一個類.在程式碼中有引入了 成員變數和區域性變數概念 它們具體有什麼區別呢?

  1. 書寫位置
    成員變數:在類中方法外
    區域性變數:在類中方法內或方法宣告上

  2. 記憶體位置
    成員變數:在堆記憶體中
    區域性變數:在棧記憶體中

  3. .初值
    成員變數:有預設值(堆賦予的)
    區域性變數:無預設值 如果要使用 必須要給初值

  4. 生命週期
    成員變數: 隨著物件的建立而建立 隨著物件的銷燬而銷燬
    區域性變數: 隨著方法存在

有些時候一些方法需要傳參,那就建立這個引數傳進去 當引數為引用資料型別(類) 需要建立這個物件 然後將它傳進去(傳入的為記憶體地址!)

程式碼舉例:

public class Demo03 {

    public static void main(String[] args) {
        //匿名物件 new Person()
        //只調用方法 這時可以使用匿名物件(測試的時候會用)
        //可以當做引數進行傳遞
        //好處:當引數的時候 程式碼簡單    壞處:無法直接修改裡面的值   
        new Person().name ="james";
        new Person().sayHi();           
        Person p1 = fun("Tom", new Person());
        p1.sayHi();
    }
    //封裝一個更改name的方法
    public static Person fun(String name) {
        Person person = new Person();
        person.name = name;
        person.sayHi();  
         return person;

     }
    //函式的過載  功能同上    Person person 實際上和  Person person = new Person() 相同的
    public static Person fun(String name, Person person) {
    // = 後面的為傳入引數name 右邊的為Person類中的name 和第一個封裝方法一樣
        person.name = name;
        return person;  
    }
}
//建立一個類
 class Person{
     String name = "peter";
     int age = 16;  
     //方法 
     public void sayHi() {
         System.out.println("姓名:" + name + " " + "年齡:" + age);       
     }   
 } 

從上面我們可以看出 類中的屬性 好像只要例項化誰都可以拿來取值賦值 能不能避免這樣呢?
當然可以,只需要在屬性前面加一個關鍵字就可以了 —private 私有的
我們來看看程式碼中是如何實現的

public class Dmoe04 {
    public static void main(String[] args) {
        Student student = new Student();
        //使用 set/get 方法
        student.setName("jamea"); 
        student.setAge(18); 
        System.out.println(student.getName());
        student.sayHi();
    }
}
    //建立類
    class Student{
        // 成員變數私有化(只能本類進行訪問 本類以外無法訪問)
        //不能通過物件點屬性來直接訪問 但是可以通過方法來間接訪問
    private String name;
    private int age;    
    //  get/set方法 命名規範 以set /get 開頭 小駝峰
    //獲取
        public String getName() {
        return name;
    }
    //修改
    public void setName(String name) {
        //提供關鍵字 this 代表本類的物件
        // 哪個物件呼叫方法 這個物件就是this
            this.name = name;    
            //這裡 = 右邊的name 是傳入的引數 左邊的相當於 student.name
            //this 用來區分兩個name
    }


    public int getAge() {
        return age;
    }


    public void setAge(int age) {
        this.age = age;
    }
        // 就近原則(這裡會列印區域性變數) 
        public void sayHi() {
            String name = "猜猜我是誰?";
            System.out.println(name + " " + age);

        }
    }