1. 程式人生 > >Java基礎系列之內部類的多重繼承與事件回撥

Java基礎系列之內部類的多重繼承與事件回撥

為什要使用內部類

  • 實現多重繼承
  • 實現閉包(隱藏關鍵環節)
  • 事件回撥

內部類的型別

  • 非靜態內部類
public class NoStaticInsideClass {
    
    private @Setter  String name;
    private @Setter  int age;
    
    class UserAction{
        public void call() {
            System.out.println(name + " "+age);
        }
    }

    public static void main(String[] args)
{ NoStaticInsideClass ni = new NoStaticInsideClass(); ni.setName("張三"); ni.setAge(18); UserAction ua = ni.new UserAction(); ua.call(); } }
  • 靜態內部類
public class StaticInsideClass {
    private static String name;
    private static int age;
    
    static
class UserAction{ public void call() { System.out.println(StaticInsideClass.name + " "+StaticInsideClass.age); } } public static void main(String[] args) { StaticInsideClass.name = "張三"; StaticInsideClass.age = 18; UserAction ua = new StaticInsideClass.UserAction(); ua.call(); } }
  • 匿名內部類
public class AnonymousInsideClass {

    private @Setter  String name;
    private @Setter  int age;
    
    UserAction ua = new  UserAction(){
        public void call() {
            System.out.println(name + " "+age);
        }
    };

    public static void main(String[] args) {
        AnonymousInsideClass ni = new AnonymousInsideClass();
        ni.setName("張三");
        ni.setAge(18);
        ni.ua.call();
    }
    }

實戰

  • 利用內部類實現多重繼承
class Father {    
       public String name() {        
            return "張";    
       }
}

class Mather {    
       public String face() {        
            return "白色";    
       }
}

public class Child extends Father {    
        class Child2 extends Mather{        
             public String childPeculiarity(){            
                   return "繼承了爸爸的姓("+name() + ")和媽媽的面板("+face()+")";        
             }    
        }    

        public static void main(String[] args) {        
             System.out.println("兒子的特點是:" + new Child().new Child2().childPeculiarity());    
        }
}
  • 利用內部類實現按鈕事件回撥
public interface BtnClickListener {
    public void call();
}

public class Button {
    public void addClickListener(BtnClickListener event) {
        event.call();
    }
}

public class UserClick {
    
    /**
     * 匿名內部類
     */
    BtnClickListener bl = new BtnClickListener() {
        @Override
        public void call() {
            System.out.println("當用戶點選了按鈕後,執行了此方法");
        }
    };
    
    public static void main(String[] args) {
        new UserClick().triggerClick();
    }
    
    /**
     * 模擬觸發按鈕事件
     */
    public void triggerClick() {
        new Button().addClickListener(bl);
    }
}
轉載自:https://www.jianshu.com/p/7d19315cd321