java基础学习面向对象之匿名内部类 五-13
内部类
一个类定义在另一个类的里面,对立面那个类就叫做内部类,或者嵌套类。
特点,内部类可以直接访问外部类中的成员。包括私有成员。而外部类要访问内部类中的成员必须要建立内部类对象。
代码
package demo3;
/*** 内部类* @author Angus**/
public class InnerTest {public static void main(String[] args) {Outer o = new Outer();o.method();Outer.Inner oi = new Outer().new Inner();oi.show();}}
class Outer {private int num = 10;class Inner{public void show(){System.out.println(num);}}public void method(){Inner i = new Inner();i.show();}
}
inner内部类。
访问规则:1.内部类可以直接访问外部类中的成员,包括私有。是因为内部类中持有了一个外部类的引用。格式:外部类名.this
2.外部类要访问内部类,必须要建立内部类的对象。
3.内部类作为外部类的成员 可以被私有化
如何直接访问内部类中的成员 function()
outer.inner in=new outer().inner();
in.function();
访问格式:
1.当内部类定义在外部类的位置上的时候,而且非私有,可以在外部其他类中,可以直接建立内部类对象
格式 外部类名.内部类名 变量名=外部类对象.内部类对象
outer.inner in=new outer().inner();
2.当内部类在成员的位置上,就可以被成员修饰符所修饰。
比如:private static,
当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
在外部其他类中,如何直接访问static内部类的非静态成员?
new Outer.Inner().sunction();
在外部其他类中,如何直接访问staic内部类的静态成员?
outer.inner.function();
注意:当内部类中定义了静态成员,该内部类必须是static 的。
当外部类中的静态方法访问内部类是,该内部类必须是静态的
内部类定义原则:
当描述事物中,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物中的内容。
局部内部类
class outer{int x=3;void method(){int y=4;class inner{void function(){}}}}
内部类定义在局部的时候:
1.不可以被成员修饰符修饰
2.可以直接访问外部类中的成员,因为还持有外部类中的引用
但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
方法中的内部类能不能访问方法中的局部变量,为什么?
/***说明下此程序在内存中的执行过程,就可以了解 为什么方法中的内部类不能访问方法中的局部变量。*首先JVM找到主函数的入口, 在栈中就开辟了一个main方法的空间 同时 创建了一个 变量o,同时在堆内存中*new Outer()分配了一块内存空间,然后将变量O的引用就指向了该内存空间。Outer o=new Outer();*这就话就执行完毕,在调用function的方法时,就会将方法区中的funtion()方法进入栈中,同时将x=4*加载进栈内存中。如果不将x设置为final ,执行完, o.function();就会将function方法弹栈,此时局部x也就不存在,*内部了也是一个类,在创建一个改局部类的对象之后,只有没有其他变量引用它,它才会变成垃圾,并且在不定时消失*。所以可能发生的情况是 :在局部变量消失之后,内部类的对象还存活。也就是说在执行 内部类add()方法的时候x已经*不存在了。所以,方法中的内部类不能访问方法中的局部变量。**解决办法 就是将x 前加final 变成该内部类inner对象中的一个数据成员。这样,即使栈中局部变量x已消失,*但由于它是final,其值永不变,因而局部内部类对象在变量x死亡后,照样可以访问final型局部变量。*/class Outer{void function(){final int x=4;//方法的局部变量 //内部类class Inner{//内部类的方法void add(){System.out.print(x+4); //调用外部类方法中的局部变量}}new Inner().add();//创建个内部类的对象}}
public class Test2 {public static void main(String[] args) {Outer o=new Outer();//创建外部类对象并将 o的引用指向该变量的地址o.function();//}
}
重点为匿名内部类
没有名字的局部内部
package demo3;
/*** 匿名内部类* @author Angus* 没有名字的局部内部类* 前提:* 必须存在一个类,抽象类,或者接口。* 格式:* new 类名或者接口名{* 重写类或者接口的方法* 也可以自己定义新的方法* }*/
public class InnerTest {public static void main(String[] args) {Outer o = new Outer();o.method();}}
class Outer {private int num = 10;public void method(){new inner(){@Overridepublic void show() {System.out.println("show");}}.show(); //怎么用?}
}
interface inner{public abstract void show();
}
什么时候用?
package demo3;
/*** 匿名内部类使用* @author Angus**/
public class AnimalTest {public static void main(String[] args){//方式一Test t = new Test();
// Dog d = new Dog();
// t.show(d);// 方式二t.show( new Animal() {@Overridepublic void eat() {System.out.println("eat2");}});}
}
interface Animal{public abstract void eat();
}
class Dog implements Animal{@Overridepublic void eat() {System.out.println("eat");}}
class Test{public void show (Animal a){a.eat();}
}
最后附上JDK使用文档API 下载
java基础学习面向对象之匿名内部类 五-13相关推荐
- JAVA基础学习--面向对象
JAVA基础学习–面向对象 1.面向对象与面向过程: 面向过程:就代表从头到位,每一步都需要我们来完成,例如洗衣服,首先收拾脏衣服.接上水.到洗衣液.搓.倒水.拧干.晾晒.每一步都需要我们来完成. 面 ...
- Java基础学习——第六章 面向对象编程(下)
Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...
- java基础学习-4
Java基础学习-4 static 注意事项 重新认识main方法 继承 小练习 子类到底能继承父类中的哪些内容(第126集)*** 继承过程中成员变量和成员方法的访问特点 小练习 小总结 构造方法的 ...
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- 尚学堂JAVA基础学习笔记_2/2
尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...
- java基础学习_IO流03_字符流、IO流小结、案例_day21总结
java基础学习_IO流03_字符流.IO流小结.案例_day21总结 ================================================================ ...
- Java 基础学习-Java语言概述
Java 基础学习 第一章 Java语言概述 回顾java基础知识,进行整理记录. 文章目录 Java 基础学习 前言 一. Java语言发展史(了解) 二.Java语言跨平台原理(理解) 三.JRE ...
- Java基础学习(12)
Java基础学习 一.不可变集合 二.Stream流 2.1 Stream流数据添加 2.2 Stream流的中间方法 2.3 Stream终结方法 三. 方法引用 3.1 方法引用的基本概念 3.2 ...
- java基础学习-6
Java基础学习-6 双列集合 Map的常见API Map的遍历方式 HashMap 小练习 LinkedHashMap TreeMap TreeMap--小练习1 TreeMap--小练习2 Tre ...
最新文章
- 综合计算机考试题库,2017年职称计算机考试综合试题模拟题库5
- Eclipse一直building workspace问题解决
- android代码记录日期,Android日期和时间选择器实现代码
- c语言如何发现错误在哪里,二个C语言例子,编译没通过.不知道错在哪里[求助]
- python里orient_OrientDB Python连接操作
- FastMM FastCode FastMove的使用
- OCR——PaddleOCR之文字识别的学习笔记
- 语言编程思维陈萌_这本书告诉你,计算机为何能读懂人类语言,编程思维让你更聪明...
- 2016HUAS暑假集训训练题 F - 简单计算器
- NUC1776 Tiling Up Blocks【二维最长上升子序列+DP】
- C1083: 无法打开包括文件: “stdafx.h”: No such file or directory
- 小红帽Linux系统命令重启,Linux系统常用命令之一
- PS魔棒工具提示不能完成请求,因为程序错误和不能完成请求,因为没有足够内存以及内存不能为read的处理
- 塔勒布《反脆弱》读后感
- 导出IE浏览器配置的注册表信息 IE设置的注册表相关信息以及修改方法
- (考试大整理~)Xxy 的车厢调度
- python中r 4.2f%r,006 Python中的 字符串String
- 计算机领域顶级期刊是什么,喜报 | 我所一篇论文被计算机领域顶级期刊TKDE录用...
- 个人看过较好的电影推荐
- 1. HTML5+CSS3