java学习小结 11.9

来源:互联网 发布:java视频教程百度网盘 编辑:程序博客网 时间:2024/05/17 22:45

首先说一下,很多问题与回答都是别人的,这里是本人为了忘了好找和好记而堆到了一起,有侵权请联系我。。。。。。

非静态内部类为什么不能定义静态变量
但final又可以。

public class Outer{          class Inner{              public static int i = 0;//报错              public static final int j = 0;//通过          }    }

因为内部类是非静态的,除了要依靠外部类实例外,还要依赖内部类实例,而静态变量是不需要构建类实例的,两者是相矛盾的,而final类型的变量可以离开类实例存活一段时间的。

内部类中不能有静态变量,但是可以由静态常量,static final 定义后就是一个静态常量了 。

之前一直很2的以为静态方法就是静态初始化块,今天才发现搞错了。

static{…..}
这个定义的才叫初始化块

百度到一个不错的回答

1 不管是静态方法还是非静态方法,都需要调用后执行,其执行的次序和在类里声明的次序无关,区别是静态方法是“class.method”方式执行,非静态方法是”object.method”方式执行,即后者需要创建一个对象。

2 静态成员变量(也称类变量)先于非静态成员变量初始化,静态成员变量在类第一次加载时初始化,所有对象共享一份静态成员变量,非静态成员变量则在对象创建时初始化

追问:
奥,再请教大侠,类一共要加载几次?
追答:

只加载一次,而且是懒加载的,第一次调用该类的时候加载(比如当调用该类的静态方法或者成员变量,new一个该类的对象的时候)。
具体的说,每一个类(.class)文件,都对应着一个Class对象,这个Class对象类似于一个模板,用于创建该类的对象。这个Class对象在第一次调用该类时创建并加载到java虚拟机中。

追问:
还是不理解,比如当调用该类的静态方法或者成员变量,new一个该类的对象的时候,这时候才加载?main方法要执行,首先就要把代码加载到内存啊

追答:
main方法执行的时候不是一次性加载的,是需要时才加载,main方法在调用一个方法或new 一个对象的时候,会首先检查是否加载过这个类(具体地说是从jvm的内存里检查是否存在这个类的Class对象),若没有加载过,则加载这个类(即生成该类的Class对象),静态成员变量和静态代码块会在第一次加载中执行;若加载过,则不重新加载。
换个角度想想,jvm怎么知道你需要哪些类呢?只有你调用了这个类,jvm才会从类路径classpath里去找这个类(.class),然后加载它,如果当前类路径找不到,就会抛出ClassNotFoundException。
相关的详细知识,可以去看下java教材中关于类加载机制的章节。

追问:
大侠,我不知道加载是什么意思,任何代码都必须是机器码然后加载到内存,才会执行的啊

追答:
是的,对于java虚拟机来说,机器码就是.class文件,每个.class文件被加载,就会在内存中产生一个Class对象,这个Class对象就像一个模板,你可以理解成一个模具,所有该类的对象都会从该模具中产生。
举个例子:

public Class A {    static int i = 0;    static {        System.out.println("静态代码块");    }    public static void main(String[] args) {        A.i;    }}

main方法中调用了类A的成员变量,此时类A未被加载,那么jvm就会从classpath中找到A.class文件,然后创建A.class对象,并初始化A的静态成员变量(这里是i)和执行A的静态代码块(这里会看到print语句执行),之后无论怎么调用A,这个静态代码块都不会执行,你可以多做几次实验看看。
A.class对象,你可以通过A.class语句获得,然后通过Class.newInstance()创建A的实例,这样和new A();的语句创建效果是一样的。

追问:
main方法中调用了类A的成员变量,此时类A未被加载。你的这句话我不懂,类A未被加载的话,main方法怎么会被执行?

追答:
1 调用前没有加载,调用时发现Class A没有加载,遂加载之
2 main方法开始时只是启动了一个java虚拟机,除了一些必要类库,其他类都不加载,目的主要是为了速度快。

追问:
这点我就不明白了,调用前没有加载的话,main方法会执行吗?相当于内存里面没有任何代码啊

追答:
jvm启动只会加载必要的核心类库,其中就有Class类和相关类加载器,然后其他的类会在需要的时候加载进来。

java 静态初始化块中是否可以定义静态变量?

静态变量只能定义在类的内部,不可以定义在静态块或方法中
可以在类内部定义静态变量,在静态块中进行初始化操作,因为类的内部是不允许有操作语句存在的,比如JDBC操作,所以可以在静态块static{} 中进行初始化操作,如:JDBC
定义静态变量主要是为了供外部访问,定义在一个局部中外部没有权限访问,为什么要定义呢,而且不能定义

JVM是什么?

JVM是Java虚拟机,所有的Java程序都在Java虚拟机中运。
JDK是Java开发工具包,用来开发Java程序。

jdk中有一个编译器,可以把你的java源代码编译成可以在虚拟机(jvm)
上运行的字节码(中间代码).

0 0