JAVA内部类 (成员内部类、局部内部类、匿名内部类、静态内部类、内部类的继承))
2016-05-30 17:55
651 查看
成员内部类
1.成员内部类简介
2.使用this关键字获取内部类与外部类的引用
局部内部类
局部内部类是指在类的方法中定义内部类,它的作用范围也是在这个方法体内
匿名内部类
在编写程序代码时,不一定要给内部类取一个名字,可以直接以对象名来代替。匿名内部类的所有实现代码都需要在大括号之间进行编写。
静态内部类
在内部类前添加修饰符static,这个内部类就变成静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。静态内部类有一个最大的特点,就是不可以使用外部类的非静态成员。所以静态内部类在程序开发中比较少见。
静态内部类具有以下两个特点:
1.创建静态内部类的对象,不需要先创建外部类对象。
2.不能从静态内部类的对象中访问非静态外部类的对象。
内部类的继承
1.成员内部类简介
package cn.com.inner; /** * 成员内部类<br> * 使用方式:OuterClass.InnerClass * @author wutz * */ public class OuterClass { //外部类 InnerClass inner = new InnerClass(); private class InnerClass{ //内部类 int y = 0; //内部类成员变量 InnerClass(){ //内部类构造函数 } public void innerFunction(){ //内部类成员函数 System.out.println("调用内部类的方法"); } } public InnerClass getInsatnceOfInnerClass(){ //外部类操作内部类的属性 //y = 4; inner.y = 100; inner.innerFunction(); return inner; } public static void main(String[] args) { OuterClass outer = new OuterClass(); OuterClass.InnerClass inner1 = outer.getInsatnceOfInnerClass(); System.out.println(inner1.y); System.out.println("********************"); OuterClass.InnerClass inner2 = outer.new InnerClass(); System.out.println(inner2.y); inner2.innerFunction(); } }
console: 调用内部类的方法 100 ******************** 0 调用内部类的方法
2.使用this关键字获取内部类与外部类的引用
package cn.com.inner; /** * 通过this获取外部类内部类的引用 * @author wutz * */ public class TheSameName { private int x; private class Inner{ private int x = 9; public void doit(int x){ x++; //调用的是形参x System.out.println(x); this.x++; //调用的是内部类x System.out.println(this.x); TheSameName.this.x++; //调用的是外部类x System.out.println(TheSameName.this.x); } } public static void main(String[] args) { TheSameName outClass = new TheSameName(); TheSameName.Inner inner = outClass.new Inner(); inner.doit(100); } }
console: 101 10 1
局部内部类
局部内部类是指在类的方法中定义内部类,它的作用范围也是在这个方法体内
package cn.com.inner; /** * 局部内部类<br> * 定义在方法内的类,作用方法仅限该方法 * @author wutz * */ public class SellOutClass { private String name; public SellOutClass(){ name = "苹果"; } public void sell(){ class Apple{ int innerPrice = 0; public Apple(int price){ innerPrice = price; } public void price(){ System.out.println("现在开始销售:"+name); System.out.println("价格:"+innerPrice); } } Apple apple = new Apple(100); apple.price(); } public static void main(String[] args) { SellOutClass outClass = new SellOutClass(); outClass.sell(); } }
console: 现在开始销售:苹果 价格:100
匿名内部类
在编写程序代码时,不一定要给内部类取一个名字,可以直接以对象名来代替。匿名内部类的所有实现代码都需要在大括号之间进行编写。
package cn.com.inner; /** * 服务于匿名内部类 * @author wutz * */ public interface OuterString { public String filterBlankChar(); }
package cn.com.inner; /** * 匿名内部类 * @author wutz * */ public class OutString{ public static void main(String[] args) { final String sourceStr = "h e l l o w o r d"; OuterString outString = new OuterString() { @Override public String filterBlankChar() { return sourceStr.replaceAll(" ",""); } }; System.out.println("源字符串:" + sourceStr); System.out.println("转换后的字符串:" +outString.filterBlankChar()); } }
console: 源字符串:h e l l o w o r d 转换后的字符串:helloword
静态内部类
在内部类前添加修饰符static,这个内部类就变成静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。静态内部类有一个最大的特点,就是不可以使用外部类的非静态成员。所以静态内部类在程序开发中比较少见。
静态内部类具有以下两个特点:
1.创建静态内部类的对象,不需要先创建外部类对象。
2.不能从静态内部类的对象中访问非静态外部类的对象。
package cn.com.inner; /** * 静态内部类1 * @author wutz * */ public class StaticInnerClass { private static int x = 0; static class InnerClass{ static void doInner() { System.out.println(x); } } public static void main(String[] args) { StaticInnerClass.InnerClass b = new StaticInnerClass.InnerClass(); b.doInner(); } }
package cn.com.inner; /** * 静态内部类2 * @author wutz * */ public class StaticInnerClass { private static int x = 0; static class InnerClass{ static void doInner() { System.out.println(x); } public static void main(String[] args) { doInner(); } } }
内部类的继承
package cn.com.inner; public class Outer { class Inner{ } }
package cn.com.inner; public class InnerExtend extends Outer.Inner{ public InnerExtend(Outer outer) { outer.super(); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树