Java学者日记 内部类

内部类

一、什么是内部类

     内部类,是定义在另一个类中的类。通常,在一个类只被它的外部类所使用的时候,才将它定义为内部类

二、使用内部类的原因

     ①内部类方法可以访问该类定义所在作用域中的数据,包括私有的数据

     ②内部类可以对同一包中的其他类隐藏起来

     ③常常使用一个方法,使其返回值为某个类或接口的对象,而这个类或接口在方法的内部创建

三、内部类的种类

1.成员内部类

     顾名思义,成员内部类是外部类的一个成员,形如:

     class ClassName{

           //数据域

           class InnerClassName{ //成员内部类

           }

     }

    特点:①可以有修饰符(public,protected等4个)②可调用外部类的属性和方法

2.局部内部类

      定义在某个方法中的类,形如:

       class ClassName{

            public returnType methodName(){

                 class InnerClassName{  //局部内部类

                 }

            }

       }

     注:局部内部类不能用public 或 private 访问说明符进行声明,它的作用域被限定在声明这个局部内部类的块中

3.匿名内部类

     假如只创建这个类的一个对象,就不必命名了,这种类被称为匿名内部类。形如:

       class ClassName{

             Class/Interface   object = new Class/Interface(){ //匿名内部类

             };

       }

4.静态内部类

     有时候使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类的对象。为此,可以将内部类声明为static,以便取消产生的引用。

     注:一个static的内部类不能访问外部类中的非静态成员


下面,根据一个程序来理解以上内部类的使用:

 (程序节选自尚硅谷宋红康老师的视频,在此致谢宋老师)

   

package Interface;

public class TestInnerClass {
	public static void main(String[] args) {
		// 静态创建一个对象
		Person.Dog d = new Person.Dog();
		//  非静态创建一个对象,先创建外围类的对象,再通过外围类调用内部类构造器
		Person p = new Person();
		Person.Bird b = p.new Bird();
		b.info();
		b.setName("黄鹂");
		p.getComparable();
	}

}

class Person {
	String name = "韩梅梅";
	int age;

	// 成员内部类(非static)
	class Bird {
		String name = "杜鹃";
		int id;

		public Bird() {

		}

		public void setName(String name) {
			System.out.println(name);//杜鹃
			System.out.println(this.name);// Bird类调用setName 所以是黄鹂
			System.out.println(Person.this.name);//韩梅梅
		}

		public void info() {
			show();

		}
	}

	public void show() {
		System.out.println("I'm show() method");
	}

	// 静态成员内部类
	static class Dog {

	}

	public void method1() {
		//局部内部类
		class InnerClass {

		}
	}

	//内部类用途:常常使用一个方法,使其返回值为某个类或接口的对象,而这个类或接口在方法的内部创建
	//局部内部类用法一
	public Comparable getComparable() {
		// 1.创建一个实现Comparable接口的类:局部内部类
		class MyComparable implements Comparable {

			@Override
			public int compareTo(Object o) {
				return 0;
			}

		}
		// 2.返回一个实现类的对象
		return new MyComparable();
	}

	// 局部内部类用法二
	public Comparable getComparable1() {
		//返回一个实现Comparable接口的匿名内部类的对象
		return new Comparable() {

			@Override
			public int compareTo(Object o) {
				return 0;
			}
		};

	}
}

运行结果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值