`
demojava
  • 浏览: 548874 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

内部类修改外部类属性

    博客分类:
  • JAVA
 
阅读更多

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

分享到:
评论

相关推荐

    类的私有成员实现从外部访问

    利用自定义数据可以把单个的私有成员打包,然后将外部变量的地址指向类内部的私有成员数据地址,就可以实现修改外部变量的同时,类内部的私有成员数据也发生了变化。从而实现了类内部私有成员的数据可以直接操作的...

    e语言-类的私有成员实现从外部访问

    利用自定义数据可以把单个的私有成员打包,然后将外部变量的地址指向类内部的私有成员数据地址,就可以实现修改外部变量的同时,类内部的私有成员数据也发生了变化。从而实现了类内部私有成员的数据可以直接操作的...

    vue实现从外部修改组件内部的变量的值

    1、首先是如何给你定义的变量拿到数据: 这里我自己用的是vuex: 首先在你项目的src文件夹下创建这么一个目录: 之后就要在index.js中将homedatas.js(拿数据的js)共享出去,使页面能拿到数据, ...

    C++外部程序修改exe文件属性信息

    在C++中,通过COM接口,我们可以访问和操作系统的底层功能,如修改文件属性。MFC是微软提供的C++库,它简化了Windows应用程序的开发,包括对COM的支持。 在"基础修改"部分,我们将学习如何使用C++和MFC来直接操作...

    java类修饰词和内部类详解

    此外,为了简化代码,我们可以使用局部内部类来表示圆的属性,如颜色等。 ```java public abstract class Shape { // 抽象方法 public abstract void draw(); } public class Circle extends Shape { // 成员...

    解决mysql不是内部或外部命令.docx

    标题所述的问题是关于在Windows操作系统中使用MySQL时遇到的一个常见错误:“mysql不是内部或外部命令”。这个错误通常意味着系统无法识别“mysql”这个命令,因为它不在系统的PATH环境变量所包含的目录列表中。下面...

    第十一天 07实例属性、类属性【千锋Python人工智能学院】1

    这样的属性对外部代码是不可见的,除非通过类的内部方法访问。在`Dog`类的另一个例子中,`__type`是私有类属性,外部代码无法直接访问。 总结起来,Python中的实例属性和类属性提供了灵活的方式来组织和管理对象的...

    C++类与对象的修改

    类的成员函数(也称为方法)是定义在类内部,用于操作类的属性和执行相关行为的函数。这些函数可以访问类的私有和公有成员,实现了对对象的控制。 8.4 对象成员的引用 在C++中,对象的成员可以通过`.`运算符来访问...

    Java 中包的概念,类的说明符与内部类19

    静态内部类不持有对外部类的引用,可以直接通过类名访问,如同普通类一样。 孙鑫老师的"JAVA从入门到精通"教程深入浅出地讲解了这些概念,旨在帮助初学者掌握Java编程的基础。在学习过程中,313.swf可能是一个包含...

    易语言从外部取类成员

    公有成员可以在类的外部被访问,而私有成员只能在类的内部访问。如果要从外部访问私有成员,可能需要提供公共的访问接口或使用特殊技巧。 - **方法2**:可能指的是通过接口(Interface)或抽象类(Abstract Class)...

    python防止随意修改类属性的实现方法

    尽管如此,我们仍然可以通过`_V__x`来访问和修改这个私有属性,但这种方法对于外部使用者来说不那么直观,因此降低了误修改的可能性: ```python v._V__x = 4 print(v.x) # 输出:4 ``` 这里需要注意的是,虽然...

    day11_static、内部类、权限、参数传递、复习.pdf

    但是,非静态内部类的实例必须依附于一个外部类实例,即创建非静态内部类对象时需要一个外部类对象。 6. 权限控制(Access Control) Java提供四种访问控制修饰符:`public`, `protected`, `private` 和默认(包...

    易语言-类的私有成员实现从外部访问

    利用自定义数据可以把单个的私有成员打包,然后将外部变量的地址指向类内部的私有成员数据地址,就可以实现修改外部变量的同时,类内部的私有成员数据也发生了变化。从而实现了类内部私有成员的数据可以直接操作的...

    4_3非访问控制-接口-内部类.pptx

    例如,`Person`类中的`total`变量就是一个类属性,所有`Person`实例共享这个计数器。 3. `final`关键字:`final`用于声明不可变的变量、常量或类。一旦赋值,final变量就不能再次赋值。它也可以用来确保类不能被...

    解决WinForm设置 DataSource 属性后无法修改项集合

    之所以会出现上述错误,主要是因为当控件绑定了 `DataSource` 属性后,其内部的 `Items` 集合会被设置为只读状态,目的是为了确保数据的一致性和完整性。这是因为绑定的数据源(例如 DataTable)通常是外部数据的...

    举例讲解Python面相对象编程中对象的属性与类的方法

    - **私有属性(Private Attributes)**:以两个下划线`__var2`开头的属性是私有属性,在Python中并不是真正的私有,而是弱私有,意味着它们在类内部可以被访问,但在类的外部通常不应直接访问。如果尝试直接访问,...

    运用反射得到类中的属性和值

    在Java编程语言中,反射是一种强大的机制,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地调用方法或修改字段值。本文将深入探讨如何通过反射来获取一个类中的所有属性及其对应的值,从而更好地...

    javac不是内部或外部命令解决

    在IT领域,尤其是在Java开发中,遇到“javac不是内部或外部命令”的错误是一个常见的问题,这通常意味着系统无法识别javac命令,即Java编译器。本文将深入解析这一问题,并提供详细的解决方案,帮助读者理解和掌握...

    WIN7_ipconfig不是内部或外部命令

    ### WIN7_ipconfig不是内部或外部命令 #### ipconfig命令问题解析 在Windows 7操作系统中,用户在命令提示符(CMD)界面下输入`ipconfig`命令后遇到错误提示:“ipconfig不是内部或外部命令,也不是可运行的程序或...

Global site tag (gtag.js) - Google Analytics