Java笔记(十六)……内部类
内部类概述
内部类是将一个类定义在另一个类里面,对里面那个类就成为内部类(内部类,嵌套类)。
当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容
访问特点
内部类可以直接访问外部类的所有成员,包括私有,之所以可以直接访问,是因为内部类持有外部类对象的引用,Outer.this
而外部类想要访问内部类必须创建对象或者使用类名引用
其他类访问内部类格式
Outer.Inner in = new Outer().new Inner();
内部类的位置
内部类定义在成员位置上
与其他成员一样,可以被static,private等修饰
静态内部类
静态内部类只能直接访问外部类的静态成员
- 外部其他类访问静态内部类的非静态成员
- new Outer.Inner().function();
- 外部其他类访问静态内部类的静态成员
- Outer.Inner.function();
注:
- 当内部类定义了静态成员时,该内部类必须是静态的
- 当外部类的静态方法访问内部类时,内部类必须是静态的
内部类定义在局部位置上
不可以被成员修饰符修饰
可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的变量
匿名内部类
匿名内部类其实就是内部类的简写形式
如果该内部类只需调用一次,那么我们不必定义在外部类中,可以直接使用匿名内部类,方便快捷
这是我以前写的一段总结
- 1:
- 2:
- 3: //匿名对象要实例化的接口
- 4: interface Head
- 5: {
- 6: void think();
- 7: }
- 8: //匿名对象要实例化的类
- 9: class Person
- 10: {
- 11: private String name;
- 12: private int age;
- 13:
- 14: Person(String name,int age)
- 15: {
- 16: this.name = name;
- 17: this.age = age;
- 18: }
- 19:
- 20: public String toString()
- 21: {
- 22: return name+"("+age+")";
- 23: }
- 24:
- 25: public void show()
- 26: {
- 27: System.out.println(toString());
- 28: }
- 29:
- 30:
- 31: /*private class Person_head implements head
- 32: {
- 33: void think()
- 34: {
- 35: System.out.println("Person thinking...");
- 36: }
- 37: }*/
- 38:
- 39: public void function()
- 40: {
- 41: //此处为匿名内部类,他结合了创建类和创建对象于一体
- 42: //既创建了一个新的Education的子类,又new了一个这个子类的对象,而且这个对象是匿名的
- 43: new Head()
- 44: {
- 45: public void think()
- 46: {
- 47: System.out.println(Person.this.toString()+" thinking...");
- 48: }
- 49: }.think();
- 50:
- 51: //此处为正常的内部类使用方法,就是被注释掉的代码部分
- 52: //所以匿名内部类代码简洁很多,用起来很方便
- 53: //Person_head ph = new Person_head();
- 54: //ph.think();
- 55:
- 56:
- 57: //注:匿名内部类的使用前提:必须是继承一个类或者实现接口,
- 58: // 因为创建的部分要由父类或者接口的名字来完成
- 59: // 匿名内部类要实现的方法最好不要超过3个,不然会很麻烦
- 60: }
- 61: }
- 62: class AnonymousDemo
- 63: {
- 64: public static void main(String args[])
- 65: {
- 66: AnonymousClassMethod_1();
- 67: AnonymousClassMethod_2();
- 68: }
- 69:
- 70: //这应该是匿名对象的最初定义,即对象没有一个“名字”
- 71: public static void AnonymousClassMethod_1()
- 72: {
- 73: //此处是正常创建对象的方法,对象有一个对应的引用p,所以可以多次调用p
- 74: Person p = new Person("Sunny",2);
- 75: p.show();
- 76: p.show();
- 77: //此处是匿名对象,新建的对象没有与其对应的引用来接受他,所以只能调用一次
- 78: new Person("Sunny",2).show();
- 79:
- 80: //注:一般对象的方法只调用一次时,可以使用匿名对象,也可将匿名对象作为参数传递给函数
- 81: }
- 82: public static void AnonymousClassMethod_2()
- 83: {
- 84: //用一个Person类的匿名对象调用function
- 85: //此处使用了匿名内部类,详见Person类中的function实现方法
- 86: new Person("Sunny",2).function();
- 87: }
- 88:
- 89: }
Java笔记(十六)……内部类的更多相关文章
- “全栈2019”Java第九十六章:抽象局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- “全栈2019”Java第二十六章:流程控制语句中循环语句do-while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十六章:下划线在数字中的意义
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- Java基础学习笔记十六 集合框架(二)
List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...
- Java 读书笔记 (十六) Java 继承
例: 开发动物类,其中动物分别为企鹅以及老鼠,要求如下: 企鹅: 属性(姓名,id), 方法(吃,睡,自我介绍) 老鼠: 属性(姓名,id), 方法(吃,睡,自我介绍) 企鹅类: public cla ...
- Java学习笔记十六:Java中的构造方法
Java中的构造方法 1.使用new+构造方法 创建一个新的对象: 2.构造方法是定义在Java类中的一个用来初始化对象的方法: 3.构造方法与类同名且没有返回值: 4.语法格式: public 构造 ...
- Java提高十六:TreeMap深入分析
上一篇容器元素比较Comparable&Comparator分析的时候,我们提到了TreeMap,但没有去细致分析它,只是说明其在添加元素的时候可以进行比较,从而使得集合有序,但是怎么做的呢? ...
随机推荐
- c/c++中的各种字符串转换
一:CString 和 *char 的转换: 1:CString -> *char 1)CString转化为*char可以使用CString中的GetBuffer()函数,具体如下: CStri ...
- 修改oracle数据库为归档模式
参考博客:http://blog.csdn.net/codesaint/article/details/1901030 Oracle分为非归档模式(NOARCHIVELOG) 和归档模式(ARCHI ...
- 数据结构与算法C语言实现笔记(1)--表
声明:此一系列博客为阅读<数据结构与算法分析--C语言描述>(Mark Allen Weiss)笔记,部分内容参考自网络:转载请注明出处. 1.表 表是最简单的数据结构,是形如A1.A2. ...
- MVC-起始页面设置
MVC的URL是通过路由映射的,因为我们可以通过修改RouteConfig来改变应用的起始页面. public class RouteConfig { public static void Regis ...
- 拖尾渲染器 Trail Renderer
拖尾渲染器(Trail Renderer)用于制作跟在场景中的物体后面的拖尾效果来代表它们在到处移动. 必须给Materials一个材质渲染器设置的Colors才有效. 展示自己的一个demo...
- office2016 部分截图
哈啊哈哈啊哈 看看吧~~~~~~~~~~~~~~~~~
- Linux下使用dnf包管理器安装异常后导致的clear不可用
该命令被包ncurses包含: 名称 : ncurses架构 : x86_64时期 : 0版本 : 5.9发布 : 16.20140323.fc21大小 : 433 k仓库 : @System概要 : ...
- char型字符串(数组)与string型字符串 指针与引用
一.常指针: int *const p; //指针不可改变,但是指针指向的数据可以改变. 指向常量的指针: const int *p; //指针可以改变,但是指针指向的数据不可以改变. 指 ...
- BZOJ 1709: [Usaco2007 Oct]Super Paintball超级弹珠
Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bessie把她们玩游戏草坪划成了N * N(1 <= N<= 1 ...
- JavaSE replaceAll 方法
private String srcStr = "index\\.php\\?action=";//要替换的原字符串 private String destStr = " ...