• 内部类详解


    • 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();

    有事评论区留言,也欢迎一起学习的伙伴
  • 相关阅读:
    CSU 1505: 酷酷的单词【字符串】
    HDU 2036 改革春风吹满地【计算几何/叉乘求多边形面积】
    HDU 2034 人见人爱A-B【STL/set】
    HDU 2031 进制转换
    HDU 1020 Encoding【连续的计数器重置】
    HDU 1999 不可摸数【类似筛法求真因子和】
    动态规划总结
    CSU 1785: 又一道简单题
    CSU 1779: 错误的算法【矩阵/模拟】
    CSU 1777: 大还是小?【模拟/后导0】
  • 原文地址:https://www.cnblogs.com/wt9866/p/13604834.html
Copyright © 2020-2023  润新知