《Java技术》第三次作业

Java第三次作业


一 . 学习总结

1.面向对象的封装性,Java中实现封装性方法

  • 面向对象的封装性:
    就是保护对象的某些内容,保证某些属性或方法不被外部看见。
  • 封装的实现 :
    为属性封装 : private 属性类型 属性名称;
    为方法封装:private 方法返回值 方法名称(参数列表)
    注意:封装后的内容外部无法调用,需要编写setter与getter方法完成调用。
  • 实例 :
        class Personal{
        private String name;		//声明姓名属性
        private int age;			//声明年龄属性
        public void setName(String n){ //setter设置姓名属性
	        name = n;
        }
        public void setAge(int a){ //setter设置年龄属性
	        if(a>=0 && a<=150){
		        age = a;
	        }
        }
        public String getName(){ //getter取得属性
	        return name;
	    }
	    public int getAge(){ //getter取得属性
    	    return age;
        }
	    public void tell(){ 
	        System.out.println("name is :" + name + ", age is :" + age);
	        //System.out.println("name is :" + this.getName() + ", age is :" + this.getAge());
	    }
    }
    public class EncDemo02 {
        public static void main(String args[]){
    	    Personal per = new Personal();	//声明并实例化对象
    	    per.setName("zhaojianyu");	//调用setter设置姓名
    	    per.setAge(21);				//调用setter设置年龄
    	    per.tell();
	    }
    }

2.static关键字

  • (1) static 关键字的调用
  • 用private对属性进行封装时,需要使用setter,getter方法进行调用,但是此程序只需要把private修改为static就可以进行++运算,static类型的属性是所有对象共享的。
  • 修改后代码 :
        class test {
            static int secret = 5;
        }
        public class Test {
            public static void main(String args[]) {
	            test a = new test();
	            System.out.println(a.secret++);
            }
        }
  • (2) static 关键字的静态引用
  • 当声明X变量时,应该定义为static类型,static只能调用static内容。
  • 修改后代码 :
    public class Test{
        static int x = 50;
        static int y = 200;
        public static void method(){
            System.out.println(x+y);
        }
        public static void main(String args[]){
            excise.method();
        }
    }

3.Book类

  • 修改后代码 :

        class Book {
        //对属性进行封装
        private int bookId;
        private String bookName;
        private double price;
    
        // 声明静态变量
        private static int bookNum;
    
        // 定义静态代码块对静态变量初始化,只执行一次
        static {
            bookNum = 1000;
        }
    
        // 构造方法
        public Book() {//无参方法
    
        }
    
        public Book(String bookName,double price) {
            this.bookName = bookName;
            this.price = price;
            bookId = bookNum;
            bookNum++;
        }
    
        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(){
            int bookSum = bookNum - 1000;
            return bookSum;
        }
    
        // 重写toString方法
        public String toString(){
            return "图书编号 : " + bookId + "  " + "图书名称 : " 
        + this.bookName + "  " + "图书价格 : "  + this.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());
                }
            }
        }
    

4.单例设计模式的含义与特点

  • 含义 :
    单例模式是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类。
  • 特点 :
    1.某个类只能有一个实例
    2.它必须自行创建这个实例
    3.它必须自行向整个系统提供这个实例
  • 实例 :
  • 第一种方式 : 饿汉式单例类
        public class Sun {
            private Sun(){}
        //注意这是private 只供内部调用
        private static Sun instance = new Sun();
        //这里提供了一个供外部访问本class的静态方法,可以直接访问  
        public static Sun getInstance() {
            return instance;   
            } 
        } 
    
> * 第二种方式 : 懒汉式单例类


            public class Sun { 
            private static Sun instance = null;
            public static synchronized Sun getInstance() {
            //这个方法比上面有所改进,不用每次都进行生成对象,第一次调用时初始Sun,以后就不用再生成了   
            //使用时生成实例,提高了效率
            if (instance == null)
                instance = new Sun();
                return instance;   
                } 
            } 

5.Java参数传递机制

  • 运行结果 :
    你好 Wolld
  • 运行结果原因 :

栈与堆的关系:

                public class excise {
                String str = new String("你好  ");
                char[] ch = { 'w','o','l','l','d' };
                public static void main(String args[]) {
                    excise test = new excise();
        	        test.change(test.str, test.ch); 
                    System.out.println(test.str);
                    System.out.println(test.ch);
                }
                public void change(String str, char ch[]) {
                    str = "hello";
                    ch[0] = 'W';
                }
            }

