Java第三次作业--计科1501刘晓灿


一、学习总结

1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明。
  • 面向对象的封装性:
    • 指对外不可见,保证数据安全性;
    • 如在java中一个类里面定义了一个private属性的变量,这个变量只能在此类中访问,其他类不能访问由此构成了封装,只能用setter和getter方法设置和取得。
  • 具体例子:
package test;
class Person{
    private String name;//封装
    private int age;//封装
    public void setName(String name){
        this.name=name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public String toString(){
        return (name+"的年龄为:"+age);
    }
}
public class Test {
    public static void main(String[] args){
        Person per=new Person();
        per.setName("李四");//通过set方法实现对私有属性的访问
        per.setAge(20);
        System.out.println(per.toString());
    }
}
2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。

(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类中定义为了私有的变量,只能本类的访问不能跨类访问.应用set,get方法。

(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是非静态变量,而非静态变量是通过对象来引用的,在名为method的static方法中并不存在对象。而static声明的变量可以不通过对象的引用直接访问,应该将x改为静态变量如:static int x = 50;
3 . 使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出了测试类代码和Book类的部分代码,将代码补充完整。
class Book{
    int bookId;
    String bookName;
    double price;
    // 声明静态变量  
    //定义静态代码块对静态变量初始化  
    //构造方法 
     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;
    }  
    //定义方法求图书总册数
    //重写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());
        }
    }   
}

补充完整的程序:

package test;
class Book{
    int bookId;
    String bookName;
    double price;
    static int sum;// 声明静态变量  
    static{//定义静态代码块对静态变量初始化 
        sum=1000;
    } 
    public Book(String bookName, double price) {//构造方法
        this.bookName=bookName;
        this.price=price;
        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 String toString(){//重写toString方法
        return ("编号:"+bookId+"\t书名:"+bookName+"\t书价:"+price);
    }
    public  static int totalBook() {    //定义方法求图书总册数
        return sum-1000;
    }
}
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());
        }
    }   
}
4.什么是单例设计模式?它具有什么特点?用单例设计模式设计一个太阳类Sun。
  • 单例设计模式:就是保证一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
  • 单例设计模式特点:
    • 一个类只能有一个实例
    • 自己创建这个实例
    • 整个系统都要使用这个实例
  • 饿汉式单例Sun类:
public class Sun {
    private Sun(){}
    private static Sun temp=new Sun();//实例化
    public static Sun getTemp(){//提供外部直接访问本类的静态方法
        return temp;
    }
}
  • 懒汉式单例Sun类:
public class Sun {
    private static Sun temp=null;
    public static  Sun getTemp(){
        if(temp==null)
            temp=new Sun();
        return temp;
    }
}
5.理解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
  • 原因:(经过老师指出并查阅相关资料我所理解的)
    • 在str字符串是String类,定义它时在main栈指向的堆内存中开辟空间存放了“你好”副本,在change方法传递时,另在change栈指向的堆内存中另开辟空间存放“hello”,所以当进行值传递时并不能改变副本。
    • ch数组,定义时它在main栈ch指向的堆内存中开辟空间存放w o l l d,在引用时change栈ch指向main栈ch所指向的堆内存空间,和在将ch【0】改变时,即改变了main栈ch所指向的wolld中的w。
6.其他学习总结
  • 关于static方法:
    • static方法为静态方法,static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。
    • 主要用途:可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。
  • 静态变量和非静态变量的区别:
    • 静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
    • 而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

二、实验总结

1.职工表
  • 程序设计思路:
    • 创建四个类分别为:日期类、职工类、部门类和测试类。
    • 日期类里:有私有成员和其初始化的构造方法、一个返回日期为XXXX-XX-XX形式的方法。
    • 职工类里:有私有成员和其初始化的构造方法、各个私有成员get和set方法、在员工中保存部门信息方法和toString方法(toString方法中调用日期类里的方法)。
    • 部门类里:有私有成员和其初始化的构造方法、各个私有成员get和set方法、在部门中保存多名员工信息方法、在部门中保存一个或零个经理方法和toString方法。
    • 测试类里:先产生独立对象;然后设置员工和部门的关系、部门和部门经理的关系;最后输出部门、员工、经理等相关信息。
  • 未发现问题
