類,物件,成員變數和區域性變數,匿名物件

farsun發表於2021-09-09

類是一組相關的屬性和行為的集合
屬性- 成員變數
行為- 成員方法
成員變數,可以有很多個 零值
成員方法,也可以有很多個,到底具體寫幾個,看具體的需要
自定義型別的 物件建立 的格式

// 自定義的型別 物件名 = new 自定義型別();
Person person = new Person();

如何使用物件,使用物件其實是使用物件中的成員(成員變數,成員方法)
格式:物件名.成員變數 或者 物件名.成員方法()
取值. 讀操作

// 呼叫成員方法
// 物件名.成員方法();
person.eat();

類與物件的建立記憶體佈局圖
一個物件:
一個物件的基本初始化過程
兩個物件:
方法的共用
三個物件:
其中有兩個引用指向同一個物件
圖片描述

package com.newedu.jb.day06;
/**
 * 定義一個學生類
 * @author 小可愛
 *
 */
public class Student {
    //成員變數
    String name; //預設值 null

    int age;//預設值 0

    String school; //預設值 null

    //成員方法

    public void eat(){
        System.out.println("eat()方法被呼叫了");
    }

    public void sleep(){
        System.out.println("sleep()方法被呼叫了");
    }

    public void study(){
        System.out.println("Student()方法被呼叫了");
    }

    public void showInfo(){
        System.out.println("name:"+name+" age:"+age+" school:"+school);
    }
}
package com.newedu.jb.day06;
/**
 * 自定義類Student的測試類
 * @author 小可愛
 *
 */
public class StudentDemo {
    public static void main(String[] args) {
//      int i ;
//      System.out.println(i);

        //建立一個物件
        Student student = new Student();
        student.showInfo();

        //呼叫物件的成員變數   讀值
        System.out.println(student.name);
        System.out.println(student.age);
        System.out.println(student.school);

        //給物件的成員變數賦值  寫值
        student.name = "尚文旭";
        student.age = 20;
        student.school = "中原工學院";

        //呼叫物件的成員變數   讀值
        System.out.println(student.name);
        System.out.println(student.age);
        System.out.println(student.school);

        //如何呼叫成員方法呢?
        student.eat();
        student.sleep();
        student.study();
        student.showInfo();

        System.out.println("===================");

        //建立第二個學生物件
        Student student2 = new Student();
        //呼叫物件的成員變數 ,讀值
        System.out.println(student2.name); //輸出null
        System.out.println(student2.age); // 0
        System.out.println(student2.school); // 輸出null

        //給物件的成員變數賦值 寫值
        student2.name = "泡泡";
        student2.age = 18;
        student2.school = "軟體學院";

        //呼叫物件的成員變數 ,讀值
        System.out.println(student2.name); //輸出新值"泡泡"
        System.out.println(student2.age);//輸出新值 18
        System.out.println(student2.school); //輸出新值"軟體學院"

        //呼叫物件的成員方法

        student2.eat();
        student2.sleep();
        student2.study();
        student2.showInfo();

        System.out.println("======================");
        // int[] array1 = new int[3];
        // int[] array2 = array1;
        //Student student = new Student();
        // Student型別  物件名 =
        Student student3 = student;

        System.out.println(student3.name);//輸出 “尚文旭”
        System.out.println(student3.age);//輸出  20
        System.out.println(student3.school); //輸出 “中原工學院"

        //給成員變數賦值
        student3.name = "peter";
        student3.age = 21;

        student3.showInfo();
        student.showInfo();
    }
}

成員變數和區域性變數的區別
在類中的位置不同
成員變數 類中方法外
區域性變數 方法內或者方法宣告上
在記憶體中的位置不同
成員變數 堆記憶體
區域性變數 棧記憶體
生命週期不同
成員變數 隨著物件的存在而存在,隨著物件的消失而消失
區域性變數 隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
初始化值不同
成員變數 有預設的初始化值
區域性變數 沒有預設的初始化值,必須先定義,賦值,才能使用。
基本型別作為形式引數
引用型別作為形式引數(自定義類作為引數)
基本資料型別和引用資料型別作為方法的引數傳遞後,
在方法內對引數進行修改,是否會對引數產生影響的問題?

基本資料型別作為方法的形式引數時,做的是“值傳遞”
引用資料型別作為方法的形式引數時,做的也是“值傳遞”,但是這次傳遞的記憶體地址值
(兩個變數引用了同一塊記憶體地址值。)

package com.newedu.jb.day06;
/**
 * 演示形式引數的問題:
 *     自定義型別做為形式引數的問題
 * @author 小可愛
 *
 */
public class ParameterMethod {
    public void change(int a ,int b){
        // 這裡的a和b 是重新定義的區域性變數(是因為在方法內定義的) a = 10,b = 20;
        a *=2; // 20;
        b +=a; // 40
        // 一旦離開了 方法體,這裡面的區域性變數a和b就消失了
    }
    /**
     * 自定義型別Student作為形式引數傳遞
     * 引用型別作為形式引數傳遞
     * @param stu
     */
//  public void change2{
//     Student stu ;
    // stu  = new Student();
    // Student stu2 = new Student();
    // stu = stu2;
//}
    public void change2(Student  stu){
        // 相當於 在這裡定義了一個Student物件 stu; Student stu = ?
        //給我們的成員變數 age加上100
        stu.age += 100;
        //呼叫 成員方法()
        stu.showInfo();
    }
}
package com.newedu.jb.day06;
/**
 * 測試類,演示自定義型別作為形式引數的問題
 * @author 小可愛
 *
 */
public class ParameterMethodDemo {
    public static void main(String[] args) {

        //建立一個物件
        ParameterMethod pm = new ParameterMethod();

        int a = 10;
        int b = 20;
        System.out.println("a:"+a+"b:"+b); //a:10 b:20
        //呼叫物件的成員方法
        pm.change(a, b);
        System.out.println("a:"+a+"b:"+b); // a:10 b:20
                                           // a:20 b:40

        System.out.println("=================");
        Student stu = new Student();
        stu.showInfo(); // name:null age:0 school:null
        pm.change2(stu);
        stu.showInfo(); // name:null age:100 school:null
    }
}

匿名物件:
匿名物件:就是沒有名字的物件。
是物件的一種簡化表示形式
匿名物件的兩種使用情況
物件呼叫成員僅僅一次的時候
作為實際引數傳遞
程式碼舉例:

package com.newedu.jb.day06;
/**
 * 匿名物件的建立與使用
 * @author 小可愛
 *
 */
public class AnonymityObjectDemo {
    public static void main(String[] args) {
        // 匿名物件,就是沒有名字的物件

//      Student stu = new Student();

        (new Student()).name = "尚文旭";
        new Student().age = 20;

        new Student().showInfo();

        // 匿名物件有短板: 只能用一次。

        // 匿名物件的用途:
        // A:物件呼叫成員僅僅一次的時候
        // B:作為實際引數傳遞
        ParameterMethod pm  = new ParameterMethod();
//      Student stu = new Student();
        pm.change2(new Student());

    }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2799179/,如需轉載,請註明出處,否則將追究法律責任。

相關文章