说说java 中 static 的基础知识和易混点

我主要从以下两个方面来介绍:

一、在一个类中的static的用法;

二、在继承关系中static的用法。

一、在一个类中的static的用法:

众所周知,static 可以修饰的内容有:成员变量、方法、代码块{}、class。下面分别来说:

1.static修饰成员变量,该变量可以通过类名直接访问,也可以通过静态方法访问。

2.static修饰方法,该方法可以通过类名访问,也可以通过其他静态方法访问。

3.static修饰代码块,代码块中的内容会根据定义的先后顺序加载。注意这里不能定义成员变量,要想访问方法也只能方法静态方法。

4.static修饰class一般用于内部类。

   这里多说两句,就是内部类的用法。要想定义一个内部类,有两种方式:利用外部类的对象new出来;直接定义出来。

   static修饰的内部类两种方式,都可以。只不过用第二种方式的时候,需要import进来响应的内部类。

   非static修饰的内部类,只能通过第一种方式获取该类的对象。

二、在继承关系中static的用法(与以上四点对应)。

1.对于变量就不多说了,如果定义了同名变量默认情况下是掉子类的变量,用this.变量名 返回的也是子类的变量值,用super.变量名 返回的就是父类的变量值。

2.对于static方法的继承,话就多了。static方法是不能被重写的。我这里所说的重写,不是简单的子类去覆盖父类的方法,而是指的是多态的重写。在不写override的前提下,子类   可以再写一个和父类相同的static方法,但是不支持多态。变量定义的哪个类型,就会掉哪个类型的方法。这个设计到JVM中多态的运行机制,这个我在后边的文章中再进行讲    解。

3.代码块是不能继承的,但是这里我想说的是,静态代码块,构造函数,非静态代码块在子父类中的调用顺序问题。具体参考下这篇     http://blog.csdn.net/liufangbaishi2014/article/details/52959653 调用顺序为父类静态代码段->子类静态代码段->父类非静态代码段->父类构造方法->子类非静态代码段->子类构造方法

4.我直接说下内部类的继承

   被static修饰的内部类可以直接定义,也可以通过外部类.内部类名来定义,因为JVM对static修饰的内部类没有什么限制。

   被非static修饰的内部类不能直接定义,需要通过外部类.内部类来定义,而且你会发现报错。请见下图:

public class Text {	
	 class TextIner{					
	}
}

上边是内部类的定义,以下是调用:

class TextImpemtNei extends Text.TextIner{		
} 
报错了。
为什么呢?

继承于内部类的类,要想构造出来必须先加载其父类,但是其父类是依赖于外部类的,换句话说,如果他的外部类不加载,这个内部类是不是加载的。因为对于JVM的类加载器来说,它并不认识TextIner这个内部类,只有类加载器把其外部类加载进来之后,才可以加载内部类。那么如果使在使用这个继承于内部类的类时,调用了该内部类的外部类的构造方法,不就能使该外部类加载进来了吗?解决办法,就是这样,用下面这种方式继承非静态内部类就不会报错:

class TextImpemtNei extends Text.TextIner{
	 public TextImpemtNei(Text wi) {  
	        wi.super();  
	    } 	
} 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章