package com.easyway.commons.ispace.dev.lang.objects; public class JavaClassType { private int a1; public int a2; static int a3; int v=1; static int bs=9; private B b=new B(); public JavaClassType(int a1,int a2 ) { this.a1=a1; this.a2=a2; } protected int methodA(){ System.out.println("A:methodA"); return a1*a2; } /** * 一般的内部类(非static类)的内部没有静态属性 * @author longgangbai * @date 2010-5-10 * @version 1.0 * @since JDK6.0 */ class B{ public int b1=a1; int b2=a2; int b3=a3; int v=2; // // int b4=new JavaClassType(3,5).a1; //备注:这种写法在编译通过运行时报错, int b5=methodA(); private void methodB(){ System.out.println("B:methodB"); System.out.println("v="+v); System.out.println("this.v="+this.v); System.out.println("A.this.v="+JavaClassType.this.v); } class C{ public int b1=a1; public void methodC(){ System.out.println("C:methodC"); methodA(); methodB(); } } /** * * 局部内部类(在一个方法中定义的内部类,他的可见范围是当前的方法,局部内部类不能访问修饰符及修饰): * (1)局部内部类和实例内部类一样,可以访问外部类的所有成员 * 此外,局部内部类还可以访问所在方法中的final类型的参数和变量。 * (2)在局部内部类和实例内部类一样,不能包含静态成员 */ public void methodBC(){ final int abc=0; int def=8; class G{ public int g0=1; protected int g1=b1; private M m=new M(); // static int g5; 编译错误 private int g2=a1; int g3=abc; // int g4=def; 编译错误 class M{ private int m0=0; protected int m1=1; public int m2=4; } } G g=new G(); //注意下面的代码访问的私有变量 int qq= g.g2; System.out.println("g.m.m0 ="+g.m.m0); } /** * 内部类的继承:内部类的子类(F)的构造中必须创建继承内部类(C)的父类(B)的实例: * * @author longgangbai * @date 2010-5-10 * @version 1.0 * @since JDK6.0 */ class F extends B.C{ public F(B b){ b.super(); } } } public static class D{ int d1=bs; int d2=new JavaClassType(7,8).a1; public void methodD(){ System.out.println("d2="+d2); } public static class E{ static int e1=3; } } public static void main(String[] args) { JavaClassType.B b=new JavaClassType(1,2).new B(); System.out.println("b.b1="+b.b1); System.out.println("b.b2="+b.b2); System.out.println("b.b3="+b.b3); //System.out.println("b.b4="+b.b4); System.out.println("b.b5="+b.b5); JavaClassType jcy=new JavaClassType(1,2); JavaClassType.B bb=new JavaClassType(3,6).new B(); //在直接实例内部类的实例的时候,java虚拟机自动使内部类shilling引用它的外部类的实例。 bb.methodB(); bb.methodBC(); B.C c=b.new C(); c.methodC(); D d=new D(); d.methodD(); } }
main输入才结果:
A:methodA
A:methodA
b.b1=1
b.b2=2
b.b3=0
b.b5=2
A:methodA
A:methodA
A:methodA
B:methodB
//this的不同地方的输出的值不同
v=2
this.v=2
A.this.v=1
g.m.m0 =0
C:methodC
A:methodA
B:methodB
v=2
this.v=2
A.this.v=1
A:methodA
d2=7
在孙卫琴编著Java开发专家的<<Java面向对象编程>> 电子出版社出版的。
第12章内部类一章中局部内部类的讲解中:
孙卫琴:总结第三条:在局部内部类中定义的内部类也不能被public ,protected,private 这些访问控制修饰符修饰。
但是编译通过,输出结果,是不孙MM著书的错误呢?希望各位网友拍砖!!
并且在访问时可以访问局部内部类的private的属性,不解?希望知道的给出解释??
public void methodBC(){
final int abc=0;
int def=8;
class G{
public int g0=1;
protected int g1=b1;
private M m=new M();
// static int g5; 编译错误
private int g2=a1;
int g3=abc;
// int g4=def; 编译错误
class M{
private int m0=0;
protected int m1=1;
public int m2=4;
}
}
G g=new G();
//注意下面的代码访问的私有变量
int qq= g.g2;
System.out.println("g.m.m0 ="+g.m.m0);
}
备注:在局部内部类的内部类中私有方法居然可以访问。实在不解??