JAVA学习笔记10-(访问控制权限/Object类)


访问控制权限


访问控制权限都有哪些?

private	私有
public	公开
protected	受保护
			默认(也就是前面啥也不写)

每个访问控制权限控制的范围是什么?

private 表示私有的,只能在本类中访问
public 表示公开的,在任何位置都可以访问
“默认”表示只能在本类,以及同包下访问。
protected表示只能在本类、同包、子类中访问。
访问控制修饰符本类同包子类任意位置
public
protected×
默认××
private×××
范围从大到小排序:public > protected > 默认 > private

访问控制权限修饰符可以修饰什么?

属性(4个都能用)
方法(4个都能用)
类(public和默认能用,其它不行。)
接口(public和默认能用,其它不行。)

JDK类库的根类:Object

首先我们要知道:
任何一个类默认继承Object。就算没有直接继承,最终也会间接继承。

源码及API文档概述

什么是API?
应用程序编程接口。(Application Program Interface)
整个JDK的类库就是一个javase的API。
每一个API都会配置一套API帮助文档。
SUN公司提前写好的这套类库就是API。(一般每一份API都对应一份API帮助文档。)

如何去查看API?
1
2
这里面便是全部java的API,他的帮助文档则可以在网上查阅得知,类容如下
在这里插入图片描述


Object中的方法

目前为止我们只需要知道这几个方法即可:

protected Object clone()   // 负责对象克隆的。
int hashCode()	// 获取对象哈希值的一个方法。
boolean equals(Object obj)  // 判断两个对象是否相等
String toString()  // 将对象转换成字符串形式
protected void finalize()  // 垃圾回收器负责调用的方法

Object中的方法–toString方法

1、源代码长什么样?

public String toString(){
	return this.getClass().getName() + "@" + Integer.toHexString(hashCode());
}
源代码上toString()方法的默认实现是:类名@对象的内存地址转换为十六进制再结合哈希算法得到的值的形式

2、toString()方法的作用是什么?

toString()方法的设计目的是:
通过调用这个方法可以将一个“java对象”转换成“字符串表示形式”

3、其实SUN公司开发java语言的时候,建议所有的子类都去重写toString()方法。toString()方法应该是一个简洁的、详实的、易阅读的.
23
4、在IDEA中如何使用?
在IDEA中能够自动为我们生成相应的覆盖toString方法,具体步骤如下:

首先在类中同时按下键盘的 alt+insert 键,出现下图
在这里插入图片描述
然后选择 Override Methods中的toString
在这里插入图片描述
接下来就会自动生成了,在此基础上改为自己想要的样子即可。
观察可以发现,他同样可以自动生成 equals ,clone等方法,在后面就不再赘述。


Object中的方法–equals方法

1、equals方法的源代码

public boolean equals(Object obj){
	return (this == obj);
}

2、equals方法的目的是什么?

以后编程的过程当中,都要通过equals方法来判断两个对象是否相等。
equals方法是判断两个对象是否相等的。

3、Object类给的这个默认的equals方法够不够用?

首先我们知道,在JAVA中去判断两个基本数据类型是否相等时,直接使用的是 == 这个符号,例如:

public static void main(String[] args){
	// 判断两个基本数据类型的数据是否相等直接使用“==”就行。
	int a = 100;
	int b = 100;
	if(a == b)
		System.out.println(yes);
}

那么问题来了,如何去判断两个对象是否相等,我们怎么办?能直接使用“==”吗?

首先新建一个类:MyTime,里面包含年月日
为了方便,不对其进行封装。
class MyTime{
	int year;
	int month;
	int day;
	//提供构造方法
	public MyTime(){}
	public MyTime(int year, int month, int day){
		this.year = year;
		this.month = month;
		this.day = day;
	}
}

这个时候在主函数中去创建两个对象,令他们的 年月日 一样,那么我们可以认为这两个对象时相等(equal)的,但是直接用 == 可以吗?

MyTime t1 = new MyTime(2008, 8, 8); //MyTime t1 = 0x1234;
MyTime t2 = new MyTime(2008, 8, 8); //MyTime t2 = 0x3698;
System.out.println(t1 == t2); // false

很显然不行,因为t1和t2是两个引用,他们保存的是对象的地址!
“==”符号是判断左右两边变量的值是否相等,就算对象内容相同,但是两个对象自然对应着两块不同的内存,所以equals方法在这里失效了(或者是没满足我们的要求)
在前面提到,当父类之中的方法无法满足子类的需求时,便需要对其进行覆盖重写。
equals到底应该怎么重写?你自己定,你认为两个对象什么相等的时候表示相等,你就怎么重写。(这个相等的标准是人为定的)

public boolean equals(Object obj){
	// 当年相同,月相同,并且日也相同的时候,表示两个日期相同。两个对象相等。
	if(obj == null || !(obj instanceof MyTime)){
		return false;
	}
	if(this == obj){
		return true;
	}
	MyTime t = (MyTime)obj;
	return this.year == t.year && this.month == t.month && this.day == t.day ;
}
具体类容如上,学了前面的自然也看得懂,不再解释,同上toString方法,在IDEA中也能够自动生成。

根据上述分析得出结论:Object类给的默认equals方法也是不够用的,用的时候建议覆盖重写。

4、总结equals

java中基本数据类型比较是否相等,使用==
java中所有的引用数据类型统一使用equals方法来判断是否相等。

值得注意的是,String类中JAVA已经为我们写好了equals的重写方法,直接调用即可比较两字符串是否相等。例如:

String a = "aaa";
String b = "bbb";
boolean flag = a.equals(b);//false

Object中的方法–finalize方法

1、在Object类中的源代码:

protected void finalize() throws Throwable { }
要知道的是
该方法在最新的jdk已经过时了,此方法不重要,了解即可
该方法不是由程序员手动调动的,是由GC(垃圾回收器)自动调用的

2、finalize()方法的执行时机:

当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。

3、提示:

java中的垃圾回收器不是轻易启动的
垃圾太少,或者时间没到,种种条件下,有可能启动,也有可能不启动。

Object中的方法–hashCode方法

在Object中的hashCode方法是怎样的?

public native int hashCode();
这个方法不是抽象方法,带有native关键字,底层调用C++程序。
hashCode()方法返回的是哈希码:
	实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。
	所以hashCode()方法的执行结果可以等同看做一个java对象的内存地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值