内部类详解

  • static关键字基本概念
      我们可以用一句话来概括:方便在没有创建对象的情况下来进行调用。也就是说:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。

  • 什么是内部类
      大部分时候,类被定义成一个独立的程序单元。在某些情况下,也会把一个类放到另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(有些地方也叫做嵌套类),包含内部类的类也被称为外部类(有些地方也叫做宿主类)。
      Java的内部类主要分为 成员内部类、局部内部类、匿名内部类、静态内部类

  • 成员内部类与局部内部类

1.成员内部类与局部内部类的区分

package com.vg.demo03;
/**
 * 内部类的位置:
 * 	1.成员位置——>成员变量
 * 	2.局部位置——>局部变量
 * */
//外部类
public class Outer {
	private int num;
	//成员内部类 --- 成员变量
        //内部类——>成员位置
	public class Inner{
		
	}
	
	public void method() {
		int num;
		//局部内部类---局部变量
                //内部类——>局部变量
		class Inner{
			
		}
	}
}
//成员内部类变量名方法名和局部内部类可以一样

2.成员内部类与局部内部类的访问特点

内部类可以直接访问外部类的成员,包括私有。
外部类要访问内部的成员,必须创建对象

package com.vg.demo03;

/**
 * 内部类的访问——内部类造对象
 * 成员内部类造对象
 * */

//外部类
class Outer {
	private int num = 10;
	
	public void method2() {
		//外部类中访问内部类的成员
		//必须创建内部类对象
		System.out.println("====调用method2===");
		System.out.println("method2...");
		//成员内部类对象创建
		Inner i = new Inner();
		System.out.println(i.i);
		//静态成员内部类对象创建
		Inner3 i3 = new Inner3();
		i3.method();
	}
	
	public static int num2;
	
	//静态内部类
	public static class Inner3{
		public void method() {
			System.out.println("===静态内部类===");
			System.out.println("method");
			//静态成员不能访问非静态的
			//method2();
			//System.out.println(num);
		}
	}
	
	//成员内部类
	public class Inner{
		private int i = 1000;
		public void method() {
			System.out.println("===成员内部类===");
			System.out.println(num);
			method2();
		}
	}
	
	public void method() {
		//int num;
		//局部内部类
		class Inner2 {
			public void method1() {
				System.out.println("===局部内部类==");
				System.out.println(num);
				method2();
			}
		}
		//局部内部类只能在局部范围使用
		Inner2 i2 = new Inner2();
		i2.method1();
	}
}

public class OuterTest{
	public static void main(String[] args) {
		//创建外部类对象,都是在外部类外部
		
		//成员内部类造对象
		//Inner i = new Inner(); 普通类 错误写法
		//格式:外部类名.内部类名 i = new 外部类().new 内部类();
		Outer.Inner oi = new Outer().new Inner();
		oi.method();//成员内部类对象的使用
		//创建外部类对象
		//调用方法
		//执行局部内部类对象的方法
		
		Outer o = new Outer();
		o.method();
		//局部内部类对象的使用
		
		o.method2();
		
		//静态内部类造对象
		//类名.静态变量名
		//格式: 外部类名.内部类名 i = new 外部类 new 内部类();
		Outer.Inner3 oi3 = new Outer.Inner3();
		oi3.method();
	}
}

  • 内部类的作用
    1、更好的封装性
    2、内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,但外部类不能访问内部类的实现细节,例如内部类的成员变量
    3、匿名内部类适合用于创建那些仅需要一次使用的类

  • 静态类(只有内部类才能被声明为静态类,即静态内部类(也可称为类内部类))---静态成员变量
    1、只能在内部类中定义静态类
    2、静态内部类与外层类绑定,即使没有创建外层类的对象,它一样存在。
    3、静态类的方法可以是静态的方法也可以是非静态的方法,静态的方法可以在外层通过静态类调用,而非静态的方法必须要创建类的对象之后才能调用。
    4、只能引用外部类的static成员变量(也就是类变量)。
    5、如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者方法的时候,是不能够被定义成静态的。

  • 静态类与非静态类的区别

package com.vg.demo03;

//代码来分析静态内部类与非静态内部类的区别
public class OutClassTest {
	
	int out1 = 1;
	static int out2 = 1 ;
	
	void out() {
		System.out.println("非静态");
	}
	static void outstatic() {
		System.out.println("静态");
	}
	
	public class InnerClass{
		void InnerClass() {
			System.out.println("innerClass!");
			System.out.println(out1);
			System.out.println(out2);
			out();
			outstatic();//静态内部类只能访问外部类的静态成员
		}
		
		//static void inner(){}
		//static int i=1;
		//非静态内部类不能有静态成员(方法、属性)
		
		
	}
	
	public static class InnerstaticClass{
		void InnerstaticClass() {
			System.out.println("InnerstaticClass");
			//静态内部类只能访问外部类的静态成员
			//out();
			//System.out.println(out1);
			outstatic();
			System.out.println(out2);
		}
		//静态内部类能有能有静态成员(方法、属性)
		static void innerstatic() {}
		static int i = 1;
	}
	public static void main(String[] args) {
		OutClassTest a = new OutClassTest();
		OutClassTest.InnerstaticClass b = new OutClassTest.InnerstaticClass();//创建静态内部类
		OutClassTest.InnerClass c = a.new InnerClass();
		System.out.println(a.out1);
		System.out.println("====");
		System.out.println(a.out2);
		System.out.println("====");
		a.out();
		System.out.println("====");
		a.outstatic();
		System.out.println("====");
		c.InnerClass();
		System.out.println("====");
		b.InnerstaticClass();
	}

}

1.是否能拥有静态成员
  静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
2.访问外部类成员
  静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性),外部类的静态成员不可以直接使用非静态内部类。
3.静态内部类和非静态内部类在创建时有区别
  //假设类A有静态内部类B和非静态内部类C,创建B和C的区别为:
  A a=new A();
  A.B b=new A.B(); //静态内部类
  A.C c=a.new C();

有事评论区留言,也欢迎一起学习的伙伴
原文地址:https://www.cnblogs.com/wt9866/p/13604834.html