`
roway
  • 浏览: 47764 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

第二十三:Java内部类

 
阅读更多

一.

关于匿名内部类:匿名内部类一定是继承了某个父类或是实现了某个接口

补充:面试题:

匿名内部类可以继承其他类和实现接口,因为匿名类就是在抽象类和接口的基础之上发展起来的!

public abstract class Anonymous {
	private String name;
	private int age;
	
	public Anonymous(){
		
	}
	public Anonymous(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getInfo(){
		return "Name:"+name+"\tAge:"+age;
	}
	public abstract void work();
}

//匿名内部类的举例,体会一下!---通过抽象类的演示
//可以参考ActionListener接口来理解该问题
public class AnonymousTest {
	public static void main(String[] args) {
		/*Anonymous a = new Anonymous() {
			public void work() {
				System.out.println("个人信息:" + this.getInfo());
				System.out.println(" I am sailing,I am sailing!");
			}
		};
		a.work();*/
		// 这两种方式是等价的
		// 以继承抽象类的方法写匿名内部类
		class Singer extends Anonymous {
			public Singer() {
			}

			public Singer(String name, int age) {
				super(name, age);
			}

			public void work() {
				System.out.println("个人信息:" + this.getInfo());
				System.out.println("I am sailing, I am sailing!");
			}
		}
		Anonymous a = new Singer();
		a.work();

	}

}

public interface Anonymous2 {
	public abstract void swim();
}

//匿名内部类使用举例2------通过接口的演示
public class Anonymous2Test {
	 public static void main(String[] args) {
		 Anonymous2Test at = new Anonymous2Test();
		 at.test(new Anonymous2() {
		 	public void swim() {
		 		System.out.println(" I's swimming!");
		 	}
		 });
	 }
	//这两种方法是等价的
	//以显示接口的方式来写匿名内部类 
	/*public static void main(String args[]) {
		Anonymous2Test ta = new Anonymous2Test();
		class Anony implements Anonymous2 {
			public void swim() {
				System.out.println("I'swimming!");
			}
		}
		ta.test(new Anony());
	}*/

	public void test(Anonymous2 swimmer) {
		swimmer.swim();
	}
}


二.

在new 类型名(接口名){重写其的方法}........匿名内部类

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * 匿名[内部]类在swing中的应用
 * */
public class SwingTest {
	public static void main(String[] args) {
		// 创建一个窗体
		JFrame frame = new JFrame("JFrame");
		// 设置其大小
		frame.setSize(500, 500);
		// 设置关闭按钮
		// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 设置窗体大小不可变
		frame.setResizable(false);
		// 另一种 设置关闭按钮
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				// 系统正常退出
				System.exit(0);
			}
		});

		// 创建一个按钮
		JButton button = new JButton("JButton");
		// 添加监听器
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				System.out.println("按钮被点击");
			}
		});
		// 把按钮加入面板中
		frame.getContentPane().add(button);
		// 设置窗体可见
		frame.setVisible(true);

	}
}


三.

类中static的内部类.......相当于静态方法

四.

类中非static的内部类......相当于非静态方法

五.

方法中的内部类(不能有public,无修饰符,或者有abstract、final修饰符)......

1.只能访问其所在方法中final类型的变量,传递给方法的参数也必须是final的!???还是要在实际中操作!!
2.可以肯定的一点是:如果局部类要访问其所在方法中的变量,那么此变量必须是final的

六:

静态内部类(static inner class)

/**
 * 静态内部类......相当于静态方法
 * */
class StaticInner{
	private static int a=3;
	public static class Inner{
		public void test(){
			System.out.println(a);
		}
	}
}

public class Test2 {
	public static void main(String[] args) {
		StaticInner.Inner inner=new StaticInner.Inner();//静态内部类直接调用
		inner.test();
	}
}


成员内部类(member inner class)

/**
 * 成员内部类......相当于非静态方法
 * */
class MemberInner {
	private int a = 3;

	public class Inner2 {
		private int a = 2;

		public void doSomething() {
			// 调用外部类的属性
			System.out.println(MemberInner.this.a);// 这块要注意......很重要!!!
			System.out.println(a);
		}
	}
}

public class Test3 {
	public static void main(String[] args) {
		MemberInner.Inner2 inner2 = new MemberInner().new Inner2();// 非静态内部类要new实例
		inner2.doSomething();
	}
}


局部内部类(local inner class)

/**
 * 局部内部类......相当于局部变量
 * */
class LocalInner {
	public void doSomething(int b) {
		final int a = 3;// 只能访问final的变量
		class Inner3 {
			public void test(int b) {
				System.out.println(b);
				System.out.println(a);
			}
		}
		new Inner3().test(b);
	}
}

public class Test4 {
	public static void main(String[] args) {
		LocalInner inner = new LocalInner();
		inner.doSomething(4);
	}
}

匿名内部类(anonymous inner class)------一种特殊的局部内部类

/**
 * 匿名内部类也相当于局部变量......记住无构造函数!!!
 * 所谓匿名类是没有名字的类,
 * 而构造函数是与类名相同无返回值的方法,
 * 所以一个匿名类不能由程序员给定构造函数。
 * */
public class Test {
	@SuppressWarnings("deprecation")
	public String get(Date date) {
		return date.toLocaleString();
	}

	public static void main(String[] args) {
		Test test = new Test();

		String result = test.get(new Date() {// 生成Date类的一个子类
					private static final long serialVersionUID = 1L;

					public String toLocaleString() {// 意义上是重写了这个方法
						return "hello world";
					}
				});
		System.out.println(result);
	}
}


补充问题:
1.内部类的一个好处是内部类一般可以访问它的嵌套类(外部类)的域。
2.不像外部类,内部类可以是private或static。

分享到:
评论

相关推荐

    编程实践:Java进阶100例

    第二章:MyEclipse的基本使用; 第三章:Java基础语法; 第四章:数组的应用; 第五章:面向对象的Java编辑; 第六章:接口与内部类; 第七章:集合的应用; 第八章:异常和反射; 第九章:初识AWT和Swing; 第十章...

    java教程-每日一课,27天java从入门到进阶

    第二天:常量变量 第三天:流程控制 第四、五天:方法与数组 第六天:类 第七天:对象的出生 第八天:类与类继承 第九天:具体到抽象的升华 第10天:权限内部类包 第11天:API类 第12天:字符串王者地位 第13天:...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    11.1 插曲:类的组成部分的名字 291 11.2 类中的修饰符 292 11.2.1 无修饰符类 292 11.2.2 类的可见性 293 11.2.3 final——让类不可被继承 295 11.2.4 理解final关键字 296 11.2.5 总结:类的修饰符 297 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    11.1 插曲:类的组成部分的名字 291 11.2 类中的修饰符 292 11.2.1 无修饰符类 292 11.2.2 类的可见性 293 11.2.3 final——让类不可被继承 295 11.2.4 理解final关键字 296 11.2.5 总结:类的修饰符 297 ...

    J2EE学习笔记

    第二章:JAVA设计模式 18 2.1:创建型设计模式 19 2.2:结构型设计模式 32 2.3:行为型设计模式 83 第三章:JAVA基本语法 118 3.1:语言基础知识 118 3.2:声明和访问控制 120 3.3:运算符和赋值 121 3.4:流程控制...

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    Java语言基础下载

    第二十三章:HTML基础 419 学习目标 419 知识要点 420 HTML元素 420 标签属性 420 HTML基本标签 422 标题元素 422 HTML格式 427 HTML实体 431 不可拆分的空格 431 HTML表格 439 表格 441 HTML列表 461 HTML图像 469 ...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    重构36计.docx

    第二十三计:避免重复代码 15 第二十四计:增加注释 16 第二十五计:函数体最多不超过100行 16 第二十六计:使用语言的修饰符确保变量的不可变性 17 第二十七计:对象状态共享 17 第二十八计:用对象代替普通常量 17...

    Java经典编程源码基础例程300.zip

    (不借助第3个变量) 23 第4章 流程控制 25 实例019 判断某一年是否为闰年 26 实例020 验证登录信息的合法性 27 实例021 为新员工分配部门 28 实例022 用switch语句根据消费 金额计算折扣 29 实例023 判断用户输入...

    interview-lagou:Java面试真题与原始码解析-源码解析

    第二部分:热门框架 第三部分:数据库相关 第四部分:Java进阶 23.说一下JVM的内存布局和运行原理? 24.垃圾回收算法有什么? 25.你用过一些垃圾回收器?它们有什么区别? 26.生产环境如何排除和优化JVM? ...

    学通Java的24堂课-第23课,企业内部通讯管理系统

    学通Java的24堂课,李钟尉 李伟主编。第23课,企业内部通讯管理系统。课本内容pdf格式。

    JAVA基础课程讲义

    第二章(1) 编程的基本概念 22 注释 22 标识符 22 关键字/保留字 23 变量(variable) 24 常量(Constant) 25 命名规则(规范) 25 基本数据类型(primitive data type) 26 整型变量 26 浮点型 27 字符型(2个字节): 28 ...

Global site tag (gtag.js) - Google Analytics