• Java日志第21天 2020.7.26


    内部类

    如果一个事物包含另一个事物,这就是一个类内部包含另一个类。

    如身体与心脏、汽车与发动机

    内部类中包括成员内部类与局部内部类,其中局部内部类中又包含匿名内部类

    成员内部类

    格式:

    修饰符 class 外部类名称{

      修饰符 class 内部类名称{

        // ...

      }

      // ...

    }

    内部类用外部类时,可以随意访问;外部类用内部类时,需要用内部类的对象。

    两种使用成员内部类的方法

    1.间接方法:在外部类方法中使用内部类,main方法直接调用外部类方法。

    public class Body {//外部类
    
        public class Heart{//内部类
    
            //内部类方法
            public void beat(){
                System.out.println("心脏跳动");
            }
    
        }
        //外部类方法中使用内部类
        public void methodBody(){
            Heart heart = new Heart();
            heart.beat();
        }
    }

    2.直接方法:

    类名称 对象名 = new 类名称

    外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()

    public class DemoMain {
    public static void main(String[] args) {

    Body body = new Body();
    body.methodBody();

    Body.Heart heart = new Body().new Heart();
    heart.beat();
    }
    }

    当存在重名变量时,访问如下:

    public class Outer {
        
        private int num = 10;
        
        public class Inner{
            private int num = 20;
            
            public void method(){
                int num = 30;
                System.out.println(num);//30
                System.out.println(this.num);//20
                System.out.println(Outer.this.num);//10
            }
        }
    }

    *内部类的.class文件命名是 外部类名称$内部类名称.class,所以不建议命名类名称时使用$符号

    局部内部类

    如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。

    只有当前所属方法可以使用它,出了这个方法就不能使用。

    格式:

    修饰符 class 外部类名称{

      修饰符 返回值类型 方法名称(参数列表){

        class 内部类名称{

        }

        // 方法体

      }

    }

    public class Outer {
    
        private int num = 10;
    
        public void method(){
            /*final*/ int num = 20;
            class Inner{
                public void getNum(){
                    System.out.println(num);
                }
            }
        }
    }

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

    从Java 8 开始,只要局部变量事实不变,那么final关键字可以省略。

    匿名内部类

    如果接口的实现类(或者父类的子类)只需要使用唯一一次,那么这种情况下就可以省略掉该实现类的定义,而使用匿名内部类。

    格式:

    接口名称 对象名 = new 接口欧名称{

      //覆盖重写所有抽象方法

    }

    public interface MyInterface {
    
        public abstract void method();
    
    }
    public class DemoMain {
        public static void main(String[] args) {
    
            MyInterface obj1 = new MyInterface() {
                @Override
                public void method() {
                    System.out.println("对象调用匿名内部类中的方法");
                }
            };
            obj1.method();
            
            new MyInterface() {
                @Override
                public void method() {
                    System.out.println("匿名对象调用匿名内部类中的方法");
                }
            }.method();
        }
    }

    今天的内容需要理解,多练一练,明天还有一点内容,然后做一个综合实例。

  • 相关阅读:
    Flask下如何处理Requests 上传中文文件名的问题
    xml.etree.ElementTree对CDATA的输出
    Java 实现HTML富文本导出至word完美解决方案
    tornado学习笔记18 _RequestDispatcher 请求分发器
    哗啦啦Python之路
    哗啦啦Python之路
    哗啦啦python金融量化之路
    哗啦啦Python之路
    哗啦啦Python之路
    哗啦啦Python之路
  • 原文地址:https://www.cnblogs.com/Gazikel/p/13379892.html
Copyright © 2020-2023  润新知