三、类中的匿名对象
没名字的对象称为匿名对象,对象的名字按照之前的内存关系来讲,在栈内存之中,
而对象的具体内容在堆内存之中保存,这样,没有栈内存指向堆内存空间,就是一个匿名对象。
范例:
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中调用了,当然也可以将类放在外面。