链接到外部类

  创建内部类时,那个类的对象同时拥有封装对象(封装内部类的外部类)的一个链接,所以内部类可以访问外部类的成员。

  内部类拥有对外部类所有元素的访问权限。

  看如下代码,内部类SSelector访问外部类元素o,而且o是private。

interface Selector
{
boolean end();
Object current();
void next();
} public class Sequence
{
private Object[] o;
private int next = 0;
public Sequence(int size)
{
o = new Object[size];
} public void add(Object x)
{
if(next < o.length)
{
o[next] = x;
next++;
}
} private class SSelector implements Selector
{
int i = 0;
public boolean end()
{
return i == o.length;
}
public Object current()
{
return o[i];
}
public void next()
{
if(i < o.length)
{
i++;
}
}
} public Selector getSelector()
{
return new SSelector();
} public static void main(String[] args)
{
Sequence s = new Sequence(10);
for(int i = 0; i < 10; i++)
{
s.add(Integer.toString(i));
}
Selector s1 = s.getSelector();
while (!s1.end())
{
System.out.println((String)s1.current());
s1.next();
}
}
}

输出结果如下:

0

1

2

3

4

5

6

7

8

9

static内部类

  • 为创建一个static内部类的对象,不需要一个外部类对象。
  • 不能从static内部类的一个对象访问一个外部类对象。
  • 为创建内部类的对象而不需要创建外部类的一个对象,那么可将所有东西设置为static。
abstract class Contents
{
abstract public int value();
} interface Destination
{
String readLabel();
} public class Test3
{
private static class PContents extends Contents
{
private int i = 11;
public int value()
{
return i;
}
} protected static class PDestination implements Destination
{
private String label;
private PDestination(String whereTo)
{
label = whereTo;
}
public String readLabel()
{
return label;
}
} public static Contents cont()
{
return new PContents();
} public static Destination dest(String s)
{
return new PDestination(s);
} public static void main(String[] args)
{
Contents c = cont();
Destination d = dest("Wu Han");
System.out.println(c.value());
System.out.println(d.readLabel());
}
}

内部类中引用外部类对象

  若想在内部类中生成外部类的句柄,就要用一个.和this来命名外部类。

  如下,第一次输出为Test3中的x,初始值为0,第二次使用内部类中的method方法对外部类x进行修改,使其变为5。

public class Test3
{
int x = 0; public class Test4
{
int x;
public void method()
{
//内部类x
x = 3;
//外部类
Test3.this.x = 5;
}
} public Test4 test()
{
return new Test4();
} public static void main(String[] args)
{
Test3 test3 = new Test3();
Test4 test4 = test3.test();
System.out.println(test3.x);
test4.method();
System.out.println(test3.x);
}
}

输出结果:

0

5

通过外部类对象引用内部类对象

  通过外部类对象引用加上.和new与该外部类对应的内部类对象,就可以通过外部类对象来引用内部类对象。

  代码如下,整体与上述代码基本相同,就是在获取内部类对象的时候直接使用.new获取。输出结果也是0 5

public class Test3
{
int x = 0; public class Test4
{
int x;
public void method()
{
//内部类x
x = 3;
//外部类
Test3.this.x = 5;
}
} public static void main(String[] args)
{
Test3 test3 = new Test3();
Test4 test4 = test3.new Test4();
System.out.println(test3.x);
test4.method();
System.out.println(test3.x);
}
}

Java内部类基本使用的更多相关文章

  1. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  2. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  3. 黑马----JAVA内部类

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...

  4. java 内部类 *** 最爱那水货

    注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...

  5. java内部类和匿名内部类

    内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...

  6. Java内部类小程序(成员内部类,静态内部类,匿名内部类)

    /** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...

  7. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  8. java内部类的作用分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  9. 9)Java内部类(Inner Class)

      内部类:不可以有静态数据,静态方法或者又一个静态内部类      内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静 ...

  10. JAVA内部类(转)

    源出处:JAVA内部类 在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部.内部类作为其外部类的一个成员,与其他成员一样, ...

随机推荐

  1. python函数的参数传递问题---传值还是传引用?

    摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...

  2. JavaScript的Cookie操作

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假 设有这样 ...

  3. sublime text 调出结果输出框

    sublime是一个非常好用的代码编辑器,同时可以build program 但是在执行代码的过程中,如果进行了查找等操作,下面原来显示输出框的地方被查找界面替代,而程序结果输出框就会"消失 ...

  4. PHP的Cookie、Session和跟Laravel相关的几点了解

    这两天通过对Cookie和Session的查找和了解,网上关于它们两个的基础知识点都是差不多的,也收藏了几篇不错的博客,同时自己做了些实验后,有了以下几点了解: 1.setcookie 这里有三个地方 ...

  5. IOS NSURLRequest 设置 Header

    https://my.oschina.net/wolx/blog/406092 工程中的请求,需要设置Header,请求令牌才访问,NSURLRequest 请求没有直接设置header 的方法,需要 ...

  6. ARM的启动代码(1):介绍(转)

    源:ARM的启动代码(1):介绍 很多朋友搞嵌入式,写起代码来一点问题没有,到最后上板子调试的时候,挂了.究其原因,还是对芯片的启动地址.启动方式.bootloader和操作系统的衔接出了问题.今天就 ...

  7. java基础(一)面向对象

    对象就是事物存在的实体,例如:人类,计算机等:而对象被分为两个部分,既动态与静态 类:就是同一事物的统称,如果将世界中的一个事物抽象成对象,类就是这类对象的统称,具有相同特性和行为的一类事物就是类. ...

  8. 安卓selector

    定义styles.xml <?xml version="1.0" encoding="utf-8"?> <resources> < ...

  9. iOS 之 编外知识点

    iOS 使用github iOS 开源库介绍 iOS 优质方案 iOS 开发framework 后端数据库使用 Bomb方案 iOS 错误及解决汇总 后台 之 Bmob 申请苹果企业账号

  10. Core Data需求

    大家都在讨论怎么使用Core Data,但是什么时候用到Core Data,这好像是大家很少讨论的问题 我们使用Core Data ,主要用来存储两种类型的数据:固定的数据,和 可能变化的数据. 1. ...