2.计算体积表面积
  • 程序设计思路:
    • 创建三个类分别为:两个测试类和一个计算类。
    • 计算类里:有私有成员和将其初始化的重载构造方法;有求球体、圆柱体、团椎体的体积和表面积的方法(其中的每个方法都四舍五入结果后返回)。
    • 第一个测试类里:while循环里:让用户输入要计算的几何体,之后输入相关变量(如半径、母线长和高),然后调用计算类的相关方法求体积和表面积并分别加和。跳出循环标志为用户输入“退出”时;最后分别输出加和。
    • 第二个测试类里:while循环里:用产生随机数来表示控制要计算的几何体类型,之后产生相关尺寸变量的随机数,后让用户分别输入其表面积和体积,后判断用户回答正确与否;跳出循环标志为用户输入“退出”时。
  • 问题1:运行时出现如下问题:
    1079821-20170406141451378-979854509.png
  • 原因:将判断输入的半径是否合法的临时变量写错位置
  • 解决方案:将boolean temp=true;写到while循环里面如图:
    1079821-20170406141545722-1833628010.png
3.评分系统
  • 程序设计思路:
    • 创建两个类分别为测试类和选手类
    • 选手类里:有相关私有成员和将其初始化的构造方法;有求最大分、最小分、最终成绩、排序和两种toString方法。
    • 测试类里:先让用户输入五个选手的编号和姓名存放在两个数组中;再在循环中:让十位评委给选手评分,并创建一个对象数组,将每位选手的编号、姓名、十个成绩通过构造方法给对象初始化,最后输出选手评分信息;最后将选手排序并输出相关信息。
  • 问题1:运行时出现如下图问题:
    1079821-20170406172851097-1441316627.png
  • 原因:忘记给所创建的对象数组调用构造方法赋值。
  • 解决方案:在十位评委评分后调用构造方法。部分代码如下:
for(i=0;i<player.length;i++){//分别给这五位选手评分
    System.out.println("请十位评委给"+name[i]+"打分:");
for(j=0;j<grade.length;j++)
    grade[j]=in.nextDouble();
player[i]=new Player(no[i],name[i],grade);
System.out.println(player[i].toString());
}
4.猜拳游戏
  • 程序设计思路:
    • 创建四个类分别为:电脑、玩家、游戏和测试类
    • 在电脑类中:有相关私有成员和将其初始化的构造方法;有各属性的set,get方法,加分方法,和出拳方法;出拳方法中产生随机数0、1、2并返回值。
    • 在玩家类中:有相关私有成员和将其初始化的构造方法;有各属性的set,get方法,加分方法,和出拳方法;出拳方法中让用户输入1、2、3并返回值。
    • 在游戏类中:定义电脑对象、玩家对象;有初始化方法、开始方法、最终结果方法;①在初始化方法中打印游戏名和规则并让用户输入电脑和玩家名;②在开始方法中循环调用出拳方法,输出玩家和电脑出的拳,然后比较判断谁赢并加分、累加猜拳次数,循环终止标识志为用户输入“n”时。③在最终结果方法中输出对局次数、平局次数、电脑和玩家得分、并比较总得分并输出最终谁赢。
    • 在测试类中:定义Game对象,调用初始化方法、开始方法、最终结果方法。
  • 问题1:运行时出现如下图问题:
    1079821-20170406204003785-1464835637.png
  • 原因:在玩家类的猜拳方法中关闭了Scanner input=new Scanner(System.in);导致后续无法输入。
  • 解决方案:删除此句。部分代码如下:
public int show(){
    int choice;
    Scanner input=new Scanner(System.in);
    System.out.println("请出拳:1.石头 2.剪刀 3.布");
    choice=input.nextInt();
    return choice;
}

三、代码托管(务必链接到你的项目)

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

转载于:https://www.cnblogs.com/nuanxinwuyu/p/6673396.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值