>第二次作业

时间:2022-09-05 21:53:26

(一)学习总结

-1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
构造方法:它是一个与类同名且返回值类型为同名类型的方法。构造方法用于在创建对象时对其进行初始化。
- Person per = new Person() ;
-特点:
-①方法名与类名相同;
-②方法名前没有返回值类型的声明,方法中不能使用return语句返回一个值;
-③用户不能直接调用,而是通过关键字new自动调用
?? -④在构造方法的实现中,也可以进行方法重载
-构造方法的重载:就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。

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 Test1.main(Test1.java:4)
-原因:没有对对象进行实例化,数组里每一个对象都是null。
-修改:对数组里的数通过new构造方法进行实例化。
-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代表的是地址,而不是值。
-4.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
封装把对象的所有组成部分(数据和方法)封装在一起构成类。
对象本身的数据得到保护/隐藏
其他对象通过该对象的访问方法(接口/interface)与之发生联系。
好处
模块化
信息隐藏--通常定义一个公共接口/方法实现对对象的访问。
要对数据进行封装,通常用关键字private声明属性
在JAVA开发的标准规定中,封装属性的设置和取得依靠setter及getter方法完成

setter:设置属性的值

public void setBalance(int balance) {

this.balance = balance;

}

getter:调用该属性的值

public int getBalance() {

return balance;

}
-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的私有属性,不能直接调用。
(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申明,所以method方法中不能调用x.
-6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。

class Book{
int bookId;
String bookName;
double price;
public static int sum;
static {
sum=10;
}
public Book(String bookName,double price) {
this.bookName=bookName;
this.price=price;
this.bookId=sum;
sum++;
}
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 sum;
}
public String toString() {
    return "编号:"+ bookId+"书名:"+bookName+"书的价格:"+price+"图书总册数:"+sum;
}
//重写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。
-单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
public class Sun{
private static Sun instance=null;
public static Sun getInstance(){
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';
}
}
-结果:你好 world
-str是引用类型,用change类型传过来后,释放地址空间,没有改变str中的值,ch是数组,用change方法改变了数组的第一个元素,在通过change方法返回原函数使用。

-9.其他需要总结的内容。

(二)实验总结

本次实验包括实验二和实验三两次的内容:
-1.用面向对象思想完成评分系统
程序设计思路:构造选手类和评委类,在类中写出每个对象的set和get方法,再在类中写Stringto方法,在测试类调用这些方法。
问题1:找最大值和最小值时,输出的值不对
原因:符号搞反了
解决方案:最大值因该是score[i]>score[0]最小值因该是score[i]<score[0]
问题2:测试类get方法的调用
原因:刚开始还不太会用get方法
问题3: public int compareTo函数不知道用来比较那几个

import java.util.Scanner;
import java.awt.print.Paper;
import java.util.Arrays;
public class Person {

public static void main(String[] args) {
    double a;
    String no,na;
    System.out.println("输入选手数");
    Scanner input=new Scanner(System.in);
    int xnum=input.nextInt();//输入选手人数
    Player []people=new Player[xnum];
    System.out.println("输入评委数");
    int pnum=input.nextInt();//输入评委人数
    for(int i = 0; i < xnum;i++){
           System.out.println("输入选手编号");
           no=input.next();
           System.out.println("输入选手姓名");
           na=input.next();
           System.out.println("请为"+na+"号选手打分:");
           judge grade=new judge(pnum); 
           grade.inputscore();
           a=grade.average(); 
           System.out.printf(na+"号选手的最后得分:%.2f\n",(float)a);
           people[i]=new Player(na,no,a);
        }
        Arrays.sort(people);
        System.out.println("排行榜"+"\t");
        for(int i=0;i<xnum;i++){
            System.out.println(people[i].toString());
        }
           
    }

}

public class Player implements Comparable

    public Player(String name, String num,double score) {
        this.name = name;
        this.num = num;
        this.score = score;
    }
    public String getname(){
        return name;
    }
    public void setname(String n){
        this.name = n;
    }
    public String getnum() {
        return num; // 取得编号
    }

    public void setnum(String m){ 

        this.num = m;
    }

    public double getscore() {
        return score;
    }

    public void setscore(double s) {
        this.score = s;
    }

    public String toString(){
        return "编号:"+this.getnum()+"姓名:"+this.getname()+"得分:"+this.getscore() ;
    }
    public int compareTo(Player o) {
        if(this.score>o.score){
            return -1;
        }
        else if(this.score<o.score){
            return 1;
        }
        else{
            return 0;
        }   
    }

}

