Java关键字总结
一.大致总结
abstract | 表明类或者成员方法具有抽象属性 |
---|---|
assert | 断言,用于程序调试 |
extends | 表明一个类型是另一个类型的子类型,Java里只允许单继承(抽象接口可以多继承),常见的类型有类和接口 |
final | 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量 |
finally | 用于处理异常情况,用来声明一个肯定会被执行到的语句块 |
instanceof | 用来测试一个对象是否是指定类型的实例对象 |
static | 表明具有静态属性 |
synchronized | 表明一段代码需要同步执行 |
transient | 表明不用序列化的成员域 |
二.详细介绍
关键字abstract
- abstract可以修饰类和方法。
- abstract类可以扩展(增加子类),但不能直接实例化。
- abstract方法不在声明它的类中实现,但是必须在某个子类中重写。
- 仅当abstract类的子类实现其超类的所有abstract方法时,才能实例化abstract类的子类。这种类也称为具体类。
- 如果abstract的类的子类没有实现其超类的所有abstract方法,该类也是abstract类。
- abstract关键字不能应用于static,final,private方法,因为这些方法不能被重写。
- final类的方法都不是abstract,因为final类不能有子类。
- 关键字public protected default private
关键字static
- 在类中,用static生命的成员变量为静态成员变量,它为该类的公用变量。在第一次使用时候被初始化,对于该类的所有对象来说,static成员变量独此一份。
- 用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所有在static方法中不可访问非static的成员。(静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象还没有被初始化。)
public class Cat {
//静态变量,不属于某个对象,可以用来计数,即使没有对象,也可以通过类名访问,在静态区保存
private static int sid;
//非静态成员变量,new一个对象,就产生一块,在堆内存保存
private String name;
private int id;
public Cat(String name) {
this.name = name;
this.id = sid++;
}
public void info() {
System.out.println("My name is "+name+" No is :"+id);
}
public static void main(String[] ars){
Cat.sid = 100;
Cat mimi = new Cat("mimi");
Cat nini = new Cat("nini");
mimi.info();
nini.info();
打印结果:
My name is mimi No.id=100 sid= 102
My name is pipi No.id=101 sid= 102
}
}
过程图
-
-
执行完7Cat.sid时,静态变量sid值为100。内存分布状态如下:
-
第一步:执行第7句Cat mimi=new Cat(“mimi”);字符串常量“mimi”分布在data segment部分,内存分布如下
-
第二步:调到上面后就该到Cat的构造方法了,执行第4句this.name = name;这时根据传入构造方法的name形参,栈中就会为其开辟一块名为name的空间,实参“mimi”传了进来,这时候栈中name的引用指向了data segment中的字符串常量“mimi”,因为this.name = name,所以自身成员变量的this.name也指向了data segment中的字符串常量“mimi”。
-
第三步:执行id=sid++;mimi对象的成员变量i值为原来sid的值100,接下来sid++,将sid的值改为101,内存状态如下图:
-
第四步:构造方法执行完成后,为执行这个方法在栈中分配的形参变量的内存空间收回,name在栈中的空间消失(当然,为执行方法而在栈中分配的局部变量空间,方法执行完毕后都应该被收回了)
-
执行Cat pipi=new Cat(“pipi”); 方法跟执行上面那个构造方法原理是一样的