静态内部类、匿名内部类、局部内部类
2016-03-05 22:48
363 查看
一.静态内部类
1)内部类之前修饰static关键字2)特性:
◆可以有实例,静态成员(字段,方法)
◆实例方法中,无法访问外部实例成员
实例:静态内部类特性测试
public class StaticInnerClass{ public static void main(String []args){ //Outer2.Inner2 inner=new Outer2.Inner2();//构造一个静态内部类对象 Outer2 outer=new Outer2(); outer.outerShow(); } } class Outer2{ private String name="张三"; private int num1=10; private static int num3=100; public void outerShow(){ System.out.println(name); System.out.println(num1); Inner2 inner2=new Inner2(); System.out.println(inner2.name); System.out.println(Inner2.num3); } public static class Inner2{ private String name="李四"; private int num2=20; private static int num3=10; public void innerShow(){ //System.out.println(Outer2.this.name); //静态内部类不能访问外部类的非静态成员 System.out.println(Outer2.num3); System.out.println(num2); } } }
二、匿名内部类
(1)匿名内部类概念匿名类是没有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。
(2)匿名内部类语法
new interfacename(or superclass) { //方法重写 }
当某个方法的参数是接口或者抽象类时,调用这个方法时除了可以直接new一个接口的实现类或者抽象类的子类之外,还可以使用匿名内部类的语法实现临时方法重写(只用一次)。
实例:匿名内部类特性测试
public class AnonymousInnerClass{ public static void main(String []args){ Person p=new Person(); new IAnimal(){ private String name="aa"; { name="哈哈";//代码块优先于构造方法先执行,不能定义静态代码块 } public void eat(){ System.out.println("啃骨头"); } public void show(){ System.out.println(name); } }.show(); p.feed(new IAnimal(){ public void eat(){ System.out.println("吃鱼肉"); } }); } } class Person{ public void feed(IAnimal animal){ animal.eat(); } } interface IAnimal{ public abstract void eat(); }
三、局部内部类
(1)局部内部类特点:①定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。
②局部内部类访问外部类的属性和方法使用“外部类名.this.属性名”和“外部类名.this.方法名(参数)”的形式。
③对外部世界完全隐藏,只能在其作用域内生成对象。
(2)局部内部类有以下限制:
①局部类不能加访问修饰符,因为它们不是类成员。
②成员内部类不能与外部类重名。
③局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰
实例:局部内部类特性测试
public class LocalInnerClass{ public static void main(String []args){ Outer3 outer=new Outer3(); outer.showOuter(); } } class Outer3{ private String name="zhangsan"; private int num1=10; private static int num2=20; public void showOuter(){ final int num4=50; //局部内部类不能加访问修饰符 class Inner3{ private int num3=30; private int num1=20; public void showInner(){ System.out.println(num3); System.out.println(num1); System.out.println(Outer3.this.num1); System.out.println(Outer3.num2); System.out.println(num4); //局部内部类只能访问声明其方法中的常量. } } Inner3 inner=new Inner3(); inner.showInner(); } }
相关文章推荐
- Linux(一)——文本模式指令
- 消息队列ActiveMQ(二)——安全配置
- 十六进制转化为八进制
- 一个斜率优化?
- 接口测试及一些想法
- Oracle Application Testing Suite 12.5.0.2Sample MedRec无法访问问题
- JDBC连接数据库,增删改查的应用
- LeetCode96——Unique Binary Search Trees
- 去掉Activity的头部标题栏及全屏显示解决方案 .
- 关于求对称字符串长度的思考
- Overloads和Overrides在元属性继承上的特性
- GDOI2016模拟3.5总结
- Jquery中get函数
- Android中design包中的新控件2
- TCP/IP网络协议之DHCP简介
- 实例详解机器学习
- 开博了
- 一些数学基础
- Ubuntu常用命令
- java编译命令