Java -- 内部类, 成员内部类,局部内部类,匿名内部类,闭包和回调, 枚举类
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 -- 内部类, 成员内部类,局部内部类,匿名内部类,闭包和回调, 枚举类的更多相关文章
- Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案
内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...
- 【java基础】内部类,局部内部类,匿名内部类、静态内部类、接口中的内部类
内部类: 1.定义在一个类中的内部类,内部类的实例化伴随着外围类所定义的方法来构造,内部类对象有外围类的隐式引用,所以内部类可以直接访问外围类的外围类的域,包括私有的,这是内部类的访问特权,所以比常规 ...
- C#的匿名委托 和 Java的匿名局部内部类
.NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...
- .NET:C#的匿名委托 和 Java的匿名局部内部类
背景 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一个假设:Java的字节码只支持静态嵌套类,内部类.局部内部类和匿名局部内部类都是编译 ...
- Java 基础 面向对象- 成员内部类/局部内部类/举例Comparable 接口的匿名内部类
笔记: package 任务135; /**类的 内部类, *1.相当于说, 我们可以在类的内部再定义类, * 2.成员内部类: * a.是外部类的一个成员,4个修饰符:static, final , ...
- Java基础-内部类-为什么局部和匿名内部类只能访问局部final变量
先看下面这段代码: public class Test { public static void main(String[] args) { } public void test(final int ...
- java内部类:成员内部类,静态内部类方法内部类,匿名内部类(A)
package cn.kecheng; /** * 在java中,一个文件可以定义多个类,文件名必须和public 类型的类的类名保持一致.这两个类是平行关系. * 在java中,一个类也可以定义在一 ...
- day04(权限修饰符,内部类,局部内部类,匿名内部类)
权限修饰符, Public >protected >default > private public 公共权限 随便都可以访问 protected 子类可以访问权限 (子类 ...
- Java中的局部内部类
package Smoke; public class Inner { private int num = 3; class Limian{ public void show(){ //内部类可以访问 ...
- 学习android学习必备的java基础知识--四大内部类
学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...
随机推荐
- 安卓SAX解析XML文件
XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...
- Oracle集群和灾备解决方案介绍
Oracle本身有各种各样的解决方案,本文主要是对以下几种解决方案做一下简单的梳理. 1. Oracle Rac解决方案. Oracle Rac主要通过两台Oracle服务器来组件集群,提高Or ...
- Linux的驱动模块管理:modprobe
由一段脚本開始: MODULE_PATH=/lib/modules/`uname -r` if [ ! -f ${MODULE_PATH}/modules.dep.bb ]; then # depmo ...
- jfreechart折线图 demo
public class ChartUtil { public static ChartUtil chartUtil; private RoomViewsDataService roomViewsDa ...
- 《TomCat与Java Web开发技术详解》(第二版) 第六章节的学习总结 ---- JSP技术
第六章主要介绍了JSP的相关知识. 1.JSP:是通过在HTML文件中加入java程序片段(Java Scriptlet)和JSP标记,就构成了JSP文件.JSP实质上是Servlet.JSP的API ...
- 搭建apphouse(docker镜像私服)
1.下载apphouse,地址为http://www.youruncloud.com/soft.html2.上传AppHouse_v1.0.2.tar到服务器并解压3../apphouse_insta ...
- Django下实现HelloWorld
我的实现工具:window10 在window10 下面,实现第一个Django的HelloWorld项目. 1.创建一个项目 确保你的电脑上装了python和Django.我的是在python2.7 ...
- RecyclerView加载更多用notifyDataSetChanged()刷新图片闪烁
首先来看看对比ListView看一下RecyclerView的Adapter主要增加了哪些方法: notifyItemChanged(int position) 更新列表position位置上的数据可 ...
- Android ImageButton的使用。
1.首先是范例代码,一个基本的ImageButton响应. package com.example.arlxsdemo; import android.graphics.Bitmap; import ...
- CAShapeLayer实现圆形进度条效果
一.CAShapeLayer简单介绍: .CAShapeLayer继承至CALayer,能够使用CALayer的全部属性值 2.CAShapeLayer须要与贝塞尔曲线配合使用才有意义 3.使用CAS ...