• java学习之内部类、匿名内部类


    内部类定义在局部时:

      1.不可以被成员修饰符修饰

      2.可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量

    package com.dreamy.day04;
    
    /**
     * @author dreamy
     *
     */
    class Outer{
        int x=3;
        void method(final int a) {
            final int y=4;
            class Inner{
                void function() {
                    System.out.println(a);
                }
            }
            new Inner().function();
        }
    }
    public class InnerClassDemo01 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Outer out=new Outer();
            out.method(7);
            out.method(8);
        }
    
    }

    匿名内部类:

    1.匿名内部类其实就是内部类的简写格式。

    2.定义匿名内部类的前提:

      内部类必须是继承一个类或者实现接口。

    3.匿名内部类的格式:new 父类或者接口(){ 定义子类的内容 };

    4.其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。

    package com.dreamy.day04;
    
    /**
     * @author dreamy
     *
     */
    
    abstract class AbsDemo{
        abstract void show();
    }
    
    class Outer{
        int x=3;
        /*
        class Inner extends AbsDemo{
            void show() {
                System.out.println("show:"+x);
            }
        }
        */
        public void function() {
            //new Inner().show();
            /*匿名内部类1:
            new AbsDemo() {
                void show() {
                    System.out.println("show:"+x);
                }
            };
            */
            
            //匿名内部类2:
            //new Inner().show();
            new AbsDemo() {
                @Override
                void show() {
                    System.out.println("x==="+x);
                }
            }.show();
        }
    }
    
    public class InnerClassDemo01 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            new Outer().function();
        }
    
    }

    5.匿名内部类中定义的方法最好不要超过3个

    package com.dreamy.day04;
    
    /**
     * @author dreamy
     *
     */
    
    abstract class AbsDemo{
        abstract void show();
    }
    
    class Outer{
        int x=3;
        /*
        class Inner extends AbsDemo{
            void show() {
                System.out.println("show:"+x);
            }
        }
        */
        public void function() {
            //new Inner().show();
            /*匿名内部类1:
            new AbsDemo() {
                void show() {
                    System.out.println("show:"+x);
                }
                void abc(){
                    System.out.println("haha");
                }
            };
            */
            
            //匿名内部类2:
            //new Inner().show();
            new AbsDemo() {
                @Override
                void show() {
                    System.out.println("x==="+x);
                }
                void abc() {
                    System.out.println("haha");
                }
            }.abc();
        }
    }
    
    public class InnerClassDemo01 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    //        new Outer().function();
            //AbsDemo a=new Inner();
            AbsDemo d=new AbsDemo() {
                @Override
                void show() {
                    System.out.println("x==="+x);
                }
                void abc() {
                    System.out.println("haha");
                }
            };
            d.show();
            //d.abc();/编译失败,因为父类没有这个方法。
        }
    
    }
    package com.dreamy.day04;
    
    /**
     * @author dreamy
     *
     */
    
    abstract class AbsDemo{
        abstract void show();
    }
    
    class Outer{
        int x=3;
        public void function() {
            //new Inner().show();
            /*匿名内部类1:
            new AbsDemo() {
                int num=9;
                void show() {
                    System.out.println("num:"+num);
                }
                void abc(){
                    System.out.println("haha");
                }
            };
            */
            
            //匿名内部类2:
            //new Inner().show();
            new AbsDemo() {
                int num=90;
                @Override
                void show() {
                    System.out.println("x==="+num);
                }
                void abc() {
                    System.out.println("haha");
                }
            }.show();
        }
    }
    
    public class InnerClassDemo01 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            new Outer().function();
            //AbsDemo a=new Inner();
            AbsDemo d=new AbsDemo() {
                int num=9;
                @Override
                void show() {
                    System.out.println("num==="+num);
                }
                void abc() {
                    System.out.println("haha");
                }
            };
            d.show();
            //d.abc();/编译失败,因为父类没有这个方法。
        }
    
    }
  • 相关阅读:
    初识Opserver,StackExchange的监控解决方案
    html input readonly 和 disable的区别
    css3制作优惠券
    C#判断用户是否使用微信浏览器,并据此来显示真实内容或二维码
    通过userAgent判断手机浏览器类型
    history.js使用方法(来自博客园)
    搭建可调试的微信公众平台本地测试环境
    Entity Framework中编辑时错误ObjectStateManager 中已存在具有同一键的对象
    c# List<int> 转 string 以及 string [] 转 List<int>
    C#中的lock关键字
  • 原文地址:https://www.cnblogs.com/zhaohuan1996/p/8042371.html
Copyright © 2020-2023  润新知