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. 0x00 使用Ant 设置项目

    1. Ant 简介: Ant 是一款广泛使用的流行的开源构建工具,它用Java语言编写. 2.Ant官网: Ant官网:http://ant.apache.org/ 3.设置环境变量: 新建 Vari ...

  2. VM虚拟机内ubuntu无法连接到网络

    VM虚拟机内ubuntu无法连接到网络 解决:编辑网络,将网路都删除掉.又一次加入网络桥接和NAT链接. .又一次连接就可以,查看一下ip地址. 方法2: 虚拟机中新装ubuntu 编辑虚拟网络,先恢 ...

  3. Atitit.异步编程的发展历史 1.1. TAP & async/await

    Atitit.异步编程的发展历史 1.1. TAP & async/await 1. 异步编程的发展历史1 1.1. Thread1 1.2. Task1 1.3. Async await2 ...

  4. TC2安装方法

    电驴下载TC2英文原版安装文件,3 Disk,安装方法记录如下: cmd.exe chcp 437 挂载安装文件夹1到A盘 subst a: d:\c\Disk1 另开一个cmd,转到A盘,输入ins ...

  5. R410自带SAS6IR卡折腾记

    因为需要一些做一些自动编译的工作,所以打算淘换一台多核的主机.淘宝找一圈,感觉换下来的dell R410 ~ R710 都可以. 综合对比了一下感觉最低配的R410就能满足要求,最后选择了:X5675 ...

  6. Android发短信

    设置应用一打开时候的背景图片 去掉相对布局时候的标题 去除标题必须在setContentView(R.layout.activity_main)之前. @Override protected void ...

  7. 下载yum安装的rpm包

    方法一 通过yum自带的yumdownloader工具进行下载,这个工具是由yum-utils这个软件安装生成的 执行如下命令,检查yum-utils是否存在: rpm -qa |grep yum-u ...

  8. jvm 调优参数

    -server -Xms6000M -Xmx6000M -Xmn500M -XX:PermSize=500M -XX:MaxPermSize=500M -XX:SurvivorRatio=65536 ...

  9. [c++]对象指针,引用的操作

    1.time类保存在"htime.h"中.要求: ⑴ 数据成员包括时(hour).分(minute).秒(second),为私有成员: ⑵ 能给数据成员提供值的成员函数(默认值为0 ...

  10. iOS最笨的办法实现无限轮播图(网络加载)

    iOS最笨的办法实现无限轮播图(网络加载) 简单的做了一下: 使用方法: 把 请求返回的 图片地址(字符串类型)放进数组中就行 可以使用SDWebImage(我就是用的这个)等..需要自己导入并引用, ...