包机制package
package是java中的包机制。包机制的作用是为了方便程序的管理。
不同功能的类分别存放在不同的包下。(按照功能划分的,不同的软件包具有不同的功能。)
package是一个关键字,后面加包名。
注意:package语句只允许出现在java源代码的第一行。
包名的命名规范:一般都采用公司域名倒序的方式(因为公司域名具有全球唯一性。)
公司域名倒序 + 项目名 + 模块名 + 功能名
对于带有package的java程序怎么编译?怎么运行?
编译:
javac -d . *.java
javac 负责编译的命令
-d 带包编译
. 代表编译之后生成的东西放到当前目录下(点代表当前目录)
*.java 被扁一顿java文件名。
运行:
java.包名.文件名
java.完整类名
以后说类名的时候,如果带着包名描述,表示完整类名。
如果没有带包,描述的话。表示简类名。
import
A类中使用B类。
A类和B类在同一个包下,不需要import。
A类和B类不在同一个包下,需要使用import。
java.lang.* 这个包下的类不需要使用import导入
import语句只能出现在package语句之下,class声明语句之上。
import语句还可以采用星号的方式。
import 包名.*
访问控制权限
访问控制权限有4个:
private 私有
protected 受保护的
public 公开
默认(default)
这4个访问控制权限的范围:
private 表示私有的,只能在本类中访问。
public 表示公开的,在任何位置都可以访问。
“默认”表示只能在本类,以及同包下访问。
protected 表示只能在本类、同包、子类中访问。
范围从大到小排序:public > protected > 默认 > private
访问控制权限修饰符可以修饰什么?
属性(4个都能用)
方法(4个都能用)
类(public和默认能使用,其他不行)
接口(public和默认能使用,其他不行)
......
JDK类库的根类:Object
这个老祖宗类中的方法我们需要先研究一下,因为这些方法都是所有子类通用的。任何一个类默认继承Object。就算没有直接继承,最终也会间接继承。
Object类当中有很多常用的方法,那么我们应该去哪里找这些方法呢?
第一种:去源代码中找。(但是这种方式比较麻烦,源代码也比较难。)
第二种:去查阅java的类库的帮助文档。
什么时API?
应用程序编程接口。(Application Program Interface)
整个JDK的类库就是一个Java SE 的API。
每一个API都会配置一套API帮助文档。
目前为止,我们只需要直到这几个方法即可:
protected Object clone() //负责对象克隆的
int hashCode() //获取对象哈希值的一个方法
boolean equals(Object obj) //判断两个对象是否相等
String toString() //将对象转换成字符串形式
protected void finalize() //垃圾回收器负责调用的方法
toString方法
源代码:
public String toString(){
return get.Class().getName(0 + "@" + Integer.toHexString(hashCode);
}
源代码上toString()方法的默认实现是:
类名@对象的内存地址转换为十六进制的形式
SUN公司设计toString()方法的目的是什么?toString()方法的作用是什么?
toString()方法的设计目的是:通过调用这个方法可以将一个“java对象”转换成“字符串表示形式”。
其实SUN公司开发java语言的时候,建议所有的子类都去重写toString()方法。
toString()方法应该是一个简洁的、详实的、易阅读的。
注意:输出引用的时候,会自动调用toString()方法。
equals方法
源代码:
public boolean equals(Object obj){
return (this == obj);
}
SUN公司设计equals方法的目的是什么?
以后编程的过程当中,都要通过equals方法来判断两个对象是否相等。
equals方法是判断两个对象是否相等的。
在Object类中的equals方法当中,默认采用的是“==”判断两个Java对象是否相等。而“==”判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。所以老祖宗的equals方法不够用,需要子类重写equals。
判断两个java对象是否相等,不能使用“==”,因为“==”比较多是两个对象的内存地址。
String类已经重写了equals方法,比较两个字符串不能使用==,必须使用equals。
String类已经重写了toString方法。
java中基本数据类型比较是否相等使用==。
java中所有的引用数据类型统一使用equals方法来判断是否相等。
注意:重写equals方法的时候要彻底。
finalize方法
这个方法是protected修饰的,在Object类中这个方法的源代码是:
protected void finalize() throws Throwable { }
finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。
这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。
finalize()方法的执行时机:当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。
finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。
GC:负责调用finalize()方法。
java中的垃圾回收器不是轻易启动的,垃圾太少,或者时间没到,种种条件下,有可能启动,也有可能不启动。
有一段代码可以建议垃圾回收器启动。
System.gc();//建议启动垃圾回收器。(只是建议,可能不启动,也可能启动,启动的概率高了)
hashCode方法
在Object中 的hashCode方法是怎样的:
public native int hashCode();
这个方法不是抽象方法,带有native关键字,底层调用C++程序。
hashCode()方法返回的是哈希码:
实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。所以hashCode()方法的执行结果可以等同看做一个java对象的内存地址。
匿名内部类
内部类:在类的内部又定义了一个新的类。被称为内部类。
内部类的分类:
静态内部类:类似于静态变量
实力内部类:类似于实例变量
局部内部类:类似于局部变量
使用内部类编写的代码,可读性很差。能不用尽量不用。
匿名内部类是局部内部类的一种。
因为这个类没有名字而得名,叫做匿名内部类。
学习匿名内部类主要是让大家以后再阅读别人的代码的时候,能够理解。并不代表以后都要这样写。因为匿名内部类有两个缺点:
缺点1:太复杂,太乱,可读性差。
缺点2:类没有名字,以后想重复使用,不能用。
匿名内部类就是在你要使用接口去实现的时候,直接new 接口名 (){},这个大括号,就代表了接口的实现,就不用写接口实现类了。
不理解,就记住这种写法就好。