1. 本周学习总结
初学面向对象,会学习到很多碎片化的概念与知识。尝试学会使用思维导图将这些碎片化的概念、知识组织起来。请使用纸笔或者下面的工具画出本周学习到的知识点。截图或者拍照上传。
2. 书面作业
- 代码阅读
public class Test1 {
private int i = 1;//这行不能修改
private static int j = 2;
public static void main(String[] args) {
geti();
Test1.getj();//是漏了点号吗?
}
public static void geti() {
System.out.println(i);
}
public static void getj() {
System.out.println(j);
}
}
以上代码可否编译通过?哪里会出错?为什么?尝试改正?
如果创建3个Test1对象,有内存中有几个i,几个j?请分析原因?
答:不能通过,放入eclipse中马上报错显示
原来是因为静态方法中不能调用非静态成员。
如果要修改的话按照提示可以马上修改好,但是因为限制了不能修改第一行,所以好像就没有那么容易了,但是当我们了解了为什么静态方法不能调用非静态成员的原因后调用静态方法或属性可以不用new对象,但是非静态方法或属性需要new对象才能使用,如果非静态变量已经创建了对象那么静态方法就能调用所以可以这样
public static void geti(){
System.out.println((new Test1().i);
}
如果创建3个Test1对象,有内存中有3i,1j.
因为非静态变量成员属于每一个对象,而静态成员属于类。
- 构造函数有什么用?其编写格式是什么?如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数?
答:构造函数
- 作用:对类进行初始化
- 编辑格式:构造函数的名称和类名相同/无返回类型/可以带参或者不带参。
举个例子
public class Test{
public Test(){
System.out.println("Test is initializing!");
}
public static void main(String args[]){
Test test = new Test();
}
}
- 有构造函数,系统会默认一个无参构造方法
- 如果自己编写了带参的构造函数,系统就不会提供不带参的构造函数了,需要自己编写。不信可以用eclipse验证一下。
- 使用
java.lang.Math
类的函数时,为什么不需要new?如果new Math()会产生什么错误?分析原因?
答:查看源代码
我们发现java.lang.Math
函数是用静态定义的,而使用静态的方法可以不用new一个对象。
如果new Math(),我们看到上面的图片已经显示了---由于构造函数被声明为私有的,就是说明不能被外部调用,所以不能调用new Math(),并且Don't let anyone instantiate this class也说明不会产生Math对象。
- 什么是重载?什么是构造函数重载?在java.lang.Math类中举出1个函数重载的例子?怎么才能区分两个重载函数?
答:
重载就是方法重名参数不同,
理解了重载,构造函数的重载理解起来也容易多了,用相同的类名不同的参数来初始化一个类。
同样可以查看源代码找例子,但是因为代码比较多容易看乱我们需要更简洁的界面这是就可以用老师之前给我们的
来找例子
很快我们就找到了
我们要善用这个文件啊。
区分两个重载函数可以通过看他们的参数来区别
- final修饰的变量不能改变,为什么如下代码可以正常运行?
final int[] NUMBS= {1,2,3,4,5};
NUMBS[2] = 1;
答:
回答这题还是比较困惑的,但是只要我们搞清楚什么是对象和对象的变量就还是能理出思路的,如果上课认真听的话我们就会发现这么一句话-----final修饰引用类型变量,变量的值(引用)不能修改,但是变量指向的对象的值可以修改。所以这段代码是可以运行的。
- 阅读代码EmployeeTest.java,回答:
1.为什么其属性均为private?这样设计有什么好处?
答: 因为这样才能保证类的封装性,只允许在类的内部访问不能再外部访问,保证了安全性私密性等,如果要访问就要用setter/getter。
2.为Employee类增加一个无参构造函数,调用其有参构造函数,设置name为雇员1, salary为3000, hireDay的年月日为2017年3月5日。(粘贴代码)
答: 我们发现在一个构造函数中调用另一个构造函数用this最方便了
public Employee(){
this("雇佣1",3000,2017,3,5);
}
3.为Employee类再增加一个有参构造函数,参数只有name与salary,hideDay为当前日期。(粘贴代码)
答:同样的用this,
public Employee(String n, double s){
this(n,s,Calendar.getInstance().get(Calendar.YEAR),Calendar.getInstance().get(Calendar.MONTH)+1,
Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
}
- 编写函数
public static boolean isMondayToFriday()
功能:判断今天如果是周一到周五,直接输出如“上班时间”并返回true,否则输出“休息时间”。
提示:使用LocalDateTime, DayOfWeek
参考资料:
JAVA 8:健壮、易用的时间-日期API - ImportNew.pdf
Java8DateTimeTest.java
public static boolean isMondayToFriday(){
LocalDateTime now = LocalDateTime.now();
DayOfWeek dayOfWeek = now.getDayOfWeek();
if(dayOfWeek!=DayOfWeek.SATURDAY && dayOfWeek!=DayOfWeek.SUNDAY){
System.out.println("上班时间");
return true;
}
else{
System.out.println("休息时间");
return false;
}
}
- Runnable Jar(可选)
我们以前编写的程序,必须打开Eclipse或者将相应的.class文件拷贝出来在命令行下执行相应命令才能运行,如果.class文件较多且类文件中有包名,需要将完整的目录结构及文件拷贝出来,才能运行。现在希望将Eclipse项目中的Java文件打打成一个可运行的jar包,在命令行直接运行。改造题目7,使其从命令行接收参数,参数为年-月-日
,将项目打成jar包,然后在命令行通过java -jar
运行,并截图。参考文件如下: