1. 成员内部类分为  静态内部类 和 非静态内部类。

非静态内部类 和 外部类的其他成员一样处理, 非静态内部类可以访问外部类的private的属性,而外部类不能访问非静态内部类的属性,需要实例非静态内部类,然后操作其属性。

外部类对象访问非静态内部类成员时, 可能非静态普通类对象根本不存在,而非静态内部类对象访问外部类成员时,外部类对象一定是存在的。

静态成员不能访问非静态成员。

外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员。

2. 内部类的使用情况。

a. 在外部类中使用内部类: 作为外部类成员,与使用其他普通类类似,只是要注意外部类的静态成员不能使用非静态内部类。

b. 在外部类以外使用内部类:

A.AA aa = new A().new AA();  //非静态内部类

  aa.funAA();

A.AB ab = new A.AB();     //静态内部类

  ab.funAB();

class A
{
int a = 0;
public class AA
{
public AA()
{
} public void funAA()
{
System.out.println("funAA in classAA");
}
} public static class AB
{
public void funAB()
{
System.out.println("funAB in classAB");
}
} } public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
A.AA aa = new A().new AA();
aa.funAA(); A.AB ab = new A.AB();
ab.funAB();
} }

3. 局部内部类。

讲一个内部类在方法里面定义,则这个内部类为局部内部类,只有在这个方法中有效。如下的class C .....

public static void main(String[] args) {
// TODO Auto-generated method stub
class C
{
void funC()
{
System.out.println("funC");
}
} C c = new C();
c.funC();
}

4. 匿名内部类

最常用的匿名内部类的

使用方式是需要创建某个接口类型(或者抽象类)的对象 ,如下,

如下String  name, 匿名内部类访问局部变量时 必须用final修饰, 不然编译报错。

interface AA
{
abstract void funAA();
} public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
final String name = "hello" ;
AA a = new AA()
{
public void funAA()
{
System.out.println(name);
}
};
a.funAA();
}
}

5. 闭包和回调

闭包: 是一种能够被调用的对象,它保存了创建它的作用域的信息。

回调: 某个方法一旦获得内部类对象的引用后,就可以在适合时候反过来调用外部类的实例的方法。

如下例子中 interface Teachable 和 class Programer 都有work方法, 那如果一个人既是teacher 又是 programer怎么解决??

如果仅仅是 class TeachableProgramer extends Programer implements Teachable   {  ... }

那class TeachableProgramer中的work()到底是哪个的??

这则需要用闭包和回调,如下:

interface Teachable
{
void work();
} class Programer
{
String name;
public Programer(){};
public Programer(String name)
{
this.name = name;
}
String getName()
{
return this.name;
}
public void work()
{
System.out.println("Programer coding");
}
} class TeachableProgramer extends Programer
{
public TeachableProgramer(String name)
{
super(name);
}
private void teach()
{
System.out.println("Teacher teach");
}
private class Colsure implements Teachable
{
public void work()
{
teach();
}
}
public Teachable getCallback()
{
return new Colsure();
}
} public class Main { public static void main(String[] args) {
TeachableProgramer people = new TeachableProgramer("kevin");
people.work();
people.getCallback().work();
}
}

6. 枚举类

枚举类的创建用 enum 关键词, 如下两个例子创建枚举类

Gender1

public enum Gender1 {
MALE, FEMALE;
private String name;
public void setName(String name)
{
switch (this)
{
case MALE:
if(name.equals("man"))
{
this.name = name;
}
else
{
System.out.println("Error");
return;
}
break;
case FEMALE:
if(name.equals("woman"))
{
this.name = name;
}
else
{
System.out.println("Error");
return;
}
break;
}
} public String getName()
{
return this.name;
}
}

Gender2

public enum Gender2 {
MALE("man"), FEMALE("woman");
private String name;
private Gender2(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
}

Gender3 枚举类实现接口

interface InterfaceXX
{
void fun1();
void fun2();
} public enum Gender3 implements InterfaceXX { MALE("man")
{
public void fun2()
{
System.out.println("fun2 in MALE");
}
},
FEMALE("woman")
{
public void fun2()
{
System.out.println("fun2 in FEMALE");
}
};
private String name;
private Gender3(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
} public void fun1()
{
System.out.println("fun1 is the same in MALE and FEMALE");
}
}

main 函数中使用枚举类

public class Main {
public static void main(String[] args) {
Gender1 g1 = Enum.valueOf(Gender1.class, "FEMALE");
g1.setName("man");
g1.setName("woman");
System.out.println(g1.getName()); Gender2 g2 = Enum.valueOf(Gender2.class, "MALE");
System.out.println(g2.getName());
System.out.println(Gender2.FEMALE.getName()); Gender3 g3 = Enum.valueOf(Gender3.class, "MALE");
System.out.println(g3.getName());
g3.fun1();
g3.fun2();
}
}

Java -- 内部类, 成员内部类,局部内部类,匿名内部类,闭包和回调, 枚举类的更多相关文章

