内部类、代码块

作者: 嘉美伯爵 | 来源:发表于2017-03-10 17:55 被阅读34次

    基本概念

    一、内部类可以方便的访问外部类的私有属性

    package practice;
    
    class Outner{    //外部类
        private String msg = "Hello World";
        class Inner{   //内部类
            public void print(){
                System.out.println(msg);
            }
        }
        public void fun(){
            //实例化内部类对象并调用print()方法
            new Inner().print();   //使用匿名对象,此时不必声明对象
        }
    }
    
    public class Inner {
        public static void main(String [] args){
            Outner a = new Outner();  //声明外部对象并实例化外部类
            new Outner().fun();  //调用外部类方法-------用a调用和用new Outner()调用一样
        }
    }
    

    二、外部类也可以方便的访问内部类的私有属性

    package practice;
    
    class Outner{    //外部类
        private String msg = "Hello World";
        class Inner{   //内部类
                    private String info = "世界,你好";
            public void print(){
                System.out.println(msg);
            }
        }
        public void fun(){
            //声明并实例化内部类对象
            Inner in = new Inner();   
                    //直接利用内部类调用了内部类中定义的方法
                    System.out.println(in.info);
        }
    }
    
    public class Inner {
        public static void main(String [] args){
            Outner a = new Outner();  //声明外部对象并实例化外部类
            new Outner().fun();  //调用外部类方法-------用a调用和用new Outner()调用一样
        }
    }
    

    三、类名称.this.属性

    package practice;
    
    class Outner{    //外部类
        private String msg = "Hello World";
        class Inner{   //内部类
            public void print(){
                      //this表示当前,若不加Outner,this.msg表示查找当前类
                System.out.println(Outner.this.msg);
            }
        }
        public void fun(){
            //实例化内部类对象并调用print()方法
            new Inner().print();   //使用匿名对象,此时不必声明对象
        }
    }
    
    public class Inner {
        public static void main(String [] args){
            Outner a = new Outner();  //声明外部对象并实例化外部类
            new Outner().fun();  //调用外部类方法-------用a调用和用new Outner()调用一样
        }
    }
    

    转换(内部类的实例化方法)

    package practice;
    
    class Outner{    //外部类
        private String msg = "Hello World";
        class Inner{   //内部类
            public void print(){
                System.out.println(Outner.this.msg);
            }
        }
        
    }
    
    public class Inner {
        public static void main(String [] args){
                  //外部类.内部类 对象 = new 外部类().new 内部类();
            Outner.Inner in = new Outner().new Inner();
            in.print();
        }
    }
    

    static定义内部类

    package practice;
    
    class Outner{    //外部类
        private static String msg = "Hello World";
        static class Inner{   //内部类
            public void print(){
                System.out.println(msg);
            }
        }   
    }
    public class Inner {
        public static void main(String [] args){
            Outner.Inner in = new Outner.Inner();
            in.print();
        }
    }
    

    方法中定义内部类

    内部类可以在任意位置定义,包括类、方法、代码块。

    package practice;
    
    class Outner{    //外部类
        private String msg = "Hello World";
        public void fun(){
            class Inner{
                public void print(){
                    System.out.println(Outner.this.msg);
                }
            }
            new Inner().print();;
        }
        
    }
    
    public class Inner {
        public static void main(String [] args){
            new Outner().fun();
        }
    }
    

    内部类和外部类之间可以方便的进行私有属性的访问

    package practice;
    
    class Outner{    //外部类
        private String msg = "Hello World";
        public void fun(int num){
            double score = 99.9;
            class Inner{
                public void print(){
                    System.out.println("属性:"+Outner.this.msg);
                    System.out.println("方法参数:"+num);
                    System.out.println("方法变量:"+score);
                }
            }
            new Inner().print();;
        }
        
    }
    
    public class Inner {
        public static void main(String [] args){
            new Outner().fun(100);
        }
    }
    

    分类

    代码块分为普通代码块、构造块、静态块、同步代码块。由{}括起来的才为代码块。

    普通代码块

    作用避免代码过多时,有可能产生重复变量。

    public class Demo{
          public static void main(String [] args){
             //下面大括号内容即为普通代码块,若去掉普通代码块则程序错误,变量名重复
               {
                 int num = 10;   //局部变量
                 System.out.println(num);
               }
               int num = 10;   //全局变量
               System.out.println(num);
        }
    }
    

    构造块

    构造块执行优先于构造方法

    class Gouzhao{
            public  Gouzhao(){    //构造方法
                System.out.println("【A】 构造方法产生");
       }
      {
              System.out.println("【B】 构造块产生");       
      }
    }
    public class Demo{
        public static void main(String [] args){
              new Gouzhao();
    }
    }
    

    静态块

    含有static关键字的都为静态块,分为两种在主类中和非主类中。

    非主类静态块

    执行优先于构造块,但是只执行一次,作用为类中的static属性初始化。

    class Gouzhao{
            static String mag;
            public  Gouzhao(){    //构造方法
            System.out.println("【A】 构造方法产生");
       }
      {
            System.out.println("【B】 构造块产生");       
      }
      static{       //静态块
            msg = "Hello";
            System.out.println("【C】 静态块产生");       
      }
    }
    public class Demo{
        public static void main(String [] args){
              new Gouzhao();
              new Gouzhao();
              new Gouzhao();
              System.out.println(Gaozhao.msg);  
    }
    }
    

    主类静态块

    执行优先于主方法。

    public class Demo{
    static{       //静态块
            System.out.println("静态块产生");       
      }
        public static void main(String [] args){
            System.out.println("Hello World");       
    }
    

    同步代码块

    ......

    总结

    四大代码块开发制造一般不会使用,但在测试程序时有可能会使用到静态块。

    相关文章

      网友评论

        本文标题:内部类、代码块

        本文链接:https://www.haomeiwen.com/subject/mgrogttx.html