内部类/嵌套类,多用于类的设计上。
分析事物A时,发现事物A的内部还存在其他事物X,而且事物X又在使用事物A中的内容,此时,Java提供了内部类设计来实现这种需求!!!
访问特点:
内部类作为外部类的一个成员,可以直接访问外部类的中的成员,包括私有成员;
而外部内要想访问内部类的成员,必须通过创建内部类的对象,才能访问;
内部类出现的原因
两个类之间的关闭特别紧密,如心脏和人体的关系;
A作为外部类,B作为内部类;
当B定义为A的内部类之后:
首先,B离不开A而单独存在,使得程序更加严谨,合理,
其次,B访问A中的资源,直接访问,不需要创建A的对象就能调用,简化了过程;
内部类的调用
在外部类中调用内部类,需要创建内部类对象进行调用
//外部类 public class Body { private int times; //内部类 class Heart { void heartBeat() { //内部类直接使用外部类的私有成员变量 System.out.println("Body.Heart.heartBeat():\t"+times); } } public void invoke() { //外部类只能通过创建内部类对象访问内部类的成员 Heart inner = new Heart(); inner.heartBeat(); } }
public class Test { public static void main(String[] args) { Body body = new Body(); body.invoke(); } }
结果:Body.Heart.heartBeat(): 0
在其它类中调用内部类,需要创建外部类对象以及内部类对象
//外部类 public class Body { private int times; //内部类 class Heart { void heartBeat() { //内部类直接使用外部类的私有成员变量 System.out.println("Body.Heart.heartBeat():\t"+times); } } }
public class Test { public static void main(String[] args) { Body.Heart heart = new Body().new Heart(); heart.heartBeat(); } }
运行结果:Body.Heart.heartBeat(): 0
在其它类中访问静态内部类中的非静态成员,需要对象;访问静态成员,不需要对象;
//外部类 public class Body { private static int times; //静态内部类 static class Heart { void heartBeat() { //内部类直接使用外部类的私有成员变量 System.out.println("Body.Heart.heartBeat():\t"+times); } //静态内部类中的静态方法 static void size() { System.out.println("Body.Heart.size()"); } } }
public class Test { public static void main(String[] args) { //访问静态内部类中的成员方法 Body.Heart heart = new Body.Heart(); heart.heartBeat(); //访问静态内部类中的静态方法 Body.Heart.size(); } }
运行结果:
Body.Heart.heartBeat(): 0
Body.Heart.size()
内部类通过持有外部类的引用,实现访问外部类的成员变量
public class Outer { private int num = 1; private String name = "kk"; class Inner { private int num = 2; void method() { int num = 3; System.out.println(num);//方法入栈后,存在局部变量num,直接使用,结果为:3 System.out.println(Inner.this.num);//使用Inner对象在堆内存中的num,结果为:2 System.out.println(Outer.this.num);//使用Outer对象在堆内存中的num,结果为:1 //首先在Inner.this对象中找,没有找到,再到Outer中找! System.out.println(name);//结果为:kk //内部类持有了外部类的引用 System.out.println(Outer.this.name);//结果为:kk } } }
内部类访问局部变量,该局部变量必须是final的,即常量,确保方法出栈后该变量仍能使用
public class Outer { //成员方法 public Object method() { //内部类使用到了局部变量,该变量必须final //确保方法出栈后(局部变量消失),内部类使用到的局部变量仍能被访问到 final int num = Integer.MAX_VALUE; //局部内部类 class Inner { public String toString() { return "local inner class,num="+num; } } //返回局部内部类对象 return new Inner(); } }
public class Test { public static void main(String[] args) { Object obj = new Outer().method();//多态 String str = obj.toString();//子类对象覆盖了父类中的方法 System.out.println(str); } }
=============================================================================
匿名内部类
匿名内部类实际上就是内部类的一种简写方式
一般,如果接口中的方法不多(1个或2个),则采用匿名内部类的方式来解决问题
如果接口中的方法比较多,则建议采用显示定义内部类来实现接口进行操作应用场景:
面向接口编程时,方法入参为接口类型,此时则可以通过匿名内部类的方式来实例化子类对象。
这样就设计到:
1.匿名内部类,它没有显示的定义一个类去实现接口,而是直接实现接口中的方法
2.面向接口来创建对象,因为子类没有名字,只能用父类名称来代替
3.多态,通过父类接口类型的引用指向子类对象
面向接口编程时,匿名内部类的使用
public interface InterfaceA { public abstract String fun(); }
public class Main { //面向接口编程,提供扩展性 public String say(InterfaceA a) { return "Anonymouse inner class :"+a.fun();//多态,动态绑定,执行子类方法 } }
public class Test { public static void main(String[] args) { //创建匿名内部类对象,作为参数传入到方法中 //多态调用 String str = new Main().say(new InterfaceA() { @Override public String fun() { return "fun ?"; } }); System.out.println(str); } }
运行结果:
Anonymouse inner class :fun ?
另一个小例子:
接口
public interface InterfaceA { public String fun(); }
通过接口创建对象
public class Outer { //成员方法 public InterfaceA method() { final int num = Integer.MAX_VALUE; //返回一个匿名内部类 return new InterfaceA() { @Override public String fun() { return "Anonymous inner class, num="+num; } }; } }
测试
public class Test { public static void main(String[] args) { InterfaceA a = new Outer().method(); String str = a.fun(); System.out.println(str); } }
结果
Anonymous inner class, num=2147483647
另一个例子
public class Main { /** * 显示定义内部类,没有局限性,可以继承类,也可以实现接口 */ public void test1() { class Inner extends Object { public void funny() { System.out.println("Main.funny()"); } } new Inner().funny(); } /** * 使用Object类创建匿名内部类,简写形式 * 只限于子类的一个特有方法的调用 */ public void test2() { new Object() { public void funny() { System.out.println("Main.funny()"); } }.funny(); } /** * 错误 * 原因:多态,类型提升,调用父类中没有的子类特有方法,编译失败! */ public void test3() { Object obj = new Object() { public void funny() { System.out.println("Main.funny()"); } }; //obj.funny(); //子类对象发生类型提升,其特有方法无法被调用,因为父类Object中没有funny(),编译失败! } }
相关推荐
Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...
内部类的概念在 Java 中有着广泛的应用,特别是在处理复杂的继承问题和实现特定设计模式时。以下将详细介绍 Java 内部类的基本概念、分类、特点以及使用场景。 1. 为什么使用内部类? 内部类的最大优点在于它可以...
java 局部内部类的使用规范 java 局部内部类的使用规范
Java内部类是指在外层类中的嵌套类,可以作为成员变量、方法或局部变量使用。内部类可以继承父类或实现接口,内部接口总是静态的。例如,声明一个直线类,包括一个内嵌的点类: ``` public class Line { class ...
Java接口和内部类是Java语言中两种重要的抽象机制,它们在软件设计中起着关键作用。接口主要用于定义对象之间的交互规范,而内部类则提供了一种封装和隐藏类的机制,使得类的设计更加灵活。 首先,接口是一个合约,...
Java基础内部类.xmind文件
Java集合框架是Java编程...总之,这个资料包涵盖了Java集合框架和内部类的基础知识,对于想要深入理解Java编程的开发者来说,是一份宝贵的学习资源。通过学习,你可以提升在处理数据集合和实现复杂设计模式上的能力。
JAVA基础——Java内部类.ppt
Java内部类是Java语言的一个特色特性,它允许我们在一个类的内部定义另一个类。这种设计模式在很多场景下非常有用,比如实现事件监听、回调机制或者封装特定逻辑。本篇笔记将详细介绍Java中的四种内部类:普通内部类...
Java和Kotlin是两种在移动开发领域广泛应用的编程语言,尤其在Android开发中占据主导地位。内部类和静态嵌套类是...在提供的资源中,"java内部类嵌套类"和"kotlin内部类嵌套类"的示例代码将帮助你进一步巩固这些概念。
进入Java的高级主题,你会接触到诸如抽象类、接口、内部类、匿名类、枚举、注解、泛型、集合框架(如ArrayList、LinkedList、HashMap等)以及反射机制等。这些特性增强了代码的灵活性和可扩展性,使Java能够适应各种...
掌握java四中匿名内部类
Java 基础第七章 -内部类与异常类 本章节主要讲解 Java 的内部类和异常类的概念...本章节详细讲解了 Java 中的内部类和异常类的概念、特点、使用方法和注意事项,为读者提供了一个系统的 Java Programming 基础知识。
了解了这些概念,让我们回到Java基础权限控制与final,内部类的主题。Java中,final和权限控制是面向对象编程中的核心概念。final关键字用于限制类、方法或变量的可变性,而权限控制则决定了类成员的可见性和可用...
"2022年接口内部类和JavaAPI基础" 一、接口 1.1 声明接口 ...本节课我们学习了Java中的接口、内部类和内部接口,了解了它们的声明、实现和使用方法,以及Java API基础的包中的基础类库和工具类库。
接口(interface)是一组常量和抽象方法的集合。接口是一种引用数据类型。 抽象方法的具体实现由实现接口的类完成,实现接口的类必须覆盖接口中的所有抽象方法。
以上是Java内部类的基础知识,实际的PDF文档可能会深入探讨这些概念,提供示例代码以及更具体的使用场景。学习和理解Java内部类有助于提升代码的灵活性和可维护性,尤其是在处理复杂的面向对象设计时。
总结,这个实验报告深入浅出地介绍了Java内部类的概念及其使用,以及异常处理的基本思想,通过实际的编程练习,有助于提高学生的编程技能和问题解决能力。通过扩展内部类的应用和异常处理的实践,学生可以更好地理解...
Java内部类是Java编程语言中的一个独特特性,它允许在一个类的定义内部定义另一个类。这种设计模式在处理复杂的对象关系、实现匿名类以及提供更好的封装性时非常有用。在这个"JAVA_12内部类"的学习资料中,我们将会...
* 成员内部类:Java 中的成员内部类是指在另一个类的成员中定义的类。 * 局部内部类:Java 中的局部内部类是指在方法中定义的类。 JavaSE、JavaEE、JavaME * JavaSE:Java Standard Edition,是 Java 的标准版,...