6.其他知识总结

  • 简单类设计的步骤:
  • 首先,建立简单的程序框架,也就是你需要写几个类来完成你的程序
  • 其次,为你创建的每个类声明相应的属性,并未其调用setter与gstter方法
  • 接着,构造无参方法,有参方法,参数为你创建的属性,为其赋值,用this关键字
  • 然后,写出toString()方法,对属性值进行输出
  • 最后,在主方法中,构造对象,利用对象,有逻辑的调用你的类中的方法,从而完成程序的要求
  • 重要的是 : 遇见困难不要马上去问别人,自己缕清思路再进行修改

二 . 实验总结

1.日期类,部门类,员工类,测试类

  • 程序设计思路:
    按照要求创建四个类,每个类声明相应的属性并封装,再进行setter与gstter方法的调用,创建无参构造方法,再创建有参构造方法,最后用toString()方法进行输出属性值。在类与类之间有相应的联系,进行关联操作,最后在测试类里进行构造对象数组,对象调用方法,进行测试与输出信息。

  • 问题1:
    在测试类进行创建员工类对象数组时,忘记在部门类对员工类对象数组进行关联

  • 原因:没有真正明白类之间的关系与如何创建关联

  • 解决方案:
    在部门创建员工类对象数组,接着调用setter与gstter方法,在主方法进行实例化

         //在部门类创建对象数组
         private Employee emps[];
         public Employee[] getEmps() {
             return emps;
         }
         public void setEmps(Employee[] emps) {
             this.emps = emps;
         }
         //主方法进行实例化
         Employee[] emps = { new Employee(此处加入员工信息,与在员工类创建的有参构造方法一样的参数),
     		new Employee(),
     		new Employee(),
     		new Employee(),
     		new Employee(),};
    

2.计算工具类,测试类1,测试类2

  • 程序设计思路:
    按照创建三个类,在计算工具类声明相应的属性并调用setter与gstter方法,创建无参与有参构造方法,在测试类中调用计算工具类的方法实现要求

  • 问题1:
    在测试类2中,声明用户,对其计算结果进行判断,用户分别计算六个题输入答案,不知如何进行简单的判断,出现了重复语句多次

  • 原因:
    搞不清自己想要怎么判断,思路不清晰

  • 解决方案:
    把用户的答案放入数组,把你计算的答案放入数组,利用循环进行判断,就可以不重复输出

             //对数组进行动态实例化
             double[] m = new double[6];
             double[] s = new double[6];
             //对用户答案分别进行判断
             for (int i = 0; i < 6; i++) {
     	        if (s[i] == m[i]) {
     		        System.out.println("恭喜您第" + (i+1) +                                              "题答对啦~~~~~~");
     	        } else {
     		        System.out.println("很遗憾您第" + (i+1) +                                            "题答错了~~~~~~");
     	        }
             }
    

3.面向对象的评分系统

  • 程序设计思路:
    创建两个类,选手类与测试类,声明相应的属性并调用setter与gstter方法,创建无参与有参构造方法,按照要求完成输出信息

  • 问题1:
    开始不知道如何使用Comparable接口的compareTo方法

  • 原因:
    没有研究明白两个对象比较的关系

  • 解决方案:
    看书对例子进行研究后明白了如何使用,代码如下 :

         public int compareTo(Player a) {
         if (this.pgrade > a.pgrade) {
     	    return 1;
         } else if (this.pgrade < a.pgrade) {
     	    return -1;
         } else {
     	    return 0;
         }
    

4.猜拳游戏

  • 程序设计思路:
    创建了三个类,电脑游戏者类,个人游戏者类,还有测试类,在测试进行对游戏的控制

  • 问题1:
    计算每个人赢的次数时,比较的是电脑类与个人类的出拳结果

  • 原因:
    这两个类的结果返回值类型是void,所以在主方法中无法判断两者是否相等,以至于无法计算

  • 解决方案:

             //ComputerPlayer类
             public String gameBagin() {
                 //代码段
     	        return str;//这里的str是出拳结果
         	}
    
    
             //PersonPlayer类
             public String gameBagin() {
                 //代码段
     	        return str;//这里的str是出拳结果
         	}
         	
             在主方法中,创建电脑类与个人类的对象,调用各自的出拳方法,并赋值给两个字符串,进行判断
    

三 .代码托管

  • 码云commit历史截图


四 .学习进度条

进程 代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2-4周 500/500 45/45 自学了前四章的内容,自己练习了学习过程中的所有代码,并写了一些练习题提交到了码云中
第5周 200/700 15/55 学习了老师要求的内容
第6周 300/1000 15/70 学习了作业中要求的内容

原文地址:https://www.cnblogs.com/Melody-529/p/6654465.html