`
hbdzhm
  • 浏览: 35290 次
  • 来自: ...
社区版块
存档分类
最新评论

内部类

阅读更多
读书笔记:
代码:
将内部类向上转型为一个接口时,内部类就有了用武之地。(和从实现某个接口的对象得到这个接口的引用,向上转型为这个对象的基类。效果是一样的)
因为实现某个接口的内部类对于其他人来说能够完全不可见,不可用。你得到的只是一个基类或接口的引用,所以能够方便的隐藏实现细节。
public interface Contents {
int value();
}

public interface Destination {
String readLabel();
}

class Parcel3 {
private class PContents implements Contents {
int i = 11;
public int value() {
return i;
}
}
protected class PDestination implements Destination {
private String label;
private PDestination(String str) {
label = str;
}
public String readLabel(){
return label;
}
}
public PContents getPContents () {
return new PContents();
}
public Destination dest(String s) {
return new PDestination(s);
}
}
public class TestParse1 {
public static void main(String[] args) {
Parcel3 p = new Parcel3();
Contents c = p.getPContents();
Destination d = p.dest("hello");
}
}


1.Parcel3中,PContents 是private的,所有只有Parcel3能访问他,protected 只有Parcel3及其子类、同包类能访问。
2.Contents C 是不能向下转型为PContents、PDestination 的,因为是private内部类的。除非你是继承它的子类。
private内部类完全阻止依赖于类型的编码,并且完全隐藏了实现的细节。客户端程序员不能访问任何新加的、原本不属于公共接口的方法。所以扩展接口是没有价值的。


方法内部及作用域内的内部类
为什么要这么用:
1.如果你实现了某个接口可以创建并返回对其的引用
2.创建一个类你不想这个类是公共可用的

public class Parcel4 {
public Destination dest(String s) {
class PDestination implements Destination {
private String label;
private PDestination(String where) {
label = where;
}
public String readLabel(){return label;}
}
return new PDestination(s);
}
public static void main(String[] args) {
Parcel4 p = new Parcel4();
Destination d = p.dest("sdfsd");
}
}

1.你可以在同一目录任何类中定义的PDestination内部类,不会有命名冲突
2.在dest方法外不能访问PDestination
3.dest方法执行完毕,并不以为着PDestination就不可用了

在作用域内使用内部类:
public class Parcel5 {
private void internalTracking(Boolean b) {
if(b) {
class A {
private String id;
A(String s) {
id = s;
}
String getId() {
return id;
}
A a = new A("a");
String s = a.getId();
}
}
}
public void track(){
internalTracking(true);
}
public static void main(String[] args) {
Parcel5 p = new Parcel5();
p.track();
}
}


匿名类例子:

public class Parcel6 {
public Contents cont () {
return new Contents() {
private int i = 11;
public int value() {
return i;
}
};//分号必须的
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
}

1.在匿名类中,你可以对定义新的成员变量、
2.不能有已命名的构造器。
3.如果它要使用在它外部定义的对象,编译器要求其参数引用是final的,如果忘了会得到一个编译器错误
如下:
public class Parcel9 {
public Destination dest(final String dest, final float price) {
return new Destination() {
private int i;
{
i = Math.round(price);
if(i > 100) {
System.out.println("aaa");
}
}
private String label = dest;
public String readLabel() {
return label;
}
};
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest("hello", 103.0F);
}
}

内部类与访问外部成员
内部类自动拥有外部类所有成员的访问权,当某个外部类对象创建一个内部类对象时候,内部类会保存一个外部类对象的引用,是根据这个隐藏的引用来访问的。内部类只能在与外部类相关联的情况下被创建。


内部类与访问外部类对象

1.如果你需要外部类对象的引用,可以在外部类名称后加个句点和this关键字来获取,任何方法都可以获取那个保存的指向外部类的引用。
public class Parcel11 {
class Contents {
private int i = 11;
public int value() { return i; };
}
class Destination {
private String label;
Destination(String where) {
this.label = where;
}
public String readLabel() {
return label;
}
}
public static void main(String[] args) {
Parcel11 p = new Parcel11();
Parcel11.Contents c = p.new Contents();
Parcel11.Destination d = p.new Destination("hello"); 
}
}

必须先new一个外部类对象,才会生成一个内部类对象。内部类对象会悄悄连接到生成他的外部类对象,如果是嵌套类,则不需要先创建外部类对象。

多层内部类访问外部类
如下:
class MNA {
private void f() {}
class T {
private void g(){}
public class B {
void h() {
g();
f();
}
}
}
}

public class Parcel11 {
     public static void main(String[] args) {
MNA m = new MNA();
MNA.T mnat = m.new T();
MNA.T.B mnatb = mnat.new B();
mnatb.h();
     }
}


内部类的继承
因为内部类的对象初始化要用到外部类的引用,所以在继承内部类的时候。外部类的对象必须被初始化,而在被继承类中并不存在要连接的缺省对象,
class WithInner {
class Inner{}
}
public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}

InheritInner 继承内部类,生成构造器时,缺省的构造器不好,你不能只是传递一个指向外部类对象的引用。必须使用这种语法“
enclosingClassReference.super();
提供了必要的引用,然后程序才会通过。


内部类可以重载吗
class Egg {
private Yolk y;
public Egg() {
System.out.println("new Egg()");
y = new Yolk();
}
protected class Yolk {
public Yolk() {
System.out.println("Egg.Yolk()");
}
}
}

public class BigEgg extends Egg {
public class Yolk {
public Yolk () {
System.out.println("BigEgg.yolk()");
}
}
public static void main(String[] args) {
new BigEgg();
}
}
输出:
new Egg()
Egg.Yolk()

当你继承了外部类的时候,内部类并没有发生特别的变化。这2个内部类是单独的实体各自在各自的空间里。互不影响。

class Egg2 {
protected class Yolk {
public Yolk() { System.out.println("Egg2.Yolk()"); }
public void f() { System.out.println("Egg2.Yolk.f()");}
}
private Yolk y = new Yolk();
public Egg2() {
System.out.println("new Egg2()");
}
public void insertYolk(Yolk yy) {y = yy; }
public void g() { y.f(); }
}

public class BigEgg extends Egg2 {
public class Yolk extends Egg2.Yolk {
public Yolk () {
System.out.println("BigEgg2.yolk()");
}
public void f() {
System.out.println("BigEgg.Yolk.f()");
}
}
public BigEgg() { insertYolk(new Yolk()); }
public static void main(String[] args) {
Egg2 e2 = new BigEgg();
e2.g();
}
}

输出:

Egg2.Yolk()
new Egg2()
Egg2.Yolk()
BigEgg2.yolk()



局部内部类

interface Counter {
int next();
}
public class LocalInnerClass {
private int count = 0;
Counter getCounter(final String name) {
class LocalCounter implements Counter {
public LocalCounter() {
System.out.println("LocalCounter");
}
public int next() {
System.out.print(name);
return count++;
}
}
return new LocalCounter();
}
Counter getCounter2(final String name) {
return new Counter() {
{
System.out.println("Counter");
}
public int next() {
System.out.print(name);
return count++;
}
};
}
public static void main(String[] args) {
LocalInnerClass lic = new LocalInnerClass();
Counter c1 = lic.getCounter("local inner");
Counter c2 = lic.getCounter2("anoymous inner");
for(int i=0; i<5; i++)
System.out.println(c1.next());
for(int i=0; i<5; i++)
System.out.println(c2.next());
}
}

输出如下:
LocalCounter
Counter
local inner0
local inner1
local inner2
local inner3
local inner4
anoymous inner5
anoymous inner6
anoymous inner7
anoymous inner8
anoymous inner9

1.局部内部类不能有访问控制符。因为他不是外部类的一部分
2.可以访问当前当前代码块内的常量。和外部类的所有成员。
使用局部内部类而不使用匿名内部类的原因是,你不需要不止一个此内部类的对象。

[size]内部类标识符[/size]
1.外部类的名字+'$'+内部类的名字
2.如果是匿名的,编译器会自动产生一个数字作为标识符
3.如果内部类是嵌套在别的内部类之中同1.
分享到:
评论

相关推荐

    内部类分类及应用

    在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...

    内部类 匿名内部类 内部接口 对比说明

    内部类是Java编程语言中的一种特性,它允许我们在一个类的内部定义另一个类。这种设计模式在Android开发中尤其常见,因为它可以有效地管理代码和实现特定的功能。本文将详细探讨内部类、匿名内部类以及内部接口的...

    Java4Android 35_内部类和匿名内部类

    在Java编程语言中,内部类和匿名内部类是两种特殊类型的类,它们为代码的组织和功能实现提供了独特的灵活性。本教程"Java4Android 35_内部类和匿名内部类"深入探讨了这两个概念,旨在帮助开发者更好地理解和运用它们...

    java 内部类使用(内部匿名类)

    内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...

    java 匿名内部类的使用规范

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...

    Java语法总结 - 内部类

    内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。 成员内部类 成员内部类是定义在外部类的成员变量中的一种内部类。它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。成员内部...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

    java基础第七章内部类与异常类.doc

    Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...

    java内部类的讲解

    ### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    内部类的分类及各自用法

    根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...

    反射私有内部类的例子

    ### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...

    JAVA 内部类 PPT

    Java内部类是Java语言的一个独特特性,它允许我们在一个类的内部定义另一个类。这种设计提供了更高级别的封装和组织代码的方式。以下是关于内部类及其相关知识点的详细说明: 1. **内部类基本语法** - **实例内部...

    内部类的使用

    首先,内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像其他成员变量一样,可以直接访问外部类的所有成员,包括私有成员。局部内部类只存在于某个方法内,它的作用范围更小,...

    java内部类详解

    内部类主要分为四种类型:静态内部类、成员内部类、局部内部类和匿名内部类。 1. 静态内部类(Static Inner Class) 静态内部类与普通的类类似,只是它们定义在外部类中,并且前面带有 `static` 关键字。它们不会...

    Java 深入理解嵌套类和内部类

    Java 嵌套类和内部类详解 Java 中的嵌套类和内部类是指在一个类的内部定义另一个类,这种类称为嵌套类(nested classes)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称...

    Java内部类总结

    Java内部类主要包括以下几种类型:成员内部类(非静态内部类)、静态内部类(也称为静态嵌套类)、局部内部类和匿名内部类。 - **成员内部类**:这种类型的内部类是定义在外部类的一个成员位置上,它可以访问外部类...

    浅谈内部类与静态内部类的应用

    内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态内部类。 成员内部类,就像它的名字一样,是类的一个成员,与字段和方法处于同一级别。它可以访问外部...

    Java内部类(DOC)

    ### Java内部类(DOC)详解 #### 一、概述 Java内部类是Java语言中一个重要的概念,它指的是那些类定义被嵌套在其他类定义中的类。与之相对应的是顶层类,即那些类定义没有被嵌套在其他类中的类。内部类又可以...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...

Global site tag (gtag.js) - Google Analytics