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. 【Hadoop基础教程】1、Hadoop之服务器基础环境搭建(转)

    本blog以K-Master服务器基础环境配置为例分别演示用户配置.sudo权限配置.网路配置.关闭防火墙.安装JDK工具等.用户需参照以下步骤完成KVMSlave1~KVMSlave3服务器的基础环 ...

  2. ANDROID L——Material Design具体解释(主题和布局)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  3. DMP

    1.dmp-data mabagement platform数据管理平台 数据赋能,营销智变 2.定义 把分散的第一,第三方异构.多源数据进行整合,然后纳入统一技术平台中,并对这些数据进行标准化和细分 ...

  4. 解决Tomcat下连接Oracle报错"Error while registering Oracle JDBC Diagnosability MBean."

    Tomcat不失为一个好的开发学习容器,但使用Oracle 11g自带的JDBC驱动ojdbc6.jar和JDK6一起运行的时候,特别是和spring框架一起使用会报错:SEVERE: Error w ...

  5. 【JMeter4.0学习(八)】之断言

    目录 响应断言 一.响应断言 1.添加线程组 2.添加HTTP请求默认值 3.添加HTTP请求1 4.先运行“HTTP请求1”,查看结果树的“取样器结果.请求.响应数据” ①取样器结果 ②请求 ③响应 ...

  6. [原]Nginx+Lua服务端合并静态文件

    http://homeway.me 0x01.About 源代码已经上传到github:https://github.com/grasses/nginx-lua-static-merger nginx ...

  7. 由浅到深理解ROS(4)

    消息和消息类型 节点能相互传递消息,节点之间通信也是基于消息.消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容.也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪 ...

  8. scp命令需要指定端口时要紧跟在scp后

      问题来源:我本地是Ubuntu操作系统,有时需要更新一些文件到服务器.但是,为了安全起见我们都是将服务器的sshd端口修改的,通常不使用默认的22号端口. 如果我们使用scp命令时:scp upl ...

  9. centos7.0安装redis扩展

    1.下载 下载地址:https://github.com/phpredis/phpredis/ 文件名:phpredis-develop.zip 文件下载成功后,上传至/usr/local 2.安装 ...

  10. map 玩家上线

    map 玩家上线 else if(gs2ms_add_player == pkt.cmd) { PlayerChannel* pPC = new PlayerChannel(this); //加到地图 ...