java中加载及方法、内部类与成员的调用关系

/*
*该例程测试了程序在最开始时的加载情况及成员的调用情况,加载顺序为类→静态成员→创建对象(
*如果创建的话)。
*注意,加载类时,静态成员是单独加载到一处static代码块中,后续将不再加载。因此使用效率
*也更高一些。其中,非静态内部类和静态内部类在最初均不加载,只有程序中使用两者时才会进行加
*载,在外部类中,方法和内部类对静态成员的调用情况是一致的,对于方法,静态方法只可以调用静
*态成员(变量或方法),非静态方法可以调用静态成员或非静态成员。当前的理解是,静态方法在加
*载类时就一起加载了,如果此时在静态方法中使用了非静态成员,那么该非静态成员是不存在的(未
*分配到内存),加载就会出错,而在非静态方法中就不会出现该问题(非静态方法开始不加载)。
*对于内部类来说也是一样,静态内部类只可以使用静态成员,非静态内部类可以使用静态成员或非静
*态成员(该点书中有错误),当前的理解是,在非静态内部类中,会自动创建一个外部类的引用,这
*个引用在程序中是隐藏的。非静态内部类访问外部类时就是通过这个引用来达到访问的目的,但是在
*静态内部类中是没有这么一个引用的,所以静态内部类是无法访问非静态成员的。
*/


/*
 * 在写测试程序时,遇到两处错误。一是在写内部类时,当做方法了在内部类的后面添加了"()",
 * 导致编译出错,另外一处是,在内部类中调用System.out.println()方法打印信息时,
 * 直接将该语句放在了内部类中,这样是没有意义的,必须放在相应的方法中才行,编程思想还没转换
 * 过来。。
 */


//刚开始接触JAVA,理解有误的地方希望大家指出来一起交流~


public class TestClass {
private static int staticvalue = 10;
private int value = 9;
/*构造方法*/
public TestClass(){
System.out.println("调用了构造方法!");
}

/*主函数*/
public static void main(String[] args){
System.out.println("进入了main函数!");
/*静态内部类可直接创建对象,无特殊要求*/
StaticInnerClass staticinnerclass = new StaticInnerClass();
System.out.println("=====分界线=====");
System.out.println("创建了静态内部类对象,局部变量值为:"+staticinnerclass.getValue());

/*非静态内部类需要外部类的引用来创建对象*/
TestClass testclass = new TestClass();
InnerClass innerclass = testclass.new InnerClass();
System.out.println("=====分界线=====");
System.out.println("创建了非静态内部类的对象,局部变量值为:"+innerclass.getValue());
}
/*定义了一个静态方法,用于测试内部类调用*/
public static void staticMeth(){
staticvalue = 1;
// value = 2;  //错误,不可调用非静态成员
System.out.println("调用了静态方法!");
}

/*定义了一个非静态方法,用于测试*/
public void Meth(){
staticvalue = 1;
value = 2;
System.out.println("调用了非静态方法!");
}

/*定义一个静态内部类,用于测试内部类加载顺序*/
public static class StaticInnerClass{
int a = 5;
public  StaticInnerClass(){
System.out.println("加载了静态内部类!");
}

/*静态内部类中方法*/
public int getValue(){
// staticvalue = 1;
// value = 2; //此处错误,不可调用非静态成员
// Meth();  //此处错误,静态内部类不可调用非静态成员
staticMeth();
System.out.println("调用了静态内部类方法!"+staticvalue);
return a;
}
}

/*定义一个非静态内部类,测试加载顺序*/
public class InnerClass{
int b = 3;
public InnerClass(){
System.out.println("调用了非静态内部类!");
}

/*非静态内部类中的方法,均可调用*/
public int getValue(){
staticvalue = 1;
value = 2;
Meth();
staticMeth();
System.out.println("调用了非静态内部类方法!"+staticvalue+value);
return b;
}
}

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值