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. Java和C++ 比較

    总体差别 1. C/C++是直接执行在机器上(编译后为机器码),而java编译后产生*.class文件(字节码)是执行在java虚拟机上在(JVM),经过JVM解译(机器码)再放到真实机器上执行. J ...

  2. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  3. oracle高性能的SQL语句的写法

    1.当多表查询的时候,把数据量小的表放在最后面,ORACLE会把最后面的表当作基础表,因为表间连接时,最右边的表会被放到嵌套循环的最外层.最外层的循环次数越少,效率越高. 2.Oracle采用自下而上 ...

  4. ListView中CheckBox使用问题

    因为CheckBox的点击事件优先级比ListView的高,所以当ListView中使用CheckBox会导致ListView的setOnItemClickListener失去响应. 解决的方法:在C ...

  5. Vue.js 2 入门与提高(一)

    ** Vue.js -- 渐进式前端框架 ** Vue.js作为一个后起的前端框架,借鉴了Angular .React等现代前端框架/库的诸多特点,并且 取得了相当不错的成绩. Vue.js的定位是一 ...

  6. strpos 判断字符串是否存在

    strpos    中为什么要用逗号隔开的原因是因为   防止找出相匹配的中 ,  如   查找1    而数组中  存在  12  那么这个结果也是可以找出来的 ,分别在1 前后加个,  就是为了区 ...

  7. @media screen 针对不同移动设备——响应式设计

    概念: device-pixel-ratio:定义输入设备屏幕的可视宽度与可见高度比率. device-width:输入设备屏幕的可视宽度. orientation :屏幕横竖屏定向.landscap ...

  8. centos7.0 安转mysql5.7

    安装mysql5.7需要boost依赖包groupadd mysql useradd -r -g mysql -s /bin/false mysql cmake . -DCMAKE_INSTALL_P ...

  9. fiddler 清除证书+重新添加证书

    1. 清除证书 ①任意浏览器,打开Internet属性弹窗,点击内容页签下<证书> ②删除个人页签下,颁发者为DO_NOT_TRUST_Fiddler**的数据 2. 重新认证证书 ①打开 ...

  10. 【BZOJ3316】JC loves Mkk 分数规划+单调队列

    [BZOJ3316]JC loves Mkk Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整 ...