• 201521123076《java程序设计》第三周学习总结


    1. 本周学习总结

    2.书面作业

    • Q1.代码阅读

        		public class Test1 {
        	    private int i = 1;//这行不能修改
        	    private static int j = 2;
        	
        	    public static void main(String[] args) {
        	        geti();
        	        Test1getj();
        	    }
        	
        	    public static void geti() {
        	        System.out.println(i);
        	    }
        	
        	    public static void getj() {
        	        System.out.println(j);
        	    }
        	
        	}
      

    以上代码可否编译通过?哪里会出错?为什么?尝试改正?如果创建3个Test1对象,有内存中有几个i,几个j?请分析原因?

    A1:在Test1getj(); System.out.println(i);这两条语句不能通过编译,因为在静态方法geti()中调用了非静态属性‘i’,调用类的方法的格式为类.方法。
    改正:Test1.getj(); 在geti()中实例化一个Test1的对象,用对象.i即可;
    如果创建3个Test1对象,内存中有3个i,1个j;原因:静态属性为类的属性,非静态属性为对象的属性,新建三个Test1对象,Test1类只初始化了一次。

    • Q2.构造函数有什么用?其编写格式是什么?如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数?

    A2:构造函数对类进行初始化操作;编写格式为 pubilc ClassName(有参或无参){...};如果一个类不写构造函数,系统默认给它一个无参的构造函数;如果一个类中只有带参的构造函数,它就没有没有不带参数的默认构造函数。

    • Q3.使用java.lang.Math类的函数时,为什么不需要new?如果new Math()会产生什么错误?分析原因?

    A3:会出现‘The constructor Math() is not visible’错误,即构造函数 Math()是不可见的。
    我们来看Math类的部分源代码:

    	public final class Math {
    	
    	    /**
    	     * Don't let anyone instantiate this class.
    	     */
    	    private Math() {}
    	
    	    /**
    	     * The {@code double} value that is closer than any other to
    	     * <i>e</i>, the base of the natural logarithms.
    	     */
    	    public static final double E = 2.7182818284590452354;
    	
    	    /**
    

    可以很清楚地看到’ Don't let anyone instantiate this class.’ 编写Math类的人不让我们实例化它。
    Math类中的方法都是静态方法,静态方法属于类,所以调用数学方法的时候直接用类.方法()即可,无需new一个对象来使用,而 ‘private Math() {}’的存在,也不让我们new;

    • Q4.什么是重载?什么是构造函数重载?在java.lang.Math类中举出1个函数重载的例子?怎么才能区分两个重载函数?

    A4:重载即多个方法拥有相同的方法名但参数不同,可以是参数类型不同,参数个数不同,参数顺序不同。要注意的是,只有返回类型不同不能算是重载(编译不能通过)。下图为Math类max函数重载的例子,至于怎么区分?看其参数情况吧。

    • Q5.final修饰的变量不能改变,为什么如下代码可以正常运行?

        final int[] NUMBS= {1,2,3,4,5};
        NUMBS[2] = 1; 
      

    A5:要注意,这里final修饰的是NUMBS这个数组对象,即这个对象的引用不能被修改,而非这个引用所指向的一系列值不能被修改。若:NUMBS = null;就会发生错误,它让被final修饰的NUMBS对象重新指向null,当然不行。

    • Q6.阅读代码EmployeeTest.java,回答:
      为什么其属性均为private?这样设计有什么好处?
      为Employee类增加一个无参构造函数,调用其有参构造函数,设置name为雇员1, salary为3000, hireDay的年月日为2017年3月5日。(粘贴代码)
      为Employee类再增加一个有参构造函数,参数只有name与salary,hideDay为当前日期。(粘贴代码)

    A6:属性设置为private的目的是为了不让其他人直接修改属性值,而只能通过封装类的人提供的方法进行操作,这样就对这些信息起到了保护效果。

    	public Employee()
    	{
    	    this("雇员1", 3000.0, 2017, 3, 10);   //name,salary,year,month,day; 
    	}
    
    
    	public Employee(String n, double s) {
    	    name = n;
    	    salary = s;
    	    Calendar  calendar = Calendar.getInstance();
    	    hireDay = calendar.getTime();
    	}  
    
    • Q7.编写函数public static boolean isMondayToFriday()

    功能:判断今天如果是周一到周五,直接输出如“上班时间”并返回true,否则输出“休息时间”。
    提示:使用LocalDateTime, DayOfWeek

    	public static boolean isMondayToFriday(){
    	        LocalDateTime now = LocalDateTime.now();  
    	        DayOfWeek week = now.getDayOfWeek();
    	        //System.out.println(week.getValue());
    	        if(week.getValue()>=1&&week.getValue()<=5){
    	        	 System.out.println("上班时间");
    	        	return true;
    	        }
    	        System.out.println("休息时间");
    	            return false;
    	    }  
    
    • Q8.Runnable Jar(可选)
      我们以前编写的程序,必须打开Eclipse或者将相应的.class文件拷贝出来在命令行下执行相应命令才能运行,如果.class文件较多且类文件中有包名,需要将完整的目录结构及文件拷贝出来,才能运行。现在希望将Eclipse项目中的Java文件打打成一个可运行的jar包,在命令行直接运行。改造题目7,使其从命令行接收参数,参数为年-月-日,将项目打成jar包,然后在命令行通过java -jar运行,并截图。

        	 public static boolean isMondayToFriday(){
        	        Scanner in = new Scanner(System.in);
        	        String now1 = in.nextLine();
        		String[] sourceStrArray = now1.split("-");
        	        int year = Integer.valueOf(sourceStrArray[0]);
        	        int month =  Integer.valueOf(sourceStrArray[1]);
        	        int day = Integer.valueOf(sourceStrArray[2]);
        	        LocalDateTime now = LocalDateTime.of(year,month,day,1,1);
        	        DayOfWeek week = now.getDayOfWeek();
        	        if(week.getValue()>=1&&week.getValue()<=5){		
        	        	 System.out.println("上班时间");
        	        	return true;
        	        }
        	        System.out.println("休息时间");
        	            return false;
        	    }  
      

    实验截图:

    3. 码云代码提交记录截图:

    4. PTA实验

    • 题目集:jmu-Java-03-面向对象1-基础-封装继承 中的编程(5-1, 5-2, 5-3)

      • 5.1 掌握了构造函数,Override Of toString(),创建对象数组。

      • 5.2 更进一步了解了类-对象之间的一些联系。static属性和静态块与初始化块的搭配使用来完成一些需求。如获悉已经实例化多少个对象(本题通过id的值来判断)。

      • 5.3 IDE的自动生成Getter,Setter,toString()为我们提供了极大的便利。

  • 相关阅读:
    图解iPhone开发新手教程
    究竟什么是关系数据库?
    【设计模式】模板方法模式
    SoftReference
    OpenCV在ARM上的移植
    Luci流程分析(openwrt下)
    delete
    delete
    浅析busybox-1.12.0中ash的脚本命令局限性
    shell总结:读取文件、参数、if、分割字符串、数组长度、空文件、变量赋值、多进程、按行切割文件、查看线程
  • 原文地址:https://www.cnblogs.com/slickghost/p/6534787.html
Copyright © 2020-2023  润新知