访问控制权限
访问控制权限都有哪些?
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?
这里面便是全部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()方法应该是一个简洁的、详实的、易阅读的.
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对象的内存地址。