201771010108 -韩腊梅-第四周学习总结
一、知识总结
1. 对象的三个主要特性:
- 对象的行为:可以对对象施加的操作,方法?
- 对象的状态:当施加那些方法时,对象如何响应?
- 对象的标识:如何辨别具有相同行为与状态的不同对象?
2. 类之间的关系:
- 依赖(use-a):一个类访问或操作其他类的对象
- 聚合(has-a):类A的对象包含类B的对象
- 继承(is-a):继承关系
3. 用户自定类:
在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。
Java 对象都是在堆中构造的。
public void raiseSalary(double byPercent)
方法有两个参数。第一个参数称为隐式参数,是出现在方法名前的类对象。第二个参数位于方法名后面括号中的数值,这是一个显式参数。
在每一个方法中,关键字this标识隐式参数。
在C++中,如果在类内定义方法,这个方法将自动成为内联方法。但在Java 中,将某个方法设置为内联方法是Java虚拟机的任务。即时编译器会监视调用那些简洁、经常被调用、没哟被重载以及可优化的方法。
如果需返回一个可变数据域的拷贝,就应该使用clone().
final 关键字只是表示存储在变量中的对象引用不会再指示其他对象,但是对象的内容是可以修改的
4.静态域与静态方法:
静态域被称为类域,属于类,不属于任何独立的对象。
静态方法:
- 静态方法时一种不能面向对象实施操作的方法。
- 没有隐式参数。
main方法:
- 在启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象。
5. 对象构造:
方法签名:方法名 + 参数类型 【不包括返回类型】
重载:
-
不允许两个方法签名相同,但是返回类型不同的重载方法
-
如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供构造参数就会被视为不合法。仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。
-
域分为两种:实例域 类域
如果构造器的第一个语句形如this(…) 这个构造器将调用同一个类的另一个构造器。(在C++中则不允许)
初始化快
形如{…}首先运行初始化块,然后才运行构造器的主题部分。
小结:具体处理步骤
- 所以数据域被初始化为默认值(0,false,null)
- 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
- 执行构造函数。
关于析构和回收:
-
Java 有自动的垃圾回收器,不需要人工回收内存,所以Java 不支持析构器。
-
finalize 方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖使用finalize 方法回收任何短缺的资源,这是因为很难知道这个方式什么时候才能够调用。
6. 包
-
在Java 中,package 与 import 语句类似于C++ 中的namespace 和 using 指令。
-
如果没有在源文件中放置package 语句,这个源文件中的包
二、实验目的与要求
(1) 理解用户自定义类的定义;
(2) 掌握对象的声明;
(3) 学会使用构造函数初始化对象;
(4) 使用类属性与方法的使用掌握使用;
(5) 掌握package和import语句的用途。
三、实验内容步骤及实验结果
实验1 测试以下程序,掌握文件输入输出程序设计技术(文件输入输出,教材61-62).
实验代码:
/** * @author Han lamei */ package four; import java.io.*; import java.util.*; public class Four { public static void main(String[] args) throws IOException{ //写入文件演示 PrintWriter out = new PrintWriter("myfile.txt"); out.println("姓名 高数 Java 数据结构 平均成绩 总成绩"); out.println("张三 20 30 40 0 0"); out.println("李四 50 60 70 0 0"); out.close();//输出完毕,需要close //读入文件演示 Scanner in = new Scanner(new File("myfile.txt"));//为myfile.txt这个File创建一个扫描器in int number = 1;//行号 System.out.println(in.nextLine()); while(in.hasNextLine()){//判断扫描器是否还有下一行未读取,该循环把文件的每一行都读出 String line = in.nextLine();//读出myfile.txt的下一行 System.out.print("第"+(++number)+"行的内容: "); Scanner linescanner = new Scanner(line);//行内容建立扫描器 linescanner.useDelimiter(" ");//使用空格作为分隔符 String name = linescanner.next(); String math = linescanner.next(); String java = linescanner.next(); String ds = linescanner.next(); String avg = linescanner.next(); String total = linescanner.next(); System.out.println("name="+name+" math="+math+" java="+java+" ds="+ds+" avg"+avg+" total="+total); } in.close();//读入完毕,最后需要对其进行close。 } }
实验结果:
实验2 导入第4章示例程序并测试。
测试程序1:
l 编辑、编译、调试运行程序4-2(教材104页);
实验代码:
import java.util.*; /** * This program demonstrates object construction. * @version 1.01 2004-02-19 * @author Cay Horstmann */ public class EmployeeTest { public static void main(String[] args) { // fill the staff array with three Employee objects Employee[] staff = new Employee[3]; staff[0] = new Employee("Harry", 40000); staff[1] = new Employee(60000); staff[2] = new Employee(); // print out information about all Employee objects for (Employee e : staff) System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary()); } } class Employee { private static int nextId; private int id; private String name = ""; // instance field initialization private double salary; // static initialization block static { Random generator = new Random(); // set nextId to a random number between 0 and 9999 nextId = generator.nextInt(10000); } // object initialization block { id = nextId; nextId++; } // three overloaded constructors public Employee(String n, double s) { name = n; salary = s; } public Employee(double s) { // calls the Employee(String, double) constructor this("Employee #" + nextId, s); } // the default constructor public Employee() { // name initialized to ""--see above // salary not explicitly set--initialized to 0 // id initialized in initialization block } public String getName() { return name; } public double getSalary() { return salary; } public int getId() { return id; } }
实验结果:
l 结合程序运行结果,掌握类的定义与类对象的用法,并在程序代码中添加类与对象知识应用的注释;
l 尝试在项目中编辑两个类文件(Employee.java、 EmployeeTest.java ),编译并运行程序。
l 参考教材104页EmployeeTest.java,设计StudentTest.java,定义Student类,包含name(姓名)、sex(性别)、javascore(java成绩)三个字段,编写程序,从键盘输入学生人数,输入学生信息,并按以下表头输出学生信息表:
姓名 性别 java成绩
实验代码:
package f; import java.util.*; public class StudentTest { public static void main(String[] args) { Employee[] student = new Employee[3]; System.out.println("请输入学生"); @SuppressWarnings("resource") Scanner in = new Scanner(System.in); for(int i=0;i<student.length;i++) { student[i]=new Employee(in.next(),in.next(),in.nextInt()); } System.out.println("name"+" "+"sex"+" "+"javascore"); for (Employee e : student) System.out.println(e.getName() +" "+e.getSex()+" "+e.getJavaScore()); } } class Employee { private String name; private String sex; private int javascore; public Employee(String n, String s, int m) { name = n; sex = s; javascore =m; } public String getName() { return name; } public String getSex() { return sex; } public int getJavaScore() { return javascore; } }
实验结果:
测试程序2:
l 编辑、编译、调试运行程序4-3(教材116);
l 结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;
l 理解Java单元(类)测试的技巧。
实验代码:
package e; /** * This program demonstrates static methods. * @version 1.01 2004-02-19 * @author Cay Horstmann */ public class StaticTest { public static void main(String[] args) { // fill the staff array with three Employee objects Employee[] staff = new Employee[3]; staff[0] = new Employee("Tom", 40000); staff[1] = new Employee("Dick", 60000); staff[2] = new Employee("Harry", 65000); // print out information about all Employee objects for (Employee e : staff) { e.setId(); System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary()); } int n = Employee.getNextId(); // calls static method System.out.println("Next available id=" + n); } } class Employee { private static int nextId = 1; private String name; private double salary; private int id; public Employee(String n, double s) { name = n; salary = s; id = 0; } public String getName() { return name; } public double getSalary() { return salary; } public int getId() { return id; } public void setId() { id = nextId; // set id to next available id nextId++; } public static int getNextId() { return nextId; // returns static field } public static void main(String[] args) // unit test { Employee e = new Employee("Harry", 50000); System.out.println(e.getName() + " " + e.getSalary()); } }
实验结果:
测试程序3:
l 编辑、编译、调试运行程序4-4(教材121);
l 结合程序运行结果,理解程序代码,掌握掌握Java方法参数的用法,在相关代码后添加注释;
实验代码:
/** * This program demonstrates parameter passing in Java. * @version 1.00 2000-01-27 * @author Cay Horstmann */ public class ParamTest { public static void main(String[] args) { /* * Test 1: Methods can't modify numeric parameters */ System.out.println("Testing tripleValue:"); double percent = 10; System.out.println("Before: percent=" + percent); tripleValue(percent); System.out.println("After: percent=" + percent); /* * Test 2: Methods can change the state of object parameters */ System.out.println(" Testing tripleSalary:"); Employee harry = new Employee("Harry", 50000); System.out.println("Before: salary=" + harry.getSalary()); tripleSalary(harry); System.out.println("After: salary=" + harry.getSalary()); /* * Test 3: Methods can't attach new objects to object parameters */ System.out.println(" Testing swap:"); Employee a = new Employee("Alice", 70000); Employee b = new Employee("Bob", 60000); System.out.println("Before: a=" + a.getName()); System.out.println("Before: b=" + b.getName()); swap(a, b); System.out.println("After: a=" + a.getName()); System.out.println("After: b=" + b.getName()); } public static void tripleValue(double x) // doesn't work { x = 3 * x; System.out.println("End of method: x=" + x); } public static void tripleSalary(Employee x) // works { x.raiseSalary(200); System.out.println("End of method: salary=" + x.getSalary()); } public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; System.out.println("End of method: x=" + x.getName()); System.out.println("End of method: y=" + y.getName()); } } class Employee // simplified Employee class { private String name; private double salary; public Employee(String n, double s) { name = n; salary = s; } public String getName() { return name; } public double getSalary() { return salary; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } }
实验结果:
测试程序4:
l 编辑、编译、调试运行程序4-5(教材129);
l 结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。
实验代码:
package e; import java.util.*; /** * This program demonstrates object construction. * @version 1.01 2004-02-19 * @author Cay Horstmann */ public class ConstructorTest { public static void main(String[] args) { // fill the staff array with three Employee objects Employee[] staff = new Employee[3]; staff[0] = new Employee("Harry", 40000); staff[1] = new Employee(60000); staff[2] = new Employee(); // print out information about all Employee objects for (Employee e : staff) System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary()); } } class Employee { private static int nextId; private int id; private String name = ""; // instance field initialization private double salary; // static initialization block static { Random generator = new Random(); // set nextId to a random number between 0 and 9999 nextId = generator.nextInt(10000); } // object initialization block { id = nextId; nextId++; } // three overloaded constructors public Employee(String n, double s) { name = n; salary = s; } public Employee(double s) { // calls the Employee(String, double) constructor this("Employee #" + nextId, s); } // the default constructor public Employee() { // name initialized to ""--see above // salary not explicitly set--initialized to 0 // id initialized in initialization block } public String getName() { return name; } public double getSalary() { return salary; } public int getId() { return id; } }
实验代码:
测试程序5:
l 编辑、编译、调试运行程序4-6、4-7(教材135);
l 结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;
实验代码:
package e; import static java.lang.System.*; /** * This program demonstrates the use of packages. * @version 1.11 2004-02-19 * @author Cay Horstmann */ public class PackageTest { public static void main(String[] args) { // because of the import statement, we don't have to use // com.horstmann.corejava.Employee here Employee harry = new Employee("Harry Hacker", 50000, 1989, 10, 1); harry.raiseSalary(5); // because of the static import statement, we don't have to use System.out here out.println("name=" + harry.getName() + ",salary=" + harry.getSalary()); } }
实验结果:
实验3 编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:
求周长的方法public int getPerimeter()
求面积的方法public int getArea()
在main方法中完成以下任务:
(1) 输入1行长与宽,创建一个Rectangle对象;
(2) 输入1行半径,创建一个Circle对象;
(3) 将两个对象的周长加总输出,将两个对象的面积加总输出。
实验代码:
package e; import java.util.Scanner; public class H { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("请输入长方形的长与宽:"); int length = in.nextInt(); int width = in.nextInt(); Rectangle a = new Rectangle(length, width); System.out.println("长方形周长:" + a.getPerimeter()); System.out.println("长方形面积:" + a.getArea()); System.out.println("输入圆半径:"); int r = in.nextInt(); Circle b = new Circle(r); System.out.println("圆的周长为:" + b.getPerimeter()); System.out.println("圆的面积为:" + b.getArea()); System.out.println("长方形和圆的周长之和=" + (a.getPerimeter() + b.getPerimeter())); System.out.println("长方形和圆的面积和=" + (a.getArea() + b.getArea())); } } class Rectangle { private int length; private int width; public Rectangle(int l, int w) { length = l; width = w; } public int getPerimeter() { int Perimeter = (length + width) * 2; return Perimeter; } public int getArea() { int Area = length * width; return Area; } } class Circle { private int radius; double Pi = 3.14; public Circle(int r) { radius = r; } public double getPerimeter() { double Perimeter = 2 * Pi * radius; return Perimeter; } public double getArea() { double Area = Pi * radius * radius; return Area; } }
实验结果:
四、实验总结
本次实验有好几个书上的例子,通过学习代码,理解用户自定义类的定义;掌握对象的声明; 学会使用构造函数初始化对象;使用类属性与方法的使用掌握使用;稍微掌握package和import语句的用途。
写代码的过程中有很多问题,有的代码可以看懂,但自己写的时候问题依旧很多,希望在今后的学习中可以提高这方面的能力。