【学习总结】java高级特性之四种JAVA内部类总结

标题:java内部类

内部类: 在JAVA中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、静态内部类、局部内部类、匿名内部类。

——————————————————————————————————————
1.成员内部类:
  • 成员内部类中不能存在static关键字,不能申明静态属性、方法、代码块等;
  • 在成员内部类中访问外部类的成员属性和方法,要使用“外部类名.this.成员属性和”外部类名.this.成员方法“;
  • 创建成员内部类的实例使用”外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法“的形式(在创建内部类实例之前先创建外部类的实例对象。)举例:Outer class1 = new Outer();                                                                                                                                                                                                                       Outer.Inner class2 = class1.new Inner();
  • 成员内部类可以被public 、protected、private、default、static、final、abstract修饰,被static修饰是静态内部类;
  • 外部类无法直接访问成员内部类的属性和方法,只能通过”内部类实例名.方法名/属性“的形式访问内部类的属性或方法;
    代码展示:
/**
 * 成员内部类
 * @author hecc
 */
public class OuterClass {
	private String name="aaa";//外部类属性
	public void TestOuter(){
		System.out.println("这是我的外部类方法");
		
	}
	class InnerClass{
		private String name1 = "bbb";
		public void TestInner(){
			System.out.println("这是我的内部类方法");
			OuterClass.this.TestOuter();
		}
	}
	public void checkInnerClass(){
		//通过外部类的对象创建成员内部类的对象
		OuterClass class1 = new OuterClass();
		//使用"外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法"
		OuterClass.InnerClass class2 = class1.new InnerClass();
		System.out.println("内部类name:"+class2.name1);
		class2.TestInner();
	}
	public static void main(String[] args) {
		OuterClass class1 = new OuterClass();
		class1.checkInnerClass();
	}
}
      运行结果

——————————————————————————————————————
2.静态内部类:被static修饰的成员内部类叫静态内部类
  • 静态内部类跟外部类没有任何关系,只是在生成类名和类定义时有影响。静态内部类可以看做与外部类平级的类;使用方式与外部类平级的类完全相同。
  • 静态内部类不能直接访问外部类的非静态的属性和方法;外部类可以访问静态成员内部类中的属性和方法  不受static访问修饰符的影响(包括静态属性、方法和非静态属性、方法)。
  • 静态内部类创建实例的形式:外部类名.内部类名 实例名 = new 外部类名.内部类名();
代码展示:
/**
 * 静态内部类
 * @author hecc
 */
public class StaticInnerClass {
	private String name="AAA";
	public void test(){
		System.out.println("这是外部类的方法");
	}
	static class StaticClass{
		private String name1  = "BBB";
		public void test1(){
			//静态成员内部类不能访问外部类的非静态成员属性和方法
			//System.out.println(name);
			System.out.println("这是内部类的方法");
		}
	}
	public void test2(){
		//外部类名.内部类型  内部类对象名=new 外部类名.内部类名();
		StaticInnerClass.StaticClass staticClass 
				= new StaticInnerClass.StaticClass();
		System.out.println(staticClass.name1);
	}
	public static void main(String[] args) {
		StaticInnerClass class1=  new StaticInnerClass();
		//外部类可以访问静态成员内部类中的属性和方法  不受static访问修饰符的影响
		System.out.println(class1.name);
		class1.test2();
	}
}

运行结果:

——————————————————————————————————————

3.匿名内部类:
  • 匿名内部类定义和实例化形式:
new  父类构造方法(){
注:该方法名必须子啊父类中已经存在
                                   修饰符  返回值类型  方法名(参数列表){
}
}
  • 匿名内部类只能与new 连用,用于创建一个实例。匿名内部类只能使用一次,类定义后立即消失;
  • 匿名内部类必须继承一个类(抽象的、非抽象的都可以)或者一个接口。如果父类或父接口是抽象的,则匿名内部类必须实现其所有抽象方法;
  • 匿名内部类不是抽象类,因为匿名内部类在定义后,会立即创建一个实例;
  • 匿名内部类不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但匿名内部类用于与父类相同的所有的构造方法;
  • 匿名内部类中可以定义代码块,用于实例的初始化,但不能定义静态代码块;
  • 匿名内部类中可以定义新的方法和属性(不能使用static修饰);
  • 匿名内部类访问外部类的局部变量,则局部变量需要用final声明;匿名内部类中访问外部类的成员属性和方法使用”外部类名.this.方法名(参数)或属性;
  • 匿名内部类不能重写父类的静态方法。
代码展示:
/**
 * 匿名内部类
 * @author hecc
 *
 */
public class ExtendInnerClass {
	//定义匿名内部类,实例化
	Student student = new Student() {
		public String Myname = "hecc";
		@Override
		public void learning() {
			System.out.println("这是匿名抽象类");
		}
		public void TestSelf(){
			System.out.println("这是自定义的方法!");
		}
	};
	public void testOuter(){
		student.learning();
		//外部类不能访问匿名内部类中的私有属性和方法
		//student.name;
		
		//外部类可以访问匿名内部类中的共有、受保护、默认属性和方法
		System.out.println(student.age);
		
		//外部类只能访问抽象类或者接口中定义的方法和属性
		//student.TestSelf();
		//System.out.println(student.MyName);
	}
	public static void main(String[] args) {
		ExtendInnerClass extendInnerClass = new ExtendInnerClass();
		extendInnerClass.testOuter();
	}
}
//抽象类
abstract class Student{
	private String name;
	public int age = 18;
	//抽象方法
	public abstract void learning();
}
运行结果:


——————————————————————————————————————
4.局部内部类: 定义在代码块、方法体中、作用域(使用花括号{}括起来的一段代码)内的类叫局部内部类。
  • 局部内部类只能在代码块、方法体、作用域中使用(创建对象和使用类对象);
  • 局部内部类访问外部类的属性和方法使用“外部类名.this.属性名或方法”的形式;
  • 局部内部类访问作用域内的局部变量,该局部变量要使用final修饰;
  • 局部内部类的定义可以使用abstract修饰,声明抽象类;
代码展示:
/**
 * 局部内部类
 * @author hecc
 *
 */
public class PartInnerClass {
	private String name ="hecc";
	public int age =10;
	public void doSOnmeThing(){
		System.out.println("这是外部类的方法");
	}
	/**
	 * 外部类不能访问局部内部类
	 * 局部内部类的访问作用域在方法体内,或者在对应的代码块内
	 * 局部内部类可以访问外部类中所有的属性和方法
	 * 局部内部类中不能访问所在方法中的的非final类型的变量
	 */
	public void test(){
		//局部内部类的访问作用域在方法体内,或者在对应的代码块
			final String name1 = "jack";
			class Dog{
				public void dogTest(){
					//局部内部类可以访问外部类中所有的属性和方法
					System.out.println("这是局部内部类的方法");
					System.out.println(name);
					System.out.println(age);
					//局部内部类中不能访问所在方法中的非final类型的变量
					doSOnmeThing();
				}
			}
			//在局部内部类的作用域范围内创建局部内部类的对象,对象的使用与普通类一样
			Dog dog = new Dog();
			dog.dogTest();
		
	}
	public static void main(String[] args) {
		PartInnerClass partInnerClass = new PartInnerClass();
		partInnerClass.test();
	}
}
运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值