1,java类概述
java中没有全局函数、全局变量,只有类。
每个.java文件能定义任意个数的类,但pulic非内部类只能有一个,并且类名必须与文件名相同。.java文件中可以没有public类,也可以没有和文件同名的类。
每个类(包括内部类、泛型类)编译后都会生成一个.class文件,.class文件的目录结构必须和类的完全限定名(包名.类名)一致,以便类加载器进行搜索及加载。
2,定义一个类:
Modiferclass ClassName
{
Modifer ClassName(type param){ }
Modifertype method(type param){ }
Modifertype field;
}
实例:
public class MyClass
{
public MyClass(){ }
protected fun(int i){ }
private static final String str = null;
}
2.1 构造器(构造函数)
类似C++中的构造函数,和类名相同,无返回值,创建对象实例的时候被调用。
每个类可以有一个以上的构造器。如果没有显式的定义构造器,编译器会自动生成一个无参数的默认构造器。
可以在构造器的第一条语句使用this(param)语法调用类中的其他构造器。
可以在构造器的第一条语句使用Super(param)语法调用直接父类中的构造器。
在构造子类之前,总会先构造父类,通过调用父类的默认构造器或者Super语法直接调用特定构造器。
在这些时刻会调用构造器:
a,使用new操作符创建对象。
b,java.lang.Class或java.lang.reflect.Constructor对象的newInstance方法创建对象(只能调用无参数的构造器)。
注意,以下这些时刻虽然会创建对象,但不会调用构造器,可以用来在特定场合下高效的产生对象:
a, 调用任何现有对象的clone方法。
b, 反序列化。
2.2 method
方法,即C++中的成员函数。
和C++不同,java中的方法默认多态,即默认等同于C++中的虚函数,不需要像C++中一样显式声明为virtual.
java中的方法,无论参数是基本类型还是引用类型,都属于值传递。
2.3 field
域,即C++中的成员变量。
2.4 Modifer - 限定修饰符,包括static、public、protected、private、final、abstract
2.1.1 访问级别
a, public - 所有类均可访问。可修饰类、方法、域、构造器。
b, proctected - 子类和包(直接定义了该protected方法或域的类所在的包,不包括子类所在的不同包)中的所有类可访问。可修饰方法、域、内部类,不可修饰非内部类。
c, private - 只有定义了该方法或域的类可访问。可修饰方法、域、内部类,不可修饰非内部类。
d, 无限制修饰符(或称默认访问级别),包内的所有类可访问。可修饰方法、域、内部类、非内部类。
2.1.2 static
不可修饰构造器,不可修饰非内部类,可修饰域、方法、内部类。
被static修饰的方法(method)和域(field)属于类,而不属于实例对象,无需创建对象即可调用, 所有此类的对象实例共享static方法和域。
static修饰的域只在第一次加载类的时候初始化,创建实例的时候并不会初始化。
可以用静态块对static 域进行初始化,同样只在第一次加载类的时候进行初始化。
2.1.3 final
可修饰类、方法、域。
修饰类,表示不允许被继承的类,其所有方法自动为final,但域不会自动为final.
修饰域,表示常量,初始化后其值不会被改变;在使用前必须被初始化,可以在定义域的时候初始化,可以在初始化块中初始化,静态final变量可在静态初始化块中初始化,可以在构造器中初始化。
修饰方法,表示该方法不可被子类重写(Override),但依然会被子类继承。
final有利于编译器优化(由于方法不会被子类重写,所以可以inline),应尽可能使用final,如同C++尽可能使用const(部分近似).
2.1.4 abstract
可修饰类、方法。表示抽象类和抽象方法,类似于C++中的纯虚函数、虚基类。
抽象方法没有方法(函数)体,包含抽象方法的类必须声明为抽象类。
抽象类不能被实例化,抽象类可以包含具体的方法和域,可以不包含抽象方法。
抽象类的子类可以实现(具体化)继承来的抽象方法,也可以不实现抽象方法,但必须声明自己为抽象类。
2.5 type
数据类型,既包括基本类型,也包括引用类型。