编译单元(翻译单元)
每个编译单元都是.java结尾的, 一个编译单元只有一个public类, 类名必须与文件名一致, 包括大小写, 这个编译单元里还有其他类,不过都不是public的, 是public类的支持类
编译单元经过编译会生成.class文件. 文件名对应编译单元中类的类名,可运行的程序是由一组.class文件过程, 这些文件打包就构成了jar包, java解释器的作用就是查找, 加载, 编译这些.class文件
类库
类库是一组类文件, 每个文件都有一个public类和任意数量的非public类, 要想把这些public类集中起来,就需要用package关键字语句,它必须位于代码的第一行, 它表示这个类是util类库的一个编译单元, 任何人想使用这个类,就必须import这个包, 或者这个包中的具体的这个类. 注意 文件名全都小写
package跟import将单一的全局命名空间分隔开
package util
独一无二的包名
包名的.会变成对应的/或\ ,解释器通过类加载器 查找.class文件 CLASSPATH+文件名,
假如导入的两个包中用重复的类名,在使用的时候, 机器也不知道你要具体选哪个了,就会强制要求你写出类的全名
eg : java.util.Vector v = new java.util.Vector();
在创建子类的时候回调用父类的默认构造器来初始化(没有默认构造器,需要制定构造器),但是并不会创造父类对象
java里创建对象时通过new(构造器方法private就不能用new了,可能会有static的方法在类的内部调用私有的构造器) ,而不是构造器, 也就是在new的时候已经开辟了内存空间, new之后构造器才进行它的工作,初始化属性方法什么的, 也就是说构造器的作用不是创建新的对象,而是初始化信息(属性和方法)的
所以创建子类的对象可以理解为:
new开辟一个新的内存空间 也就是创建一个对象 -> 父类构造器来初始化这个对象的属性(因为有继承关系在里面,不初始化父类属性,怎么谈得上继承呢) -> 接着子类构造器初始化
单例设计模式
class Soup2 {
private Soup2() {}
private static Soup2 ps1 = new Soup2(); // [2]
public static Soup2 access() {
return ps1;
}
public void f() {}
}
这种就是单例设计模式, 它自身的构造函数是私有的,无法访问, 想创建该类的对象只能通过静态方法soup2(),而[2]只能创建一次对象(类加载的时候创建的),所以称之为单例设计模式