import java.util.Scanner;
import java.util.Arrays;
public class judge {
private int pnum;//评委人数
double score[]=null;//评委给出的分数
public judge(){

}
public judge(int people){
    pnum = people;
}
public void setpnum(int pnum){
    this.pnum=pnum;
}
public int getjpnum(){
    return pnum;
}
public void setpnum(double[] score){
    this.score =score;
}
public double[] getscore(){
    return score;
}
public void inputscore() {
    Scanner input=new Scanner(System.in);
    double score[]=new double[pnum];
    for(int i=0;i<this.pnum;i++){                                                                  
        score[i]=input.nextDouble();
        this.score=score;
    }
}
public double average(){
        double max=score[0],min=score[0],sum=0,ave;
        for(int i=0;i<pnum;i++) {
            
            if(score[i]>score[0]) {
                max=score[i];
            }
            if(score[i]<score[0]) {
                min=score[i];
                }
            sum+=score[i];
        }
        System.out.println("去掉一个最高分:"+max);
        System.out.println("去掉一个最低分:"+min);
        ave=(sum-max-min)/(double)(pnum-2);
        return ave;
    }

}

2.Email验证
程序设计思路:输入的邮箱需进行查找@和.的位置还需要判断@和.的位置和以com|cn|net|gov|edu|org结尾
问题1:把@和.的位置判断和判断以com|cn|net|gov|edu|org结尾放到了一起,不能反回true。
原因:接收的函数的变量定义的是int型
解决方案:改成boolean型

import java.util.Scanner;
public class Email {

public static void main(String[] args) {
    System.out.println("请输入邮箱地址");
    Scanner input=new Scanner(System.in);
    String str=input.next();
    boolean no=address(str);
    if(no==true) {
        System.out.println("email地址正确");
    }
    else{
        System.out.println("email地址不正确");
    }
    
}
public static boolean address(String str){
    int first,last ;
    first=str.indexOf("@");
    last=str.indexOf(".");
    if((first!=-1&&last!=-1)&&(first<last)&&!(str.startsWith("@"))&&(str.endsWith("com")||str.endsWith("cn")||str.endsWith("net")||str.endsWith("gov")||str.endsWith("edu")||str.endsWith("org"))){
        return true;
    }
    return false;
}

}

3.查找子串
程序设计思路:将字符串转化成字符数组,再比较
问题1:不知道怎么写
原因:不知道怎么比较
解决方案:听别人讲的
问题2:在循环里写的i的增量我觉得应该是加上b数组的长度,可是不对,而且在比较时不明白为什么用a[i]=b[0]来判断

import java.util.Scanner;
public class Zifu {
public static void main(String[] args) {
System.out.println("请输入一串字符串");
Scanner input=new Scanner(System.in);
String no=input.next();
System.out.println("请输入指定字符串");
String num=input.next();
System.out.println(find(no,num));
}
public static int find(String no,String num){
int sum=0;
char a[]=no.toCharArray();
char b[]=num.toCharArray();
if(no.contains(num)) {
for(int i=0;i<a.length;i++) {
if(a[i]==b[0]) {
sum++;
}
}
}
return sum;
}
}

