• 内部类


    内部类

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

    成员内部类

    成员内部类的定义格式:
        修饰符 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 出来的对象,会在堆当中持续存在,直到垃圾回收消失。
    */
    
  • 相关阅读:
    poj 3318 Matrix Multiplication 夜
    hdu 4331 Image Recognition 夜
    poj 3277 City Horizon 夜
    poj 3301 Texas Trip 夜
    poj 1151 Atlantis 夜
    poj 3286 How many 0's 夜
    poj 2454 Jersey Politics 夜
    poj 1465 Multiple 夜
    poj 1095 Trees Made to Order 夜
    Null和undefined的区别?
  • 原文地址:https://www.cnblogs.com/liu-xin-yang/p/12630597.html
Copyright © 2020-2023  润新知