• Java内部类


    将一个类定义在另一个类里面,就是内部类。
      普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。

    定义在方法和作用域内的内部类,局部内部类。
      局部内部类不能访问说明符,因为它不是外围类的一部分,但它可以访问当前代码块内的常量。以及此外围类的所有成员。

    将内部类声明为static,被称为嵌套类。
      要创建嵌套类的对象,不需要其外围类的对象。
      不能从嵌套类的对象中访问非静态的外围类对象。

    普通内部类的字段和方法不能使用static,也不能包含嵌套类;字段可以使用static final
    嵌套类可以包含这些。

    class 文件
    每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。class对象。
    内部类 : 外围类名$内部类名
    匿名类: 数字代替$ 第一个局部匿名类1 外围类名1内部类名 第二个 外围类名2内部类名

    基本的内部类。
    public class InnerBasic {

        private int id;
        protected String name;
        static int age;

        abstract class Inner {
            public String inner;

            void test() {
                this.inner = name;
            }
        }

        private class PInner {

        }

        final class Inners {
            String iname = name;
            int id = new InnerBasic().id;

            InnerBasic getOut() {
                return InnerBasic.this; // 返回对外部类对象的引用
            }
        }

        static class Innert {
            int idt = age;
            String s = new InnerBasic().name;

            Object test() {
                class Testt {
                    void xxx() {
                        System.out.println("xxx");
                    }
                }
                return new Testt();
            }

        }

        public static void test1() {
            Innert inner = new Innert(); // static
            Inners inners = new InnerBasic().new Inners();
        }

        public void test() {
            Innert innert = new Innert(); // static
            InnerBasic.Inners inner = new InnerBasic.Inners();
        }
    }


    局部内部类
    package com.javase.innerclass;

    public class MethodInnerClass {
        public IService getService (final String s) {
            final int count = 100; // 可以使用count 不能修改,final/这里看起来像闭包, 但是完全不同。 这个方法结束,count作用域结束.
            final Person person = new Person();
            class InnerService implements IService {
                String name;
                InnerService(String name) {
                    this.name = name;
                }
                
                @Override
                public void test() {
                    this.name = s;
                    System.out.println("method inner test" + count + name +person.province);
                }
            }
            return new InnerService(s);
        }
    }

    匿名内部类// 对于匿名类而言,实例初始化的实际效果就是构造器,。不能重载实例初始化方法,所以只能有一个构造器。
    匿名内部类与正规的继承相比有些受限,因为匿名内部类可以扩展类, 也可以实现接口,但不能两者兼备。
    public class AnonymityClass {
        
        public void print() {
            System.out.println("print");
        }
        
        IService test() {
            new AnonymityClass() {        
                
            }.print();
            
            Comparator<Person> comparator =    new Comparator<Person>() {
                @Override
                public int compare(Person o1, Person o2) {
                    return (o1.id > o2.id ? 1 : -1);
                }
            };
            
            List<Person> list = new ArrayList<Person>();
            Collections.sort(list, comparator);
            
            return new IService() {
                @Override
                public void test() {
                    
                }
            };
        }
    }












  • 相关阅读:
    Ubuntu设置root用户登录图形界面
    Hadoop的安装与设置(1)
    SSH框架和Redis的整合(1)
    @Autowired注解的使用
    The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
    Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ...
    java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE
    Android Studio的SVN Performing VCS Refresh/Commit 长时间不结束
    Error:Execution failed for task ':app:clean'.
    Android Studio项目提交到GitHub
  • 原文地址:https://www.cnblogs.com/shouwangzhe-/p/3998872.html
Copyright © 2020-2023  润新知