  1. Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...

  2. 【java基础】内部类,局部内部类,匿名内部类、静态内部类、接口中的内部类

    内部类: 1.定义在一个类中的内部类,内部类的实例化伴随着外围类所定义的方法来构造,内部类对象有外围类的隐式引用,所以内部类可以直接访问外围类的外围类的域,包括私有的,这是内部类的访问特权,所以比常规 ...

  3. C#的匿名委托 和 Java的匿名局部内部类

    .NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...

  4. .NET:C#的匿名委托 和 Java的匿名局部内部类

    背景 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一个假设:Java的字节码只支持静态嵌套类,内部类.局部内部类和匿名局部内部类都是编译 ...

  5. Java 基础 面向对象- 成员内部类/局部内部类/举例Comparable 接口的匿名内部类

    笔记: package 任务135; /**类的 内部类, *1.相当于说, 我们可以在类的内部再定义类, * 2.成员内部类: * a.是外部类的一个成员,4个修饰符:static, final , ...

  6. Java基础-内部类-为什么局部和匿名内部类只能访问局部final变量

    先看下面这段代码: public class Test { public static void main(String[] args) { } public void test(final int ...

  7. java内部类:成员内部类,静态内部类方法内部类,匿名内部类(A)

    package cn.kecheng; /** * 在java中,一个文件可以定义多个类,文件名必须和public 类型的类的类名保持一致.这两个类是平行关系. * 在java中,一个类也可以定义在一 ...

  8. day04(权限修饰符,内部类,局部内部类,匿名内部类)

    权限修饰符, Public  >protected >default > private public 公共权限   随便都可以访问 protected  子类可以访问权限  (子类 ...

  9. Java中的局部内部类

    package Smoke; public class Inner { private int num = 3; class Limian{ public void show(){ //内部类可以访问 ...

  10. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

随机推荐

  1. TMS320C6455 SRIO 实现方案

    TMS320C6455 SRIO 实现方案 SRIO(Serial RapidIO)构架是一种基于高性能包交换的互连技术,主要功能是完成在一个系统内的微处理器.DSP.通信和网络处理器.系统存储器以及 ...

  2. stage3D基础二-----顶点和片段着色器(转)

    来源:http://www.adobe.com/cn/devnet/flashplayer/articles/vertex-fragment-shaders.html 本教程将介绍着色器.着色器是 S ...

  3. websocket通讯协议(10版本)简介

    前言: 工作中用到了websocket 协议10版本的,英文的协议请看这里: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotoc ...

  4. object.Equals与object.ReferenceEquals方法

    object.Equals方法表达的是语义判等,不一定是引用判等. object.ReferenceEquals方法是肯定是引用判等. 怎么实现一个对象的值语义的 Equals方法?实验. MyCla ...

  5. cxf 创建动态webService

    D:\developTools\apache-cxf-2.5.2\samples\wsdl_first_dynamic_client CXF 方法 cxf方法 serviceInfo.getBindi ...

  6. JAVA读文件和写文件的的代码模版

    有的时候经常为真么读写文件最合理发愁,因为JAVA提过读写文件的方式太多了(C更甚至,fopen & open又有多少人傻傻分不去,更别说ReadFile了). 这里个人绝对比较好的写法,仅供 ...

  7. 《转》PyQt4 精彩实例分析* 实例2 标准对话框的使用

    和大多数操作系统一样,Windows及Linux都提供了一系列的标准对话框,如文件选择,字体选择,颜色选择等,这些标准对话框为应用程序提供了一致的观感.Qt对这些标准对话框都定义了相关的类.这些类让使 ...

  8. 初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(一)

    转自:http://blog.csdn.net/thebestleo/article/details/52269999 首先我要说明一下,本人新手一枚,本文仅为同样热爱学习的同学提供参考,有不 对的地 ...

  9. DDD开源框架

    DDD开源框架: ABP ENODE https://github.com/VirtoCommerce/vc-community APWorks https://github.com/daxnet/B ...

  10. Android JSON And Object Cast

    Ref:JSON字符串转换成Java实体类(POJO) Ref:Java.Json转换方式之二:Jackson Ref:Jackson 框架,轻易转换JSON Ref:几种序列化协议(protobuf ...