黑马程序员——java基础——内部类



黑马程序员——java基础——内部类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

内部类

如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。

内部类的访问规则

1,内部类可以直接访问外部类中的成员,包括私有。

之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this

2,外部类要访问内部类,必须建立内部类对象。

访问格式

1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。

格式

外部类名.内部类名  变量名 = 外部类对象.内部类对象;

Outer.Inner in = new Outer().new Inner();

<span style="font-size:14px;">public class InnerClassDemo {
	public static void main(String[] args)
	{
	//	Outer out = new Outer();
	//	out.method();
		//直接访问内部类中的成员。
		Outer.Inner in = new Outer().new Inner();
		in.function();
	}
}
class Outer
{
	private int x = 3;
	class Inner//内部类
	{
		int x = 4;
		void function()
		{
			int x = 6;
			System.out.println("innner :"+ x );
			System.out.println("innner :"+ this.x );
			System.out.println("innner :"+ Outer.this.x );
		}
	}
	void method()
	{
		Inner in = new Inner();
		in.function();
	}
}</span>

2,当内部类定义在外部类中的成员位置上,可以使用一些成员修饰符修饰 private、static。

1:默认修饰符。

直接访问内部类格式:外部类名.内部类名 变量名 = 外部类对象.内部类对象;

Outer.Inner in = new Outer.new Inner();//这种形式很少用。

但是这种应用不多见,因为内部类之所以定义在内部就是为了封装。想要获取内部类对象通常都通过外部类的方法来获取。这样可以对内部类对象进行控制。

2:私有修饰符。

通常内部类被封装,都会被私有化,因为封装性不让其他程序直接访问。

3:静态修饰符。

   如果内部类被静态修饰,相当于外部类,会出现访问局限性,只能访问外部类中的静态成员。

注意;如果内部类中定义了静态成员,那么该内部类必须是静态的。

<span style="font-size:14px;">class Outer2
{
	private static  int x = 3;
	static class Inner//静态内部类
	{
		static void function()
		{
			System.out.println("innner :"+ x);
		}
	}
	static class Inner2
	{
		void show()
		{
			System.out.println("inner2 show");
		}
	}
	public static void method()
	{
		//Inner.function();
		new Inner2().show();
	}
}
public class InnerClassDemo2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	//	Outer2.method();
	//	Outer2.Inner.function();
	//	new Outer2.Inner().function();
		//直接访问内部类中的成员。
		Outer2.Inner in = new Outer2.Inner();
		in.function();
	}
}
</span>

内部类编译后的文件名为:“外部类名$内部类名.java”

为什么内部类可以直接访问外部类中的成员呢?

那是因为内部中都持有一个外部类的引用。这个是引用是外部类名.this

内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上

内部类定义在局部时

1,不可以被成员修饰符修饰

2,可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。

<span style="font-size:14px;">public class InnerClassDemo3 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer1 out = new Outer1();
		out.method(7);
	}
}
class Outer1 {
	int x = 3;

	void method(final int a) {
		final int y = 4;
		class Inner {
			void function() {
				System.out.println(y);
			}
		}
		new Inner().function();
	}
}</span>

匿名内部类

1,匿名内部类其实就是内部类的简写格式。

2,定义匿名内部类的前提:

内部类必须是继承一个类或者实现接口。

3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}

4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。 可以理解为带内容的对象。

5,匿名内部类中定义的方法最好不要超过3个。

<span style="font-size:14px;">public class InnerClassDemo4 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Outer4().function();
	}
}

abstract class AbsDemo {
	abstract void show();
}

class Outer4 {
	int x = 3;

	public void function() {

		AbsDemo d = new AbsDemo() {
			int num = 9;

			void show() {
				System.out.println("num===" + num);
			}

			void abc() {
				System.out.println("haha");
			}
		};
		d.show();
		// d.abc();//编译失败;
	}
}</span>

时间: 2024-07-30 13:40:05

黑马程序员——java基础——内部类的相关文章

黑马程序员-java基础-内部类和匿名内部类

外部类中如果含有一个接口,那个接口默认是static 内部的访问特点: A:内部类可以直接访问外部类的成员(成员变量.成员方法),包括私有成员. 之所以可以访问外部成员,是因为内部类持有外部对象的引用 B:外部类要访问内部类的成员,必须创建对象. 内部类位置 成员位置:在成员位置定义的类,被称为成员内部类. 局部位置(成员方法里面):在局部位置定义的类,被称为局部内部类. 成员内部类: 可以直接访问外部类成员 如何直接访问内部类的成员. 外部类名.内部类名 对象名 = 外部类对象.内部类对象;

黑马程序员——java基础——集合(Collection)

 黑马程序员--java基础--集合(Collection) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 集合框架的构成及分类,如下图: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 3.

黑马程序员——Java基础篇之对象归要

1.static关键字 1.1.static可以修饰成员变量,成员方法,还有类(其中这里的类是内部类) 1.2.static修饰的部分会随着类的加载而加载: 加载过程:当JVM执行static修饰的代码时,会在内存的共享区给static部分开辟一个空间,供该类持有,static部分不是某个对象的部分,而是该类共有的,所以当一个函数会被多个对象调用时,最好定义成static,这样比较节省空间. 1.3.静态方法只能访问静态成员 原因:如果静态方法中调用了非静态的变量,那么由于静态方法是随着类的加载

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员——java基础——多线程

 黑马程序员--java基础--多线程 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量.

黑马程序员——java基础---IO(input output)流字符流

黑马程序员——java基础---IO(input output)流字符流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- io(input output)流特点: 1,io流用来处理数据之间的传输 2,java对数据的操作是通过流的方式: 3,java用于操作流的对象都在io包中: 4,流按操作数据分为两种:字节流和字符流: 5,流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员--Java基础--01基本概念

1.Java的三大技术架构 JAVAEE(Java Platform Enterprise Edition):  开发企业环境下的应用程序,主要针对web程序开发: JAVASE(Java Platform Standard Edition): 完成桌面应用程序的开发,是其他两者的基础 JAVAME(Java Platform Micro Edition): 开发电子消费产品和嵌入式设备,如手机中的程序 我对三大技术构架理解 1.三大技术是指哪三大技术呢? 答:三大技术分别指JAVAEE,JAV