内部类

内部类

内部类种类
    成员内部类
    局部内部类(包含匿名内部类)

成员内部类

成员内部类的定义格式:
    修饰符 class 外部类名称{
        修饰符 class 内部类名称{
            //...
        }
    }
注意事项:
    内用外,随意访问,外用内,需要内部类对象
    
使用成员内部类的两种方式?
    间接方式:外部类的方法中,使用内部类;然后mian只是调用外部类的方法
    直接方式:公式
    		外部类名称.内部类名称 类名称 =new 外部类名称().new 内部类名称();
    
    public class Body{//外部类
       public class Heart{//成员内部类
       //内部类的方法
       public void beat(){
           System.out.println("心脏跳动");、
           System.out.println("我叫"+name);//正确写法   内部类可以随意使用外部类的成员变量和方法
       }}
        
        //外部类的成员变量
        private String name;
        
        //外部类方法
        public void methodBody(){
            System.out.println("外部类的方法");
            new Heart().beat();//外部类调用内部类的第一种方法,通过外部类的成员方法创建内部类的对象调用内部类的成员方法。
        }
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name=name;
        }
    }





//测试类
public class test{
    public static void main(String[] args){
        Body body=new Body();//创建外部类对象
        //通过外部类对象调用外部类方法,从而间接调用内部类的方法
        body.methodBody();
        
        
        //第二种方法
        //创建内部类的对象来创建,来调用内部类的方法
        //格式 外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();
        Body.Heart heart=new Body().new Heart();
        heart.beat();
    }
}

内部类的类成员变量同名的问题

   
    public class Body{//外部类
        	int num=10;
       public class Heart{//成员内部类
           int num=20;
       //内部类的方法
       public void beat(){
           int num=30;
           System.out.println(num);//使用内部类的局部变量
           System.out.println(this.num);//使用局部类的成员变量
           System.out.println(Body.this.num);//使用外部类的成员变量
       }}
        
        //外部类的成员变量
        private String name;
        
        //外部类方法
        public void methodBody(){
            System.out.println("外部类的方法");
            new Heart().beat();//外部类调用内部类的第一种方法,通过外部类的成员方法创建内部类的对象调用内部类的成员方法。
        }
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name=name;
        }
    }

局部内部类

/*
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。
“局部”:只有当前所属的方法才能使用它,出了这个方法就不能使用了。

定义格式:
	修饰符 class 外部类名称{
	修饰符 返回值类型 外部类方法名称(参数列表){
	class 局部内部类名称{
	//...
	}
	}
	}
*/

public class Outer {
	public void outerMethod() {
		class Inner{
			int num=19;
			public void innerMethod() {
				System.out.println(num);
			}
		}
		Inner inner=new Inner();
		inner.innerMethod();//19
	}
}

public class mainTest {
	public static void main(String[] args) {
		Outer outer =new Outer();
		outer.outerMethod();
	
	}
}
注意事项:
    小结一下权限修饰符:
    public >protected>(default)>private
    定义一个类的时候,权限修饰符规则
    外部类:public /(default)
    成员内部类:public /protected/(default)/private
    局部内部类:什么都不写

局部变量的final问题

/*
局部内部类,如果希望访问所在的方法的局部变量,那么这个局部变量必须是[有效final的]

备注:从java 8+开始,只要局部变量事实不变,那么final关键字可以省略。
原因:
	new 出来的对象是在堆内存中。
	局部变量是跟着方法走的,在栈内部当中。
	方法运行结束之后,立刻出栈,局部变量就会立刻消失
	但是new 出来的对象,会在堆当中持续存在,直到垃圾回收消失。
*/
原文地址:https://www.cnblogs.com/liu-xin-yang/p/12630597.html