说说java 中 static 的基础知识和易混点
2016-11-03 21:48
176 查看
我主要从以下两个方面来介绍:
一、在一个类中的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修饰的内部类不能直接定义,需要通过外部类.内部类来定义,而且你会发现报错。请见下图:
上边是内部类的定义,以下是调用:
为什么呢?
继承于内部类的类,要想构造出来必须先加载其父类,但是其父类是依赖于外部类的,换句话说,如果他的外部类不加载,这个内部类是不是加载的。因为对于JVM的类加载器来说,它并不认识TextIner这个内部类,只有类加载器把其外部类加载进来之后,才可以加载内部类。那么如果使在使用这个继承于内部类的类时,调用了该内部类的外部类的构造方法,不就能使该外部类加载进来了吗?解决办法,就是这样,用下面这种方式继承非静态内部类就不会报错:
一、在一个类中的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(); } }
相关文章推荐
- Java基础知识之static关键字、静态代码块
- JAVA基础知识(2)--关键字static的使用
- java基础知识之静态:static
- Java基础知识复习(static关键字)
- java零基础知识回顾(static小结)
- Java基础知识整理(六)-final和static
- 【java基础知识】this 与 static 关键字
- 每天一个java基础知识--static
- 构造方法,重载,static,math类(java基础知识七)
- java基础知识要点总结之几个重要关键字(关于static、this、final、)
- java基础知识之——(static final abstract 三个修饰符)
- java基础知识-static关键字
- 黑马程序员——Java基础---有关static(静态)的知识
- JAVA基础知识(static,final,abstract)浅谈
- Java基础知识之static关键字
- 【Java基础知识】Java接口中的成员变量为何必须是public static final
- java基础(2)-基础类型和语法(static、内部类、final、抽象类、接口、封装)(并将这些基础知识与java的三大特征关联(继承、多态、封装))
- JAVA相关基础知识(6)
- JAVA相关基础知识(5)
- JAVA基础知识(3)