Java第二次作业

(一)学习总结
1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
、、、
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
、、、
构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。而且不管你写不写构造方法,系统都会自动写一个无参数的构造方法
由于构造方法的参数的不同,我们可以重载构造方法,以适应对不同参数的初始化。构造方法的重载可以通过两个方面来重载:参数的不同,以及参数数据类型的不同。
不能通过编译。因为构造函数 Foo()未定义。改成 Foo obj = new Foo(0);
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;
}
、、、

原因为value变量被封装,不能直接输入。
还有arr[1]没有实例化。
、、、
package qqqqqqqqqqqq;

public class qqqqqqqqqqqq {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
arr[1]=new MyClass(100);
arr[1].shuchu();
}
}
class MyClass{
public int value=1;
public MyClass(int value){
this.value=value;
}
public void shuchu(){//输出
System.out.print("结果为"+value);
}
public void setvalue(int a){
value=a;
}
public int getvalue(){
return value;
}
}
、、、

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。
以为“==”做的是地址比较,obj1和obj2的地址不同所以结果为false。
4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
封装性
封装性是面向对象的方法所应遵循的一个重要原则,它有两个含义:一是值把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位(即对象)中,另一层含义值“信息隐蔽”,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为。则不允许外界知道,或只允许适用对象的功能,而尽可能隐蔽对象的功能实现细节 (课本93页)
如何实现封装
属性封装:private 属性类型 属性名称;
方法封装:private 方法返回值 方法名称{}
只要是被封装的属性,必须通过setter和getter方法设置和取得。
用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变量有封装性,字段 A.secret 不可视。
(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();
}
}
、、、
不能,在System.out.println(x+y);有错误,不能对非静态字段 x 进行静态引用。
6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。
、、、
class Book{
int bookId;
String bookName;
double price;

static int x;// 声明静态变量

static{
x=1000; // x=0;//定义静态代码块对静态变量初始化
}
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() {          //重写toString方法
    return "图书编号:"+bookId+",图书名称:"+bookName+",图书价格:"+price;
}

}
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。
、、、
public class Sun{
private static Sun instance=null;
public static synchronized Sun getInstance(){
if(instance==null){
instance=new Sun();
}
return instance;
}
private Sun(){
}
}
、、、
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;
原因为char型传递的是地址,所以结果会改变,而String在传递的时候是新建了一个地址来储存要传递的内容,新地址的内容发生改变,原地址的不会发生改变;
(二)实验总结
1.用面向对象思想完成评分系统

程序设计思路:输入选手数,评委数,然后输入选手信息,让所有评委对输入的选手进行打分,打完分之后将结果排序,去掉最高分和最低分,在算出平均分,将最终的平均分传到选手的信息中,作为选手的成绩;
问题1:不能让选手进行排序
解决方法:我用了c语言中的排序程序,我用的是选手类的数组,先用成绩进行比较用for循环,在设一个选手类的中间变量,如果选手成绩比后一个选手的成绩大,就用中间变量进行置换,以此类推,进行排序。
2.Email验证
1)先用输入e-mail,转换为字符数组,设@的位置为x,“.”的位置为y,x不等于零,y比x大,必须要有这两个字符。
2)截取字符串最后几位字符,化为字符串,进行比较。
无问题
3.查找子串
这个问题我用的是split()分离,如果分离后的部分一共有x个,那么子串就有x+1个。
4.统计文件
老师在课上讲过。
先分离用“,”逗号,在存入数组内,再用“.”分离,把最后的一部分存入一个数组内,在进行统计。
5.类的设计
按照老师问题的写法写即可
(三)代码托管(务必链接到你的项目)

码云提交历史截图
上传实验项目代码到码云,在码云项目中选择“统计-提交”,设置搜索时间段,搜索本周提交历史,并截图。



posted @ 2018-04-01 22:51  苦狂上  阅读(120)  评论(0)    收藏  举报