|
|
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{ publicint 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{publicint 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);
}
备注:在局部内部类的内部类中私有方法居然可以访问。实在不解?? |
|