【java学习—九】内部类(7)

文章目录

  • 1. 概念
  • 2. 内部类特性
  • 3. 内部类实现多重继承的应用


1. 概念

    (1)在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
    (2)Inner class 一般用在定义它的类或语句块,在外部引用它时必须给出完整的名称

注:Inner class 的名字不能与包含它的类名相同。

    (3)Inner class 可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要 : new 内部类.成员或者new 内部类对象.成员

下面举个例子来说明:

package day09;

public class Test3 {
	int i;
	public int z;
	private int k;
	
	class A {//内部类
	
		int i;//内部类可以有自己的属性
		
		public void setTest3Fileds() {
			Test3.this.i = 1;//设置外部类的属性
			Test3.this.z = 2;
			Test3.this.k = 3;
		}
		
		public void set() {//内部类可以有自己的方法
			this.i = 10;
			}
	}
	
	public void setInfo() {//通过内部类设置外部属性
		new A().setTest3Fileds();//外部的类要想使用自己的内部类的方法,得先new内部类的对象
	}
	
	public void showInfo() {//显示属性
		System.out.println(this.i);
		System.out.println(this.z);
		System.out.println(this.k);
	}
	
	public static void main(String[] args) {
		Test3 t = new Test3();
		t.setInfo();
		t.showInfo();
	}
	
}

2. 内部类特性

Inner class 作为类的成员:
(1)可以声明为 final 的
(2)和外部类不同, Inner class 可声明为 private 或 protected ;
(3)Inner class 可以声明为 static 的,但此时就不能再使用外层类的非 static 的成员变量;
Inner class 作为类:
(1)可以声明为 abstract 类 ,因此可以被其它的内部类继承
【注意】非 static 的内部类中的成员不能声明为 static 的,只有在外部类或 static 的内部类中才可声明 static 成员。

核心作用:内部类最大的作用是实现多重继承

package day09;

public class Test3 {
	int i;
	public int z;
	private int k;
	
	//声明内部类:A、B、C、D、E
	
	class A {//内部类
		int i;
		public void setTest3Fileds() {
			Test3.this.i = 1;
			Test3.this.z = 2;
			Test3.this.k = 3;
		}
		
		public void set() {
			this.i = 10;
		}
	}
	
	
	final class B {//除了声明为final。与外部类不同,内部类还可以声明为private、protected类
		
	}
	
	
	static class C {//如果内部类是static的,就不能使用外部类的非static的成员
		
	}
	
	abstract class D {//可以声明为 abstract 类,被其它的内部类继承
		
	}
	
	class E extends D {//E类继承D抽象类
		
	}	

}

3. 内部类实现多重继承的应用

内部类主要是解决java不能多重继承的问题

举例:
代码如下

package day09;

public class Test4 {
	public static void main(String[] args) {
		A a = new A();
		a.testB();
		a.testC();
	}

}
/**
 * 现在类A想同时获得类B和类C的方法(java无法进行多继承),并且重写
 * 可以使用内部类来变相的实现类的多重继承,可以继承多个类
 * @author 14532
 *
 */

class A {
	
	public void testB() {
		new InnerB().testB();
	}
	
	
	public void testC() {
		new InnerC().testC();
	}
	
	private class InnerB extends B{
		@Override
		public void testB() {
			System.out.println("这是重写之后的testB方法");
		}
	}
	
	
	private class InnerC extends C{
		@Override
		public void testC() {
			System.out.println("这是重写之后的testC方法");
		}
	}

}

class B {
	public void testB() {
		
	}
}

class C {
	public void testC() {
		
	}
	
}

运行结果:

在这里插入图片描述

你可能感兴趣的:(java学习,java,学习,开发语言)