关于局部内部类和内部类的深度学习(一点问题)

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);
  }

 备注:在局部内部类的内部类中私有方法居然可以访问。实在不解??

你可能感兴趣的:(C++,c,qq,C#,出版)