文档章节

内部类与外部类的互访

五大三粗
 五大三粗
发布于 2015/02/27 14:56
字数 621
阅读 16
收藏 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); 

    } 

});  

© 著作权归作者所有

共有 人打赏支持
五大三粗
粉丝 159
博文 2250
码字总数 4671674
作品 0
广州
程序员
Java的内部类

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

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

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

翻滚吧李博
2017/12/16
0
0
黑马程序员---面向对象之内部类

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

长平狐
2013/07/01
72
0
二、JAVA基础--内部类总结

6.4 内部类 概念:内部类就是定义在另一个类中的类。 好处:可以访问该类的所有数据,包括私有数据。 内部类对同个包的其他类隐藏。 一、内部类访问对象 内部类和外部类是类之间的关系,并不是...

cnslp
2017/04/22
0
0
JAVA内部类是怎么玩儿的

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

牧师-Panda
2016/09/08
15
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash各类扩展详解

Bash各类扩展详解 Bash中主要包括大括号扩展、波浪号扩展、变量扩展、子命令扩展、文件名扩展和算数扩展。这些扩展组合在一起为Bash带来了极大的易用性。掌握这些扩展的用法和功能,能够为B...

小陶小陶
37分钟前
1
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
1
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
1
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部