zoukankan      html  css  js  c++  java
  • 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();
        }
    }

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

  • 相关阅读:
    对象不支持此属性或方法
    继承多态
    GetType和typeof的区别
    比较高效的表格行背景变色及选定高亮JS
    C#获取存储过程的Return返回值和Output输出参数值
    删除表中重复记录,只保留一行
    实现自定义的ToolTip
    状态管理之Cookie
    Microsoft SQL Server,错误: 5120
    IE/Firefox中全局正则表达式的兼容
  • 原文地址:https://www.cnblogs.com/Gazikel/p/13379892.html
Copyright © 2011-2022 走看看