`
schy_hqh
  • 浏览: 552439 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(基础)java中的内部类

 
阅读更多

内部类/嵌套类,多用于类的设计上。

分析事物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基础第七章内部类与异常类.doc

    Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...

    java基础java内部类

    内部类的概念在 Java 中有着广泛的应用,特别是在处理复杂的继承问题和实现特定设计模式时。以下将详细介绍 Java 内部类的基本概念、分类、特点以及使用场景。 1. 为什么使用内部类? 内部类的最大优点在于它可以...

    java 局部内部类的使用规范

    java 局部内部类的使用规范 java 局部内部类的使用规范

    Java__接口、内部类和Java_API基础

    Java内部类是指在外层类中的嵌套类,可以作为成员变量、方法或局部变量使用。内部类可以继承父类或实现接口,内部接口总是静态的。例如,声明一个直线类,包括一个内嵌的点类: ``` public class Line { class ...

    Java 接口 内部类

    Java接口和内部类是Java语言中两种重要的抽象机制,它们在软件设计中起着关键作用。接口主要用于定义对象之间的交互规范,而内部类则提供了一种封装和隐藏类的机制,使得类的设计更加灵活。 首先,接口是一个合约,...

    Java基础内部类.xmind文件

    Java基础内部类.xmind文件

    java 集合和内部类资料

    Java集合框架是Java编程...总之,这个资料包涵盖了Java集合框架和内部类的基础知识,对于想要深入理解Java编程的开发者来说,是一份宝贵的学习资源。通过学习,你可以提升在处理数据集合和实现复杂设计模式上的能力。

    JAVA基础——Java内部类.ppt

    JAVA基础——Java内部类.ppt

    Java内部类基础笔记

    Java内部类是Java语言的一个特色特性,它允许我们在一个类的内部定义另一个类。这种设计模式在很多场景下非常有用,比如实现事件监听、回调机制或者封装特定逻辑。本篇笔记将详细介绍Java中的四种内部类:普通内部类...

    java基础 包含:Java入门 基础语法 JAVA 类和对象 JAVA 高级类 等等

    进入Java的高级主题,你会接触到诸如抽象类、接口、内部类、匿名类、枚举、注解、泛型、集合框架(如ArrayList、LinkedList、HashMap等)以及反射机制等。这些特性增强了代码的灵活性和可扩展性,使Java能够适应各种...

    java和kotlin的内部类静态嵌套类

    Java和Kotlin是两种在移动开发领域广泛应用的编程语言,尤其在Android开发中占据主导地位。内部类和静态嵌套类是...在提供的资源中,"java内部类嵌套类"和"kotlin内部类嵌套类"的示例代码将帮助你进一步巩固这些概念。

    java基础四种匿名内部类

    掌握java四中匿名内部类

    java基础第七章-内部类与异常类.doc

    Java 基础第七章 -内部类与异常类 本章节主要讲解 Java 的内部类和异常类的概念...本章节详细讲解了 Java 中的内部类和异常类的概念、特点、使用方法和注意事项,为读者提供了一个系统的 Java Programming 基础知识。

    Java基础权限控制与final,内部类

    了解了这些概念,让我们回到Java基础权限控制与final,内部类的主题。Java中,final和权限控制是面向对象编程中的核心概念。final关键字用于限制类、方法或变量的可变性,而权限控制则决定了类成员的可见性和可用...

    2022年接口内部类和JavaAPI基础.ppt

    "2022年接口内部类和JavaAPI基础" 一、接口 1.1 声明接口 ...本节课我们学习了Java中的接口、内部类和内部接口,了解了它们的声明、实现和使用方法,以及Java API基础的包中的基础类库和工具类库。

    接口、内部类和Java API基础

    接口(interface)是一组常量和抽象方法的集合。接口是一种引用数据类型。 抽象方法的具体实现由实现接口的类完成,实现接口的类必须覆盖接口中的所有抽象方法。

    java内部类详解共10页.pdf.zip

    以上是Java内部类的基础知识,实际的PDF文档可能会深入探讨这些概念,提供示例代码以及更具体的使用场景。学习和理解Java内部类有助于提升代码的灵活性和可维护性,尤其是在处理复杂的面向对象设计时。

    JAVA内部类与异常类实验报告

    总结,这个实验报告深入浅出地介绍了Java内部类的概念及其使用,以及异常处理的基本思想,通过实际的编程练习,有助于提高学生的编程技能和问题解决能力。通过扩展内部类的应用和异常处理的实践,学生可以更好地理解...

    JAVA_12内部类

    Java内部类是Java编程语言中的一个独特特性,它允许在一个类的定义内部定义另一个类。这种设计模式在处理复杂的对象关系、实现匿名类以及提供更好的封装性时非常有用。在这个"JAVA_12内部类"的学习资料中,我们将会...

    java核心基础技术卷,(基础语法,面向对象,异常,泛型,IO,枚举,反射机制,集合,内部类,)

    * 成员内部类:Java 中的成员内部类是指在另一个类的成员中定义的类。 * 局部内部类:Java 中的局部内部类是指在方法中定义的类。 JavaSE、JavaEE、JavaME * JavaSE:Java Standard Edition,是 Java 的标准版,...

Global site tag (gtag.js) - Google Analytics