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中呼叫了,當然也可以將類放在外面。