《Java程序设计》第3周学习总结
1. 本章学习总结
2. 书面作业
1. 代码阅读
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?
不能通过编译,出错如图所示,静态方法不能调用一个非静态的成员变量。修改如下。
如果创建3个Test1对象,则内存中有3个i,1个j。静态变量不属于某个实例对象,静态变量对于每个类来说只有一个存储空间,而非静态变量对于每个对象都会有一个存储空间,i不是静态变量,每个对象都有其i值,j是静态变量,不属于任何一个独立的对象,所以j只有1个。
2. 构造函数有什么用?其编写格式是什么?如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数?
在定义类时,可以使用构造函数定义对象建立的流程,构造函数是与类名称同名,无须声明返回类型的方法。编写格式:
class Some{
int a;
Some(int a){
this.a = a;
}
}
如果定义类时,没有攥写任何构造函数,编译程序会自动加入一个无参数、内容为空的构造函数。如果自行攥写了构造函数,编译程序就不会自动建立默认构造函数了。
3. 使用 java.lang.Math 类的函数时,为什么不需要new?如果new Math()会产生什么错误?
Math类是final类,Math类里面的所有成员变量和成员方法都是静态的,如果new Math(),编译系统会报错,如下图。
4. 什么是重载?什么是构造函数重载?在java.lang.Math类中举出函数重载的例子?怎么才能区分两个重载函数?
- 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型,重载是一个类中多态性的一种表现。
- Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
- 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
Math类中的函数重载如下,一组重载函数是以参数类型或参数个数加以区别的。
5. final修饰的变量不能改变,为什么如下代码可以正常运行?
final int[] NUMBS= {1,2,3,4,5};
NUMBS[2] = 1;
- 在Java中每一个对象都有自己独一无二的哈希编码,根据这个编码就可以找到相关的对象,也就是说,根据这个编码你可以独一无二地确定这个对象。因而使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
- 当final修饰基本类型变量时,不能对基本类型变量重新赋值,即基本类型变量不能被改变,当final修饰引用类型变量时,引用类型变量保存的仅仅是一个引用,即final只保证这个引用类型变量所引用的地址不能改变, 即一直引用同一个对象,但是这个对象的内容可以改变。
6. 阅读代码EmployeeTest.java,回答:
1.为什么其属性均为private?这样设计有什么好处?
2.为Employee类增加一个无参构造函数,调用其有参构造函数,设置name为雇员1, salary为3000, hireDay的年月日为2017年3月5日。(粘贴代码)
3.为Employee类再增加一个有参构造函数,参数只有name与salary,hideDay为当前日期。(粘贴代码)
属性设置为private,是不希望用户能够随意操作类的成员变量,或者希望用户可以通过自己所指定的方法来操作类成员变量。2、3代码如下图。
7.编写函数public static boolean isMondayToFriday()
功能:判断今天如果是周一到周五,直接输出如“上班时间”并返回true,否则输出“休息时间”。
提示:使用LocalDateTime, DayOfWeek
3. 使用码云管理Java代码
4. PTA实验总结
- 5-1,println中包含toString,而在public String toString()中输入格式被重写,所以最后的println也会按toString()的格式输出;
- 5-2,针对初始化块和静态初始化块,以下内容来自百度:
java语言中的初始化块
1、什么是初始化块? 在一个类中,用来对实例变量作初始化的语句块。
2、初始化块在何时被执行? 它在每一次构造对象时被执行且比构造器先执行。
3、对实例变量做初始化有三种方式?
1) 通过构造器实现初始化。 <<<< 这种方式最常用。
2) 在定义实例变量时就给它一个值。显示初始化。
3) 在类中,通过初始化块实现初始化。
4、初始化块的其它作用: 类体中只能定义实例变量和方法,不能直接写其它任何功能性的语句,赋值语句也不行(定义实例变量时显示初始化除外),但因为可以有初始化块,所以可以在初始化块中写入功能性语句,通常这样的语句是用来在初始化的时候起一些作用。
java语言中的静态初始化块
1、什么是静态初始化块? 在一个类中,用static 修饰的语句块。或者说加了static的初始化块。
2、它的作用是什么? 它用来对类变量(static变量)作初始化。它不能非静态的实例变量(非static变量)作处理。
3、它在何时被执行? 它在第一次加载类时(类名第一次出现时)被执行且只执行一次;与对象的创建无关。 注意:第一次加载类指的是:当某个类的名称第一次出现了则称之为类的加载。一次程序的运行,一个类只加载一次,所谓第一次加载类强调的是这个类第一次出现(类名)。 静态变量也是在类的第一次加载时即分配内存空间初始化。 注意:正因为静态初始化块和静态变量在类第一次加载时即被执行和初始化,所以它们比任何对象变量或初始化块(构建对象时执行)都执行或者说初始化的早。
4、静态初始化块和静态成员(变量和方法)的区别在于,静态初始化块执行一次后不再执行,相当于不再存在,而静态变量和方法则是一致存在的。
- 5-3,public int getPerimeter()和public int getArea()的返回值要注意类型转换。