六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 12|回复: 0

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

[复制链接]

升级  73.8%

273

主题

273

主题

273

主题

进士

Rank: 4

积分
869
 楼主| 发表于 2013-2-4 20:01:12 | 显示全部楼层 |阅读模式
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);
  }
 备注:在局部内部类的内部类中私有方法居然可以访问。实在不解??
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表