首页 > 基础资料 博客日记

【Java语言】内部类

2024-12-31 00:00:09基础资料围观48

Java资料网推荐【Java语言】内部类这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣

        可以将一个类的定义在另一个类或者一个方法内部(一般都是定义在类里面),在内部的类就称为内部类,在内部类的外部的类称为外部类。内部类可以在数据结构实现链表的结点等还有很多的地方使用它。然而内部类又分四种:静态内部类、实例内部类、局部内部类以及匿名内部类。

每一个内部类都有自己的字节码文件,对于内部类字节码文件就是外部类类名$内部类类名 ,对于匿名内部类字节码文件就是有些特殊是外部类类名$数字。

实例内部类

1.如何创建?

       实例化一个内部类不能和之前直接实例化一样(之前:Person p = new Person),创建内部类则是需要先创建一个外部类out,然后再创建的外部类.创建内部类,下图就是我所说的实例化一个对象。

2. 在实例内部中,是否可以定义静态的成员变量?

       在内部中,不可以定义静态变量,但是可以定义“常量”(即public static final int g = 7;)因为内部类依赖于外部类,必须外部类实例一个对象,内部类才能被创建,然而静态变量则是在创建外部类对象前就先实现的,这样这个静态变量就出现矛盾而报错。

3.当出现内部类与外部类数据成员一样时,怎没分辨这两者?

       我们既可以在内部类方法中调用也可以在实例完一个对象后调用。在内部类方法中调用相同变量时采用就近原则;如果是this.变量名,那就需要看是谁调用的这个方法,那么这个this指的就是谁;如果想要实现外部类的变量, 就需要外部类类名.this.变量名。

总结一下:

  1. 外部类中的任何成员可以在实例内部类方法中直接访问;
  2. 实例内部类所处的位置与外部类成员位置相同,也受访问限定符(public、private)的约束;
  3. 在实例内部类方法中访问同名的成员,优先访问内部自己的,如果要访问外部同名成员,则需要外部类类名.this.同名成员
  4. 实例内部类对象必须现有外部类对象的前提下才能创建
  5. 实例内部类是我非静态方法中包含一个指向外部类对象的引用;
  6. 外部类方法中,不能直接访问实例内部类的成员,如果要访问比想要创建内部类的对象(普通对象的创建); 在其它的类中就需要外部类对象.new 内部类类名()。
class OuterClass{
	public int a = 1;
	private int b = 2;
	public static int c = 3;
	
	class InnerClass{
		public int a = 1111;
		public int d = 4;
		private int e = 5;
		//public static int f = 6;//静态方法最先创建,但是内部类又是依赖与外部类的,
		//就会出现矛盾,在f创建前必须要创建外部类,而这里的f则是在最先创建的外部类还没有实例化
		public void test() {
			System.out.println("内部类的test方法");
			System.out.println(a);//就近原则 1111
			System.out.println(this.a);//谁调用test方法谁就是this, 
			System.out.println(OuterClass.this.a);
			System.out.println(d);
			System.out.println(e);
		}
	}
	public void test() {
		System.out.println("外部类的test方法");
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
	}
}

public class Test{
	public static void main(String[] args) {

		//实例一个外部类对象
		OuterClass out = new OuterClass();  
		
		//实例一个内部类对象
		//InnerClass in = new InnerClass();//不能实例单独一个内部类 
		
		         //所以在实例一个内部类时,一定要有一个内部类对象
		OuterClass.InnerClass out_in1 = out.new InnerClass();//外部类.创建内部类
		
		OuterClass.InnerClass out_in2 = new OuterClass().new InnerClass();
		
		   //然后就可以调用内部类的方法及属性
		System.out.println(out_in1.d);
		out_in1.test();
	}
}

静态内部类

       静态内部类的创建不需要创建外部类,直接外部类类名.内部类类名就可以创建内部类对象,还有在内部类中可以定义静态成员,其他的都和实例内部类相像。 

匿名内部类

       匿名内部类允许实例化时没有名字,并且只需要使用一次。它也和普通类创建一样抽象方法必须要继承等其他问题。

       在匿名内部类中只能访问没有修改过的成员(变量的捕获)。

局部内部类

在方法中定义内部类,那么就是只能在该方法中使用。这个不过多说明,使用的次数较少。

使用次数是:静态内部类>匿名内部类>实例内部类>局部内部类 


文章来源:https://blog.csdn.net/2402_84815218/article/details/144315798
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云