Java内部类分类总结

内部类(Inner Class)学习知识点总结:


1、概念

把一个类定义到另一个类的内部的类就叫内部类,内部类可以看作是外部类的一个成员(与类的属性和方法类似)。

内部类一样可以有自己的子类,可以被继承。

2、分类

①静态内部类(static inner class)

静态内部类是指被static修饰的内部类,它可以不依赖与外部OuterClass类的实例而实例化,类似与静态函数,静态变量一样,随着类加载而被创建。另外静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中静态成员和静态方法(根据静态成员不能访问非静态成员的规则)。静态内部类的成员方法(包含类方法和实例方法)不能访问外部类的实例方法。(实例方法指非静态方法)

②成员内部类(member inner class)

成员内部类中可以访问外部类的所有成员变量和方法,包括静态和非静态。

成员内部类(非静态内部类)的使用权限:

  • ①private修饰:只能在外部类的内部使用
  • ②默认修饰:只能被与外部类处于同一包中的其他类所访问
  • ③protected修饰:可以被与外部类处于同一包的其他类以及外部类的子类访问
  • ④public修饰:可以在任何地方使用

③局部内部类(local inner class)

局部内部类中可以访问外部类的所有成员变量和方法,包括静态和非静态。

④匿名内部类(anonymous inner class)

匿名内部类可以访问外部类的静态成员变量和静态方法,不能访问非静态成员变量和方法。

3、匿名内部类同时需要注意几个方面:

1)匿名内部了不能有构造函数

2)匿名内部类不能定义静态成员、静态方法和类

3)匿名内部类不能是 public、protected、private、static。

4)只能创建匿名内部类的一个实例。

5)一个匿名内部类一定是在new 的后面,这个匿名内部类必须集成一个父类或是实现一个接口。(下面的代码实例是实现了一个接口的方式定义匿名内部类)

4、各个内部类定义实例如下:

interface Inner {
	void say();
}

class OuterClass {
	int a;
	static int b = 10;
    String name = "OuterName";
	static class StaticInnerClass {
		void test(){
//			System.out.println("a="+a);//不可以访问非静态变量
			System.out.println("b="+b);
		}
	}//静态内部类

	class MemberInnerClass {
        private String name = "InnerClass";
		void test(){
			System.out.println("a="+a);
			System.out.println("b="+b);
		}
        public void setName(String name){
           System.out.println(name);//调用形参的name属性
           System.out.println(this.name);//调用内部类的name同名属性
           System.out.println(OuterClass.this.name);//调用外部类的同名属性 
       }
	}//成员内部类

	public void method() {
		class LocalInnerClass {	
			void test(){
				System.out.println("a="+a);
				System.out.println("b="+b);
			}
		}//局部内部类
	}

	public void method1(Inner inner1) {
		System.out.println("实体函数");
	}

	public static void main(String[] args) {
		new OuterClass().method1(new Inner() {//匿名内部类
			@Override
			public void say() {}
			void test(){
//				System.out.println("a="+a);//不可以访问非静态变量
				System.out.println("b="+b);
			}
		});
	}
}

5.内部类在外部类外使用方法:

①非静态内部类:

  • 在外部类的内部:In in = new In();//与平常用的类没有太大区别

  • 在外部类的外部:Out.In in =  new Out().new In();//因成员内部类是外部类的成员,因此要依附外部类的对象上使用

②静态内部类:

  • 在外部类的内部:In in = new In();//与平常用的类没有太大区别
  • 在外部类的外部:Out.In in =  new Out.In();//因成员内部类是外部类的成员,因此要依附外部类的对象上使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AndyAtcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值