西部开源·Java学习记录 Day6(构造方法、private、static、Math)
Day 6
2019年4月6日。
这是我来到西部开源的第六天。
这一天,我学到了以下的知识。
匿名对象
没有名字的对象。
格式:new 对象();
具有如下特征:
- 每new一次就是一个新对象,会在堆内存重新开辟空间
- 匿名对象可作为参数传递
- 应用场景:仅仅只调用一次对象的时候
封装
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
注意事项:
- 好处:隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性 - 封装原则:将不需要对外提供的内容都隐藏起来
把属性隐藏,提供公共方法对其访问
private和public
- private是一个权限修饰符,可以修饰成员变量,成员方法。被修饰的成员,只能在本类中使用,外界无法使用(私有的)。
private最常见的应用:
(1):把成员变量用private修饰
(2):提供对应的getXxx()和setXxx()方法 - public是一个权限修饰符,可以修饰类,成员变量,成员方法。被修饰的成员,在任何地方都可以访问(公共的)
public最常见的应用:
主方法public static void main(args []){}
get()和set()
- get()方法:在类中提供公共的set方法,让外界调用set方法来给成员设置变量
- set()方法:在类中提供公共的get方法,让外界调用get方法来获取成员变量的值
this
当我们的局部变量和成员变量相同的时候,如果我们不使用this关键字,那么会导致一个问题:就是局部变量隐藏了成员变量的问题。
常用格式:this.成员变量 = 局部变量
具有如下特征:
-
this关键字特点
是当前类的对象引用。
简单的记,它就代表当前类的一个对象。谁调用这个方法,那么该方法的内部的this就代表谁。 -
this的应用场景
解决局部变量隐藏成员变量
构造方法
构造方法就是方法名和类名相同,没有返回值类型,连void也没有的方法。
在我们自定义的一个类中,默认就会存在一个空参的构造方法。构造方法,就是用来初始化这个类,并完成对类的实例化。
注意事项:
- 如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
- 如果我们给出了构造方法,系统将不再提供默认的无参构造方法。这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法。
static
static是静态的,可以修饰成员变量,成员方法。
被static修饰的成员变量,是一个共享变量,被类的所有对象所共享。
被static修饰的成员,是随类的加载而加载,且优先于对象而存在。
因为static不属于对象,属于类,所以推荐使用类名直接调用。
注意事项:
- 在静态方法里面,只能访问静态变量,非静态变量访问不到(先存在的静态方法访问不到后存在的非静态变量),且不能存在this关键字(this代表对象,而对象后来才有)
- 在非静态方法里面,既可以访问静态的,也可以访问非静态的。
static的内存图如下:
成员变量和静态变量的区别
- 所属不同
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量) - 内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存 - 内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失 - 调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
Math类
Math是关于数学运算方面的工具类。其所有的成员变量和成员方法,都是用静态来修饰,我们可以直接通过类名直接调用(Math是java.lang包下的类,可以不用导包)。
用Math类获取随机数的方法:Math.random() /*生成随机小数,范围在0~1之间*/
Math的经典算法(猜数字游戏)
-
猜数字游戏
输入一个1~100内的数字,代码会根据输入的数字与随机生成的数字进行比较,若比数字大则会提示大,若比数字小则会提示小,若与数字相等则会提示猜对了。总共有10次机会。
代码如下:
public class RandomNumber {
public static void main(String[] args) {
int random = (int)( Math.random() * 100 ) + 1;
int tag = 10;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个1到100内的整数");
while (true && tag != 0){
int num = sc.nextInt();
if (num > random ){
System.out.println("大了");
tag--;
System.out.println("你还有" + tag + "次机会");
}
else if (num < random){
System.out.println("小了");
tag--;
System.out.println("你还有" + tag + "次机会");
}
else if (num == random){
System.out.println("恭喜你猜对了!");
break;
}
}
}
}