JAVA内部类,成员内部类,静态内部类,方法内部类

概念区分和用法简介

Posted by Ruizhi Ma on May 8, 2019

内部类

什么是内部类?
内部类,顾名思义就是定义在另一个类之内的类。

内部类有什么好处?(官方说法。编程实践太少了,没有形成自己的认知,以后有体会,回来再根据自己认知改一改!)

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类

  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据

  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便

内部类分几种呢?

  1. 成员内部类
  2. 静态内部类
  3. 方法内部类
  4. 匿名内部类

话不多说,先来看一段代码熟悉一下:

//外部类HelloWorld
public class HelloWorld {
    
    // 内部类Inner,类Inner在类HelloWorld的内部
    public class Inner {
        
		// 内部类的方法
		public void show() {
			System.out.println("welcome to github!");
		}
	}
    
	public static void main(String[] args) {
        
        // 创建外部类对象
		HelloWorld hello = new HelloWorld();
        // 创建内部类对象,必须是 内部类 对象名 = 外部类对象.new 内部类();
		Inner in = hello.new Inner();
        // 调用内部类对象的方法
		in.show();
	}
}

运行结果:
welcome to github!

成员内部类

什么是成员内部类? 最常见的就是成员内部类,相当于类内部的成员变量,成员方法一个等级,就是一个普通的内部类而已。

看段代码:

//外部类HelloWorld
public class Outter{
    
    //外部类的私有属性name
    private String name = "sober";
    
    //外部类的成员属性
    int age = 22;
    
	//成员内部类Inner
	public class Inner {
		String name = "mrz";
        //内部类中的方法
		public void show() { 
			System.out.println("外部类中的name:" + Outter.this.name);//当内部类和外部类成员变量名一样时,要访问外部类的成员,格式必须是外部类.this.变量名
			System.out.println("内部类中的name:" + name);
			System.out.println("外部类中的age:" + age);
		}
	}
    
	//测试成员内部类
	public static void main(String[] args) {
        
        //创建外部类的对象
		Outter o = new Outter (); 
        
        //创建内部类的对象
		Inner inn =   o.new Inner();
        
        //调用内部类对象的show方法
		inn.show();
	}
}

运行结果: 外部类中的name:sober 内部类中的name:mrz 外部类中的age:22 小总结:

  1. 可以看到,内部类Inner就是简单的放在了外部类Outter里面
  2. Innter的show方法,可以任意访问外部类的所有成员变量,不论修饰符是public还是private
  3. Inner的show方法可以直接访问Outter的私有成员变量,
  4. 当内部类和外部类成员变量名一样时,要访问外部类的成员,格式必须是外部类.this.变量名
    注意:外部类不能直接使用内部类的成员和方法,但内部类可以访问外部类的成员和方法

静态内部类

什么是静态内部类? 静态内部类是由static修饰的内部类。
看段代码:

//外部类
public class HelloWorld {
    
    // 外部类中的静态变量score
    private static int score = 84;
    
    // 创建静态内部类
	public static class SInner {
        // 内部类中的变量score
        int score = 91;
        
		public void show() {
			System.out.println("访问外部类中的score:" + HelloWorld.score);
			System.out.println("访问内部类中的score:" + score);
		}
	}

	// 测试静态内部类
	public static void main(String[] args) {
		// 直接创建内部类的对象
        SInner si = new SInner();
        // 调用show方法
		si.show();
	}
}

运行结果:
访问外部类中的score:84 访问内部类中的score:91 小总结:

  1. 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类()
  2. 因为静态内部类是static修饰的,和静态变量一样,静态的不能直接访问非静态的,所以如果静态内部类想要访问外部类的非静态成员,需要通过new 外部类().成员的方式访问

方法内部类

什么是方法内部类?
就是在外部类的方法中定义的类,方法内部类能只在该方法内可以使用

//外部类
public class HelloWorld {
    
    private String name = "sober";
    
    // 外部类中的show方法
    public void show() { 
		// 定义方法内部类,不能添加
		class MInner {
			int score = 83;
			public int getScore() {
				return score + 10;
			}
		}
        
		// 创建方法内部类的对象
        
        MInner mi = new MInner();
        // 调用内部类的方法
		int newScore = mi.getScore();
		
		System.out.println("姓名:" + name + "\n加分后的成绩:" + newScore);
	}
    
	// 测试方法内部类
	public static void main(String[] args) {
        
		// 创建外部类的对象
        HelloWorld hello = new HelloWorld();
        
        // 调用外部类的方法
		hello.show();
	}
}

运行结果:
姓名:sober 加分后的成绩:93 注意:由于 方法内部类 不能在 外部类的方法 以外的地方使用,因此 方法内部类 不能使用访问控制符和static修饰符。

匿名内部类

还没有学~~~~学完来补全。