4.统计文件
程序设计思路:输入的字符串通过,来拆分
问题1:不会把首字符变成大写
原因:不能准确的理解函数,运用函数。
解决方案:问的别人
问题2:输出的时候越界了
原因:输出的时候s[x].substring(1,s[x].length()写的是s[x].substring(1,s[x].(length-1)()
解决方案:输出的时候因该是s[x].substring(1,s[x].length()

import java.util.Scanner;
public class colect {

public static void main(String[] args) {
    System.out.println("请输入一串字符串");
    Scanner input=new Scanner(System.in);
    String no=input.next(); 
    num(no);
}
public static void num(String no){ 
    int a=0,b=0,c=0;
     String s[] = no.split("\\,") ; 
        for(int x=0;x<s.length;x++){ 
          
             if(s[x].endsWith(".java")){
                 a++;
             }
             if(s[x].endsWith(".cpp")){
                 b++;
             }
             if(s[x].endsWith(".txt")){
                 c++;
             }
             String n=s[x].substring(0,1);
             System.out.println(n.toUpperCase()+s[x].substring(1,s[x].length()));
            
       }
        System.out.println(".java出现的次数为:"+a); 
        System.out.println(".cpp出现的次数为:"+b);
        System.out.println(".txt出现的次数为:"+c);
        
        
}

}

5.类的设计

程序设计思路:构造日期类和职工类和部门类,在类中写出每个对象的set和get方法,再在类中写Stringto方法,在测试类调用这些方法。
问题1:出现空指针
原因:没有设置关系
解决方案:在测试中设置关系
问题2:输出的时候因为在类中定义的类型不同,调用的时候老出错。
原因:调用查找部门经理时没有调用职工类的getdepartment()方法
解决方案:像调用查找部门经理时先调用职工类的getdepartment()在调用部门类的getmanger()最后在调用toString()方法

public class Test {
public static void main(String[] args) {
Worker w[]={new Worker("0001","王五","男"),
new Worker("0002","赵六","男"),
new Worker("0003","王红","女"),
new Worker("0004","钱三","男"),
new Worker("0005","孙子","男"),
new Worker("0006","柳柳","女"),
new Worker("0007","吴倩","女"),
new Worker("0008","周四","男"),
new Worker("0009","张倩","女"),
new Worker("0010","孙悦","女")
};
Time birthday[]={new Time("1988","01","20"),
new Time("1970","05","18"),
new Time("1968","10","24"),
new Time("1974","07","25"),
new Time("1983","04","20"),
new Time("1976","06","18"),
new Time("1978","01","14"),
new Time("1957","06","24"),
new Time("1987","01","02"),
new Time("1960","02","07")
};

    Time worktime[]={new Time("2008","10","20"),
            new Time("1990","07","18"),
            new Time("1990","01","24"),
            new Time("1996","03","02"),
            new Time("2005","04","04"),
            new Time("2000","06","18"),
            new Time("1999","10","14"),
            new Time("1988","04","04"),
            new Time("2015","10","02"),
            new Time("1996","02","17")
    };
    for(int i=0;i<10;i++){
        w[i].setbirthday(birthday[i]);
    }
    for(int i=0;i<10;i++){
        w[i].setwtime(worktime[i]);
    }
    section d1=new section("1","技术部");
    section d2=new section("2","工程部");
    d1.setnum(new Worker[] {w[0],w[1],w[5],w[7],w[8]});
    d2.setnum(new Worker[] {w[2],w[3],w[4],w[6],w[9]});
    d1.setmanger(w[3]);
    d2.setmanger(w[8]);
    w[0].setdepartment(d1);
    w[1].setdepartment(d1);
    w[2].setdepartment(d2);
    w[3].setdepartment(d2);
    w[4].setdepartment(d2);
    w[5].setdepartment(d1);
    w[6].setdepartment(d2);
    w[7].setdepartment(d1);
    w[8].setdepartment(d1);
    w[9].setdepartment(d2);
    for(int i=0;i<10;i++){
        System.out.printf(w[i].toString());
        System.out.printf("    ");
        System.out.printf("生日:");
        System.out.printf(birthday[i].toString());
        System.out.printf("    ");
        System.out.printf("工作时间:");
        System.out.printf(worktime[i].toString());
        System.out.printf("    ");
        System.out.println("所在部门:  "+w[i].getdepartment().toString());
        System.out.println(w[i].getname()+"的部门经理:"+w[i].getdepartment().getmanger().toString());
        System.out.printf("\n");
    }
        System.out.printf("\n");
        System.out.printf( d1+"\t"+"部门经理:"+w[3].getdepartment().getmanger().toString()+"\n"+"员工:" );
        System.out.printf("\n");
        for(int i=0;i<d1.getnum().length;i++) {
            System.out.printf(d1.getnum()[i].toString() );
            System.out.printf("    ");
            System.out.printf("生日:");
            System.out.printf(birthday[i].toString());
            System.out.printf("    ");
            System.out.printf("工作时间:");
            System.out.printf(worktime[i].toString());
            System.out.printf("    ");
            System.out.printf("\n");
        }
        System.out.printf("\n");
        System.out.printf( d2+"\t"+"部门经理:"+w[8].getdepartment().getmanger().toString()+"\n"+"员工:" );
        System.out.printf("\n");
        for(int i=0;i<d2.getnum().length;i++) {
            System.out.printf(d2.getnum()[i].toString() );
            System.out.printf("    ");
            System.out.printf("生日:");
            System.out.printf(birthday[i].toString());
            System.out.printf("    ");
            System.out.printf("工作时间:");
            System.out.printf(worktime[i].toString());
            System.out.printf("    ");
            System.out.printf("\n");
        }       
}

}

class Time{
private String day;
private String month;
private String year;
private Worker worker;

    public Time(String year,String month,String day) {
        this.day = day;
        this.month = month;
        this.year = year;
    }
    public String getday(){
        return day;
    }
    public void setday(String d){
        this.day = d;
    }
    public String getmonth() {
        return month; 
    }

    public void setmonth(String m){ 
        this.month = m;
    }
    public Worker getworker() {
        return worker; 
    }

    public void setworker(Worker w){ 
        this.worker = w;
    }

    public String getyear() {
        return year;
    }

    public void setyear(String y) {
        this.year = y;
    }

    public String toString(){
        return this.year+"-" +this.month+"-"+this.day;
    }

}

class Worker {
private String num;
private String name;
private String sex;
private Time birthday;
private section department;
private Time wtime;

    public Worker(String num, String name,String sex) {
        this.num = num;
        this.name = name;
        this.sex = sex;
        }
    public String getname(){
        return name;
    }
    public void setname(String na){
        this.name = na;
    }
    public String getnum() {
        return num; 
    }

    public void setnum(String nu){ 

        this.num = nu;
    }

    public String getsex() {
        return sex;
    }

    public void setsex(String se) {
        this.sex = se;
    }
    public Time getbirthday() {
        return birthday;
    }

    public void setbirthday(Time bi){ 

        this.birthday = bi;
    }
    public section getdepartment() {
        return department;
    }

    public void setdepartment(section de) {
        this.department = de;
    }
    public Time getwtime(){
        return wtime;
    }
    public void setwtime(Time wt){
        this.wtime = wt;
    }

    public String toString(){
        return "职工号:"+this.getnum()+"    "+"姓名:"+this.getname()+"    "+"性别:"+this.getsex();
        
    }

}

class section {
private String sno;
private String sname;
private Worker manger;
private Worker num[];
public section(String sno,String sname) {
this.sno = sno;
this.sname = sname;
}
public String getsno(){
return sno;
}
public void setsno(String sn){
this.sno = sn;
}
public String getsname() {
return sname;
}

    public void setsname(String sna){ 
        this.sname = sna;
    }
    public Worker getmanger() {
        return manger;
    }

    public void setmanger(Worker ma) {
        this.manger = ma;
    }
    public Worker[] getnum() {
        return num;
    }

    public void setnum(Worker[] nm) {
        this.num =nm;
    }
    public String toString(){
        return "部门编号:"+this.getsno()+"\t"+"部门名称:"+this.getsname();
    }

}

>第二次作业
https://gitee.com/hebau_java_cs16/Java_CS01lzt