• 内部类


    1.内部类

    1.1内部类概述

    内部类:就是在一个类中定义一个类,举例:在一个类A的内部定义一个类B,类B就被称为内部类

    内部类的定义格式:

    //格式
    public class 类名{
        修饰符 class 类名{
        }
    }
    
    //范例
    public class Outer{
        public class Inner{
            
        }
    }
    
    • 内部类可以直接访问外部类的成员,包括私有
    • 外部类要访问内部类的成员必须创建对象
    package com.szy001;
    /*
    内部类和外部类
     */
    public class Outer {
        private int num=10;
        public class Inner{
            public void show(){
                System.out.println(num);//内部类直接访问外部类的成员
            }
        }   
        public void method(){
    //        show();外部类不能直接访问内部类的成员
            Inner i=new Inner();//外部类访问内部类成员要先创建对象
            i.show();
        }
    }
    

    1.2成员内部类

    按照内部类在类中定义的位置不同,可以分为如下两种形式

    • 在类的成员位置:成员内部类
    • 在类的局部位置:局部内部类

    成员内部类,外界如何创建对象适用呢?

    • 格式:外部类名.内部类名 对象名=外部类对象.内部类对象;

    • 范例:Outer.Inner oi=new Outer().new Inner();

      package com.szy002;
      
      public class Outer {
          private int num=10;
      
          public class Inner{
              public void show(){
                  System.out.println(num);
              }
          }
          //这样的写法不常见
      }
      
      package com.szy002;
      /*
      测试类
       */
      public class InnerDemo {
          public static void main(String[] args) {
              //创建内部类对象,并调用方法
      //        Inner i=new Inner();报错
      
              Outer.Inner oi=new Outer().new Inner();
              oi.show();
          }
      }
      

      常见的写法为:把对内部类对象的访问写成一个方法放在外部类中,使用时访问外部类的方法即可。

    package com.szy002;
    
    public class Outer {
        private int num=10;
        private class Inner{//私有类对外不可见
            public void show(){
                System.out.println(num);
            }
        }
        public void method(){
            Inner i=new Inner();
            i.show();
        }
    }
    
    package com.szy002;
    /*
    测试类
     */
    public class InnerDemo {
        public static void main(String[] args) {
            Outer o=new Outer();
            o.method();
        }
    }
    
    

    1.3局部内部类

    局部内部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法内部创建对象并使用。该类可以直接访问外部类的成员,也可以访问方法的局部变量。

    package com.szy003;
    
    public class Outer {
        private int num=10;
        public void method(){
            int num2=20;
            class Inner{//局部内部类
                public void show(){
                    System.out.println(num);
                    System.out.println(num2);
                }
            }
            Inner i=new Inner();
            i.show();
        }
    }
    
    package com.szy003;
    /*
    测试类
     */
    public class OuterDemo {
        public static void main(String[] args) {
            Outer o=new Outer();
            o.method();
        }
    }
    

    1.4匿名内部类

    匿名内部类是局部内部类的特殊形式,也属于局部内部类

    前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类

    //格式
    new 类名或者接口名(){
        重写方法;
    }
    //范例
    new Inter(){
        public void show(){
            
        }
    }
    

    匿名内部类的本质:是一个继承了该类或者实现了该接口的子类匿名对象

    package com.szy004;
    
    public class Outer {
        public void method(){
            /*
            new Inter(){
                @Override
                public void show() {
                    System.out.println("匿名内部类");
                }
            }.show();
             */
           Inter i= new Inter(){
                @Override
                public void show() {
                    System.out.println("匿名内部类");
                }
            };
           i.show();
        }
    }
    
    package com.szy004;
    
    public interface Inter {
        public abstract void show();
    }
    
    package com.szy004;
    
    public class OuterDemo1 {
        public static void main(String[] args) {
            Outer o=new Outer();
            o.method();
        }
    }
    

    1.5 匿名内部类在开发中的使用

    package com.szy005;
    /* 
    跳高接口
     */
    public interface Jumpping {
        void jump();
    }
    
    package com.szy005;
    /*
    接口操作类,里面有一个方法,方法的参数是接口名
     */
    public class JumppingOperator {
        public void method(Jumpping j){
            j.jump();
        }
    }
    
    package com.szy005;
    
    public class Cat implements Jumpping{
        @Override
        public void jump() {
            System.out.println("猫猫跳高");
        }
    }
    
    package com.szy005;
    
    public class Dog implements Jumpping{
        @Override
        public void jump() {
            System.out.println("狗狗跳高");
        }
    }
    
    package com.szy005;
    /*
    测试类
     */
    public class JumppingDemo {
        public static void main(String[] args) {
            //需求:创建接口操作类的对象,调用method方法
            JumppingOperator jo=new JumppingOperator();
            Jumpping j=new Cat();
            jo.method(j);
    
            Jumpping j2=new Dog();
            jo.method(j2);
            System.out.println("-------------");
    
            jo.method(new Jumpping() {
                @Override
                public void jump() {
                    System.out.println("猫可以跳高了");
                }
            });
    
            jo.method(new Jumpping() {
                @Override
                public void jump() {
                    System.out.println("狗可以跳高了");
                }
            });
        }
    }
    

  • 相关阅读:
    【初入职场】工作一个月
    sql中更新数据库用到declare @a in
    Mac 下ll命令 command not found
    GLIBC_2.7升级
    PHP 5.5以后加速插件:Zend Opcache
    ssh的public key的使用
    apache Alias使用问题
    linux下telnet mysql的3306断口,提示Can't connect to MySQL server on localhost (110)
    知乎技术方案初探[转]
    JS刷新父窗口的几种方式
  • 原文地址:https://www.cnblogs.com/SZYJY/p/16078246.html
Copyright © 2020-2023  润新知