zoukankan      html  css  js  c++  java
  • 内部类修改外部类属性

    (转:http://demojava.iteye.com/blog/1075571)

    public class Test {
     
     public String demo="qw4rqwer";
     
     public void changValue()
     {
      this.demo=" hello word";
     }
     class DemoOuterclass
     {
       public  DemoOuterclass()
       {
        changValue();
       }
     }
     public static void main(String[] args) {
      Test t=new Test();
      System.err.println("demo1"+t.demo);
      Test.DemoOuterclassdemo=t.new DemoOuterclass();
      System.err.println("demo2"+t.demo);
     }
     public String getDemo() {
      return demo;
     }
     public void setDemo(String demo) {
      this.demo = demo;
     }
    }
    ============总结=========

                1.内部类可以声明为private或protected,可以声明为static
                2. 内部类中可以直接访问外部类的方法。
                3. 内部类中可以直接访问外部类的数据成员
                4. 
                在外部类的静态方法中创建内部类对象,必须采用“外部类名.内部类名”的形式指定对象的类型,并且非静态内部类的对象必须通过外部类对象来创建。如:
           public static void main(String[] args) {
      Test t=new Test();
      System.err.println("demo1"+t.demo);
      Test.DemoOuterclassdemo=t.new DemoOuterclass();
      System.err.println("demo2"+t.demo);
     }
                5. 不能通过外部类对象访问内部类成员
                6. 不能通过内部类对象访问外部类成员
                7. 静态内部类对象可以直接采用“外部类名.内部类名”形式创建
              Test.DemoOuterclassdemo=t.new DemoOuterclass();
                8. 私有内部类无法通过第4条创建

    java 中的内部类和匿名内部类

     1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
    几种内部类的共性:
    A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
    B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
    2、成员内部类:形式如下
        class Outer {
            class Inner{}
        }       
    编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
    3、方法内部类。
    顾名思义,把类放在方法内。
        class Outer {
            public void doSomething(){
                class Inner{
                    public void seeOuter(){
                    }
                }    
            }
        }
    A、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
    B、方法内部类对象不能使用该内部类所在方法的非final局部变量。
    因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,
    在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。
    正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
    下面是完整的例子:
        class Outer {
            public void doSomething(){
                final int a =10;
                class Inner{
                    public void seeOuter(){
                        System.out.println(a);
                    }
                }   
                Inner in = new Inner();
                in.seeOuter(); 
            }
            public static void main(String[] args) {
                Outer out = new Outer();
                out.doSomething();
            }
         }
    4、匿名内部类。
    顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。
    A、继承式的匿名内部类。
        class Car {
            public void drive(){
                System.out.println("Driving a car!");
            }
        }
        
        class Test{
            public static void main(String[] args) {
                Car car = new Car(){
                    public void drive(){
                        System.out.println("Driving another car!");
                    }
                };
                car.drive();
            }
        }
    结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
    B、接口式的匿名内部类。
        interface  Vehicle {
            public void drive();
        }
        
        class Test{
            public static void main(String[] args) {
                Vehicle v = new Vehicle(){
                    public void drive(){
                        System.out.println("Driving a car!");
                    }
                };
                v.drive();
            }
        }
    上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
    C、参数式的匿名内部类。
    class Bar{
        void doStuff(Foo f){}
    }

    interface Foo{
        void foo();
    }

    class Test{
        static void go(){
            Bar b = new Bar();
            b.doStuff(new Foo(){
                public void foo(){
                    System.out.println("foofy");
                }
            });
        }
    }
    5、静态嵌套类。
    从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
    详细内容请见:http://hi.baidu.com/honglin_bd/blog/item/fa60c4d3866f972933fa1c87.html
    参考资料:http://hi.baidu.com/honglin_bd/blog/item/fa60c4d3866f972933fa1c87.html

  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/yongwangzhiqian/p/3960242.html
Copyright © 2011-2022 走看看