(一)学习总结
1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? public class Test { public static void main(String args[]) { Foo obj = new Foo(); } } class Foo{ int value; public Foo(int intValue){ value = intValue; } } 构造方法:没有返回值,方法名与类名一样。 构造方法的重载:方法名称相同,参数类型和个数不同。 不能通过编译:已定义有参的构造方法,在编译时编译器不会再自动创建无参构造方法,为防止这种错误,最好在定义一个无参的构造方法。2.运行下列程序,结果是什么?分析原因,应如何修改。
public class Test { public static void main(String[] args) { MyClass[] arr=new MyClass[3]; arr[1].value=100; } } class MyClass{ public int value=1; } 运行结果:Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:4) 原因:只定义了对象数组,开辟空间,没有实例化,数组中的每个对象默认值为null。 修改:arr[1]=new MyClass();arr[1].value=100;3.运行下列程序,结果是什么?说明原因。
public class Test { public static void main(String[] args) { Foo obj1 = new Foo(); Foo obj2 = new Foo(); System.out.println(obj1 == obj2); } } class Foo{ int value = 100; } 结果:false 原因:每次调用new实例化时,系统会分配内存地址给对象,用==判断时是判断的两个对象的地址,因为两个对象的地址不同,所以结果为false。4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
封装性:指对外部不可见。 封装性的实现:通过private修饰符来声明属性和方法实现。 例: package ex02; class Person { String name; String age; public void tell() { System.out.println("姓名"+name+"年龄"+age);}
}
public class Test1{ public static void main(String args[]){ Person per=new Person(); per.name="张三"; per.age="-30"; per.tell(); } } 程序中年龄为-30,本身信息的错误导致最后的结果错误 package ex02; class Person { private String name; private String age; public void tell() { System.out.println("姓名"+name+"年龄"+age);}
}
public class Test1{ public static void main(String args[]){ Person per=new Person(); per.name="张三"; per.age="-30"; per.tell(); } } 加上private 关键字属性信息变为私有,不能直接访问5.阅读下面程序,分析是否能编译通过?如果不能,说明原因。
(1) class A{ private int secret = 5; } public class Test{ public static void main(String args[]){ A a = new A(); System.out.println(a.secret++); } } 编译不能通过。 secret属性为私有,不能由对象直接访问,必须通过setter和getter方法设置和取得。(2)
public class Test{ int x = 50; static int y = 200; public static void method(){ System.out.println(x+y); } public static void main(String args[]){ Test.method(); } } 编译不能通过。x不是static类型,不能再static类型的 method里面使用,应在x前面加static。6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。
class Book{ int bookId; String bookName; double price; static int x;// 声明静态变量static { x=1000;}//定义静态代码块对静态变量初始化public Book(String bookName,double price) {//构造方法 this.bookName=bookName; this.price=price; this.bookId=x; x++;}//构造方法 public String getBookName() { return bookName;}public void setBookName(String bookName) { this.bookName = bookName;}public double getPrice() { return price;}public void setPrice(double price) { this.price = price;}
public static int totalBook() {
return x-1000; } //定义方法求图书总册数public String toString() { return "图书编号:"+bookId+",图书名称:"+bookName+",图书价格:"+price;}//重写toString方法
}
public class Test{ public static void main(String args[]){ Book[] books = {new Book("c语言程序设计",29.3), new Book("数据库原理",30), new Book("Java学习笔记",68)}; System.out.println("图书总数为:"+ Book.totalBook()); for(Book book:books){ System.out.println(book.toString()); } } } 7.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。 单例设计模式:其核心结构中只包含一个被称为单例的特殊类。应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 特点: 1.只提供私有的构造方法。 2.类定义中含有一个该类的静态私有对象。 3.该类只提供一个静态的共有的函数用于创建或获取它本身的静态私有对象。 class Sun{ private Sun move = new Sun(); private Sun(){} public static Sun getmove(){ return move; }
}
8.理解Java参数传递机制,阅读下面的程序,运行结果是什么?说明理由。
public class Test { String str = new String("你好 "); char[] ch = { 'w','o','l','l','d' }; public static void main(String args[]) { Test test = new Test(); test.change(test.str, test.ch); System.out.print(test.str); System.out.print(test.ch); } public void change(String str, char ch[]) { str = "hello"; ch[0] = 'W'; } } 运行结果:你好 Wolld 理由:change没有改变主方法中str的值,char型传递的是地址,结果会改变。(二)实验总结
本次实验包括实验二和实验三两次的内容: 1.用面向对象思想完成评分系统 选手类:定义属性,定义构造方法和相应的set,get方法,toString方法。 评分类:定义属性,定义构造方法和相应的set,get方法,输出成绩方法,求最大值最小值平均值的方法。 2.Email验证 没问题 3.查找子串 调用 substring(int beginIndex)的方法时,取出剩余的字符作为一个新的字符串,应注意新的字符串的长度。 4.统计文件 5.类的设计 (三)代码托管(务必链接到你的项目)