Java.第二次作业
一.学习总结
1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
构造方法:(1)构造方法的名字必须与定义他的类名完全相同,没有返回类型(void也没有);(2)构造方法的调用是在创建一个对象时使用new操作进行的,构造方法的作用是初始化对象;(3)不能被static、final、synchronized、abstract和native修饰,构造方法不能被子类继承。构造方法就是为了给类中成员赋初值
构造方法的重载:(1)必须在同一个类;(2)方法名相同;(3)方法参数个数或参数类型(或参数顺序)不同-----.当调用的时候,填好方法参数时,它会自动判断参数类型,参数类型顺序,个数,然后再调用相应的重载 方法,当匹配不到相应的重载方法,直接编译错误。方法重载是让类以统一的方式处理不同类型数据的一种手段。
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;
}
----结果:存在错误。原因:只声明的对象数组,没有实现对象实例化。该对数组里的每个对象元素,通过new构造方法进行实例化。
修改:为以下程序所示
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
arr[1]=new MyClass();
arr[1].value=100;
System.out.println(arr[1].value);
}
}
class MyClass{
public int value=1;
}
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;
}
----结果:错误。原因:实例化分配空间,类是引用数据类型,两个对象都是通过new开辟的不同的新的空间,所以obj1和obj2分别代表两个对象的地址,两个新开辟的地址空间不同。
4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
面向对象的封装性:通过定义类并且给类的属性和方法加上访问控制来抽象事物的本质特性。封装就是定义一个类,然后给该类的属性(成员变量)和方法加上访问控制修饰词(public,private,protected,默认包访问权限),使得该类的属性和方法对于类外部来说的隐藏。
Java中实现封装性的方法:封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法。(1)修改属性的可见性,限制访问;(2)设置属性的读取方法;(3)在读取属性的方法中,添加对属性读取的限制。
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属于A类的私有属性private,不能在类外直接访问。
(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();
}
}
----该程序不能通过编译。原因:ethod只能访问被static修饰的变量,x不是静态变量不能在static里面调用,且x没有被static修饰。
6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。
class Book{
int bookId;
String bookName;
double price;
// 声明静态变量
public static n;
//定义静态代码块对静态变量初始化
static{
n=0;
}
//构造方法
public Book(String bookName,double price ){
this.bookName=bookName;
this.price =price ;
n++;
this.bookId=1000+n;
}
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 int totalBook(){
return n;
}
//重写toString方法
public string toString(){
return "编号"+bookld+"书名"+bookName+"价格"+"price "+"图书总数目为"+n;
}
}
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 instance = new Sun();
private Sun(){
}
public static Sun getInstance(){
return instance;
}
}
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是新开辟的空间指向你好,而Test里面并没有变,释放地址空间,没有改变主方法中str的值。char数组调用change方法改变了ch第一个字符之后传到main函数。
二.实验总结
1.用面向对象思想完成评分系统
设计思路:定义选手类,评分类,还有测试类,及其基本属性;选手类中使用定义构造方法、getter和setter方法、toSting方法;在评分类里面进行评委的打分输入分数,并利用循环进行比较,输出最大值,最小值,平均值;测试类进行排名,借助计算出的平均值进行输出。
问题:开始的代码,计算最大最小值和平均值那块儿有错误。
解决方法:构造相应的方法,利用循环比较。
2.Email验证
设计思路:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )
在main方法中对该方法进行测试。
利用布尔类型的设置,进行逐一判断,是否符合要求。
3.查找子串
设计思路:编写一个方法,查找在一个字符串中指定子串出现的次数。在main方法中输入字符串和查找的子串,对该方法进行测试。如输入 abcbcaadbca,bc,则输出3
问题:不能实现要求查询的字符串的个数,有待完善。现有程序只能在输入的一个字符串,输出各个字符出现的次数。
4.字符串统计文件
设计思路:输入一个字符串,包含各种文件类型的文件名。文件名之间用“,”分隔,要求将各个文件名的首字母大写后分别输出,并统计各种类型文件的文件个数。
5.类的设计
设计思路:(1)设计一个日期类,用于记录年、月、日,提供对日期处理的常用方法(日期输出格式xxxx-xx-xx)。
(2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加工作时间,设计相应的方法。
(3)设计一个部门类,包括下列属性:部门编号,部门名称,经理,设计相应方法。
(4)设计一个测试类,采用对象数组模拟一个拥有两个部门,10个职工的单位,实现对相关信息的查询功能。