对象就是真实世界的实体,对象与实体一一对应。
只支持单继承:只能继承一个父类
但是可以继承接口,给出自己的方法实现。
基本语法
定义类
[public][abstract|final]class<class_name>[extends<class_name>]
[implements<interface_name>] {
//定义属性部分
<property_type><property1>;
…
//定义方法部分
function1();
…
}
abstract:抽象类。抽象类不能实例化,可以有抽象方法和具体方法。除非子类也是抽象类,不然继承它的子类必须实现该抽象类中的所有抽象方法。
final:不允许被继承。final类的方法就是final方法了。变量可以不是final。
类名语法:类名应以下划线或字母(推荐)开头,多单词应该每个单词首字母都大写。
定义类的变量
[public|protected|private][static][final]<type><variable_name>
static:类变量/静态变量
final:常量,值不能更改(如果是对象的话,表示其引用不可以再改变)。只能在定义处或者在构造函数中赋值。
成员变量被声明的同时可以初始化,否则系统会用默认值初始化它们。
数组引用类型的默认值是null,如果创建了数组变量的实例,但没有显式为各元素赋值的话,那才采用对应类型的默认值。
定义类的函数
static:静态方法。静态方法不涉及实例,所以不能使用this/super,也不能访问非静态的变量和方法。
final:该方法不能被重写。可以被继承,但是只能被实现一次。
abstract:抽象方法。不能提供具体实现。且有一个抽象方法就是抽象类了。
另外:
- 构造函数不能被 static、final、synchronized、abstract 和 native 修饰。
- 隐含的创建对象:例如String s = “hello”;
- 在类中重载public String toString(){}后, System.out.println(类名);就可以直接打印了。
- 可变参数语法
methodName({paramList},paramType…paramName)
其中paramList是固定参数列表,paramType是可变参数列表的类型,…表明是可变的,paramName是名称
finalize()函数
Object类中提供的一个protected方法。一旦gc(垃圾回收)准备好释放对象占用的存储空间时,会先调用finalize()方法(还会调用其他处于此种状态的对象的finalize()函数,这些调用中可能会让变量回到不需要被回收的状态,如果该对象一直都是这种状态,那才会被回收),并在下一次垃圾回收发生时,才会真正回收内存。但是实际回收的条件是,对象没有引用指向它了,但是这个是无法预知的,所以finalize()何时调用并不确定。只有当本地方法中产生了C/C++代码分配的内存,才可以把free/delete放到finalize()中,但是这个情况很少,完全可以及时用完及时释放。
main函数
public static void main(String[] args)
{
//方法体
}
注意:main()方法是静态的,所以如果要调用本类中的其他方法,那么那个方法也应该是静态的,否则需要先创建本类的实例对象,然后用对象调用成员方法。args数组是接收Java程序的命令行参数的。
静态方法不涉及实例,所以不能使用this/super,也不能访问非静态的变量和方法。
但是非静态方法就可以直接访问静态变量/方法了。
静态代码块:static{}
要单独写,不能写在方法中。每个静态代码块只会在加载类的时候执行一次,(如果类中有多个静态代码块,那么将按在类中出现的顺序依次执行)而非静态的则会在创建实例时再次执行。
class Untitled {
public static int count=0;
{
count++;
System.out.println("非静态代码块 count="+count);
}
static
{
count++;
System.out.println("静态代码块 count="+count);
}
public static void main(String[] args) {
System.out.println("*************** StaticCode1 执行 ***************");
Untitled sct1=new Untitled();
System.out.println("*************** StaticCode2 执行 ***************");
Untitled sct2=new Untitled();
}
}
输出: