1. 程式人生 > 其它 >Day19---學習Java第二彈

Day19---學習Java第二彈

2021-07-29

類和物件

三、類中的匿名物件

沒名字的物件稱為匿名物件,物件的名字按照之前的記憶體關係來講,在棧記憶體之中,

而物件的具體內容在堆記憶體之中儲存,這樣,沒有棧記憶體指向堆記憶體空間,就是一個匿名物件。

範例:

 1 package com.wz.classandobj;
 2 
 3 class Book{
 4 
 5     private String title;
 6     private double price;
 7 
 8     public Book(String title, double price) {
 9         this.title = title;
10 this.price = price; 11 System.out.println("有倆個引數的構造方法"); 12 } 13 14 public void getInfo(){ 15 System.out.println("圖書的名稱:"+title+" 圖書的價格:"+price); 16 } 17 } 18 19 public class TestDemo { 20 public static void main(String args[]) { 21 //匿名物件 22 new
Book("Java開發",89.9).getInfo(); 23 24 } 25 }

執行結果:

有倆個引數的構造方法

圖書的名稱:Java開發 圖書的價格:89.9

匿名物件由於沒有對應的棧記憶體指向,所以只能使用一次,一次之後就將成為垃圾,並且等待被GC回收釋放。

典型例題:

1.實驗目的

掌握類的宣告、物件的建立、方法的定義和呼叫、建構函式的使用。

2.實驗內容

1)定義一個表示學生資訊的類Student,要求如下:

① 類Student的成員變數:

sNO 表示學號;

sName 表示姓名;

sSex 表示性別;

sJava 表示Java課程成績;

② 類Student的方法成員:

getNo():獲得學號;

getName():獲得姓名;

getSex():獲得性別;

getAge()獲得年齡;

getJava():獲得Java 課程成績

2)按(1)中學生類Student的定義,建立兩個該類的物件,儲存並輸出兩個學生的資訊計算機並輸出這兩個學生Java語言成績的平均值。

3)建立第 (1)題的Student類的5個物件,求他們Java語言成績的最大值和最小值。

4)根據下面的要求實現圓類Circle。

① 圓類Circle的成員變數:

radius表示圓的半徑。

② 圓類Circle的方法成員:

Circle():構造方法,將半徑置0

Circle(double r):構造方法,建立Circle物件時將半徑初始化為r

double getRadius():獲得圓的半徑值

double getPerimeter():獲得圓的周長

void disp():將圓的半徑、圓的周長和圓的面積輸出到螢幕

3.實驗程式碼

  1 package seconddemo;
  2 public class SecondDemo {
  3     public static class Student {//學生類
  4         //成員變數
  5         private String sNo;
  6         private String sName;
  7         private String sSex;
  8         private int sAge;
  9         private double sJava;
 10         public void setStudent(String no, String name, String sex, int age, int java) {
 11             sNo = no;
 12             sName = name;
 13             sSex = sex;
 14             sAge = age;
 15             sJava = java;
 16         }
 17         //成員方法
 18         public void getNO() {//獲取相關成員變數的值
 19             System.out.print(sNo+"\t");
 20         }
 21         public void getName() {
 22             System.out.print(sName+"\t");
 23         }
 24         public void getSex() {
 25             System.out.print(sSex+"\t");
 26         }
 27         public void getAge() {
 28             System.out.print(sAge+"歲\t");
 29         }
 30         public void getJava() {
 31             System.out.print(sJava+"分");
 32         }
 33     }
 34     public static class Circle{
 35         private double radius;
 36         public Circle(){
 37             radius = 0;
 38         }
 39         public Circle(double r) {
 40             radius = r;
 41         }
 42         public double getRadius() {
 43             return radius;
 44         }
 45         public double getPerimeter() {
 46             return 2 * 3.14 * radius;
 47         }
 48         public void disp() {
 49             System.out.println("圓的半徑為:" + radius);
 50             System.out.println("圓的周長為:" + (2 * 3.14 * radius));
 51             System.out.println("圓的面積為:" + (3.14 * radius * radius));
 52         }
 53     }
 54     public static void main(String[] args) {//主類
 55     //這是第二問
 56         System.out.println("第二問:");
 57         Student studentA = new Student();
 58         Student studentB = new Student();
 59         System.out.println("studentA和studentB的資訊如下:");
 60         studentA.setStudent("gl3162052051432", "Yu Dong", "  男", 20, 98);
 61         studentB.setStudent("gl3162052051431", "Xu chen", "  男", 20, 100);
 62         studentA.getNO();
 63         studentA.getName();
 64         studentA.getSex();
 65         studentA.getAge();
 66         studentA.getJava();
 67         System.out.println();
 68         studentB.getNO();
 69         studentB.getName();
 70         studentB.getSex();
 71         studentB.getAge();
 72         studentB.getJava();
 73         System.out.println();
 74         System.out.println(studentA.sName+"同學和"+studentB.sName+"同學的Java課程的平均分為:"+((studentA.sJava+studentB.sJava)/2)+"分");
 75     //這是第三問
 76         double max = -1;
 77         double min = 101;
 78         Student[] student = new Student[5];//定義陣列
 79         for(int i = 0; i<student.length; i++) {//初始化物件
 80             student[i] = new Student();
 81         }
 82         student[0].setStudent("gl3162052051432", "Yu Dong", "  男", 20, 98);
 83         student[1].setStudent("gl3162052051431", "Xu chen", "  男", 20, 62);
 84         student[2].setStudent("gl3162052051430", "Li hai", "  男", 20, 82);
 85         student[3].setStudent("gl3162052051429", "li da", "  男", 20, 77);
 86         student[4].setStudent("gl3162052051428", "Su wang", "  男", 20, 96);
 87         for(int i = 0; i<student.length; i++) {
 88             if(min > student[i].sJava)min = student[i].sJava;
 89             if(max < student[i].sJava)max = student[i].sJava;
 90         }
 91         System.out.println("\n第三問:");
 92         System.out.println("五名同學Java課程的最高成績為:"+max);
 93         System.out.println("五名同學Java課程的最底成績為:"+min);
 94     //這是第四問
 95         System.out.println();
 96         System.out.println("第四問:");
 97         Circle cirNameA = new Circle();
 98         Circle cirNameB = new Circle(6);
 99         System.out.println("無參初始化:");
100         cirNameA.disp();
101         System.out.println("帶參初始化:");
102         cirNameB.disp();
103     }
104 }

4.注意事項

在主類內部,新建一個另一類的類,必須加上關鍵字 static,否則在主函式裡呼叫非靜態的類,

出現錯誤,提示“無法從靜態上下文中引用非靜態變數this”,因為main方法執行時,內部非靜態類還沒載入,

所以訪問不到。在本例中在student類前加一個static,就可以直接在main中呼叫了,當然也可以將類放在外面。