文档章节

内部类与外部类的互访

五大三粗
 五大三粗
发布于 2015/02/27 14:56
字数 621
阅读 22
收藏 0

内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员。

 

内部类访问外部类

里面的可以自由访问外面的,规则和static一样。(访问非静态时必须先创建对象)

 

具体如下:

 

非静态内部类的非静态方法

直接访问

 

 

public class Outter { 

    int i = 5; 

    static String string = "Hello"; 

     

    class Inner1{ 

        void Test1 (){ 

            System.out.println(i); 

            System.out.println(string); 

        } 

    } 

}<span style="font-family:Arial,Helvetica,sans-serif"> </span> 

静态内部类的非静态方法

因为静态方法访问非静态外部成员需先创建实例,所以访问i时必须先new外部类。

 

 

public class Outter { 

    int i = 5; 

    static String string = "Hello"; 

     

    static class Inner2{ 

        void Test1 (){ 

            System.out.println(new Outter().i); 

            System.out.println(string); 

        } 

    } 

静态内部类的静态方法

规则如上

 

 

public class Outter { 

    int i = 5; 

    static String string = "Hello"; 

     

    static class Inner2{ 

        static void Test2 (){ 

            System.out.println(new Outter().i); 

            System.out.println(string); 

        } 

    } 

}<span style="font-family:Arial,Helvetica,sans-serif"> </span> 

 外部类访问内部类

大方向:因为将内部类理解为外部类的一个普通成员,所以外面的访问里面的需先new一个对象。

 

非静态方法访问非静态内部类的成员:

new 内部类对象

 

 

public class Outter { 

    void Test1(){ 

        System.out.println(new Inner1().i); 

    } 

    class Inner1{ 

        int i = 5; 

//      static String string = "Hello";  定义错误! 

    } 

 静态方法访问非静态内部类的成员

静态方法Test2访问非静态Inner1需先new外部类;

 

继续访问非静态成员i需先new 内部类

 

所以访问规则为:new Outter().new Inner1().i

 

 

public class Outter { 

    static void Test2(){ 

        System.out.println(new Outter().new Inner1().i); 

    } 

    class Inner1{ 

        int i = 5; 

//      static String string = "Hello";  定义错误! 

    } 

}<span style="font-family:Arial,Helvetica,sans-serif"> </span> 

非静态方法访问静态内部类的成员

先“外部类.内部类”访问至内部类。

 

若访问静态成员,则需先new再访问;若访问非静态成员,则可直接访问。

 

 

public class Outter { 

    void Test1(){ 

        Outter.Inner2 inner2 = new Outter.Inner2(); 

        System.out.println(inner2.i); 

        System.out.println(inner2.string); 

        System.out.println(Outter.Inner2.string); 

    } 

    static class Inner2{ 

        int i = 5; 

        static String string = "Hello";  

    } 

}<span style="font-family:Arial,Helvetica,sans-serif"> </span> 

非静态方法访问非静态内部类的成员

先“外部类.内部类”访问至内部类,再new即可访问静态成员。

 

 

public class Outter { 

    void Test1(){ 

        Outter.Inner1 inner2 = new Outter.Inner1(); 

        System.out.println(inner2.i); 

    } 

    class Inner1{ 

        int i = 5; 

//      static String string = "Hello"; 定义错误! 

    } 

 

匿名内部类

匿名内部类访问外部成员变量时,成员变量前应加final关键字。

 

 

final int k = 6; 

((Button)findViewById(R.id.button2)).setOnClickListener(new OnClickListener() { 

    @Override 

    public void onClick(View v) { 

        // TODO Auto-generated method stub 

        System.out.println(k); 

    } 

});  

© 著作权归作者所有

共有 人打赏支持
五大三粗
粉丝 160
博文 2264
码字总数 4712446
作品 0
广州
程序员
私信 提问
Java的内部类

类是java中定义的一个独立的程序单元,在某种情况下也可以把一个类放在另外一个类的内部定义,这定义在内部的类就叫内部类或嵌套类。 1.内部类提供了更好的封装,把一个内部类隐藏在外部类之...

西红柿的眼泪
2016/07/09
38
0
内部类, 静态内部类, 局部类, 匿名内部类的解析和区别

众所周知,外部顶级类的类名需和类文件名相同,只能使用public和default。而内部类是指在外部类的内部再定义一个类,类名不需要和文件名相同。内部类可以是静态static的,也可用public,def...

翻滚吧李博
2017/12/16
0
0
JAVA内部类是怎么玩儿的

内部类一共分为:成员内部类,局部内部类,静态嵌套类,匿名内部类。 1. 成员内部类 最普通的内部类 成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private...

牧师-Panda
2016/09/08
15
0
黑马程序员---面向对象之内部类

-------------------------android培训、java培训、期待与您交流! ------------------------- Java中的内部类有四种:一般内部类、静态内部类、局部内部类、匿名内部类。 一、一般内部类 定...

长平狐
2013/07/01
82
0
Java中的内部类总结

内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为...

zhangyujsj
2016/01/04
4
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
31分钟前
10
2
Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
12
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
18
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部