一、内部类简介

内部类:类内部的类
内部类,属于Java面向对象中,最高级级别的东西(绝大多数情况下,面试问的多,实际用的少)

四种内部类

成员内部类(注意),静态内部类,局部内部类,匿名内部类(注意)

二、兄弟类

在一个Java文件中,以并列的方式,定义类
但是要注意:兄弟类的访问修饰符,是采用的默认
只能在本包或本类中使用

  1. package com.woniuxy.java22.study;
  2. /**
  3. * 内部类的讲解
  4. * @author Administrator
  5. *
  6. */
  7. public class Person {
  8. }
  9. /**
  10. * 兄弟类
  11. * @author Administrator
  12. *
  13. */
  14. class Dog{
  15. }
  16. /**
  17. * 兄弟类
  18. * @author Administrator
  19. *
  20. */
  21. class Cat{
  22. }

三、成员内部类(注意)

成员内部类,就是某一个类,是当前的类的成员之一
此时内部类和类之间的关系:组合(部分跟整体的关系)
当前内部类和类的耦合关系,非常的高
eg: 人 (头,躯干,四肢)

  1. package com.woniuxy.java22.study;
  2. /**
  3. * 内部类的讲解
  4. * @author Administrator
  5. *
  6. */
  7. public class Person {
  8. private String name;
  9. /**
  10. * 人的头
  11. * @author Administrator
  12. *
  13. */
  14. class Head {
  15. /**
  16. * 头的大小
  17. */
  18. private int size;
  19. public int getSize() {
  20. return size;
  21. }
  22. public void setSize(int size) {
  23. this.size = size;
  24. }
  25. @Override
  26. public String toString() {
  27. return "Head [size=" + size + "]";
  28. }
  29. }
  30. public String getName() {
  31. return name;
  32. }
  33. public void setName(String name) {
  34. this.name = name;
  35. }
  36. }
  37. /**
  38. * 兄弟类
  39. * @author Administrator
  40. *
  41. */
  42. class Dog{
  43. }
  44. /**
  45. * 兄弟类
  46. * @author Administrator
  47. *
  48. */
  49. class Cat{
  50. }
    package com.woniuxy.java22.study;
    import com.woniuxy.java22.study.Person.Head;
    public class MainEnter {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //定义人
            Person person = new Person();
            person.setName("张三");
            //---------------------------------------
            //成员内部类的用法
            //---------------------------------------
            Head head = person.new Head();
            head.setSize(20);//人的头的大小
        }
    }

它的类文件命名方式为:Person$Head.class

四、静态内部类

静态内部类 和成员内部类一样,都是类中的一部分。区别在于:成员内部类 在定义时,没有使用static,而静态内部类使用static定义

    package com.woniuxy.java23.study;
    /**
     * 内部类的讲解
     * @author Administrator
     *
     */
    public class Person {
        private String name;
        /**
         * 静态内部类(了解)
         * 
         * 注意:静态内部类内部, 不能使用外部类的非静态成员
         * 但是可以使用静态成员
         * 
         * Person$StaticInner.class
         * @author Administrator
         *
         */
        static class StaticInner{
            private String staticName;
            public void meth01() {
    //            name = "";
                System.out.println("我是一个静态内部类");
            }
            public String getStaticName() {
                return staticName;
            }
            public void setStaticName(String staticName) {
                this.staticName = staticName;
            }
        }
        /**
         * 成员内部类
         * Person$Head.class
         * 人的头
         * @author Administrator
         *
         */
        class Head {
            /**
             * 头的大小
             */
            private int size;
            public int getSize() {
                return size;
            }
            public void setSize(int size) {
                this.size = size;
            }
            @Override
            public String toString() {
                return "Head [size=" + size + "]";
            }
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    /**
     * 兄弟类
     * @author Administrator
     *
     */
    class Dog{
    }
    /**
     * 兄弟类
     * @author Administrator
     *
     */
    class Cat{
    }

五、局部内部类

成员内部类和静态内部类,都是定义在方法之外,接下来的局部内部类和匿名内部类都是定义在方法内部的类
局部内部类是在类的方法内部定义的类。局部内部类只能在方法内部中使用。一旦方法执行完毕,局部内部类就会从内存中被清除。

    public class Person {
        private String name;
        /**
         * 局部内部类
         */
        public void breath() {
            /**
             * 定义在方法内部的类
             * 该类的作用范围,只在方法内部有效
             Person$1O2.class
             * @author Administrator
             *
             */
            class O2{
                /**
                 * 氧气的状态(1液氧,2汽氧)
                 */
                private int type;
                public int getType() {
                    return type;
                }
                public void setType(int type) {
                    this.type = type;
                }
            }
            //局部内部类的实例,也是在方法的内部
            O2 o2 = new O2();
            o2.setType(1);
        }
    }

局部内部类的命名方式: 外部类$编号 局部内部类的名称.class

六、匿名内部类(注意)

匿名内部类 是局部内部类中的一个特例,但是它的特点是:
1、它没有名字
2、类的类定义,类的实例化是在同一个地方

    package com.woniuxy.java23.study;
    /**
     * 内部类的讲解
     * @author Administrator
     *
     */
    public class Person {
        private String name;
        /**
         * 回家
         * @param driver
         */
        public void goHome(Driverable driver) {
            driver.driver();
            driver.stop();
        }
        public void eat() {
            /**
             * Person$2Water.class
             * @author Administrator
             *
             */
            class Water{
            }
        }
        /**
         * 局部内部类
         */
        public void breath() {
            /**
             * 定义在方法内部的类
             * 该类的作用范围,只在方法内部有效
             * Person$1O2.class
             * @author Administrator
             *
             */
            class O2{
                /**
                 * 氧气的状态(1液氧,2汽氧)
                 */
                private int type;
                public int getType() {
                    return type;
                }
                public void setType(int type) {
                    this.type = type;
                }
            }
            //局部内部类的实例,也是在方法的内部
            O2 o2 = new O2();
            o2.setType(1);
            /**
             * Person$1Water.class
             * @author Administrator
             *
             */
            class Water{
            }
        }
        /**
         * 静态内部类(了解)
         * 
         * 注意:静态内部类内部, 不能使用外部类的非静态成员
         * 但是可以使用静态成员
         * 
         * Person$StaticInner.class
         * @author Administrator
         *
         */
        static class StaticInner{
            private String staticName;
            public void meth01() {
    //            name = "";
                System.out.println("我是一个静态内部类");
            }
            public String getStaticName() {
                return staticName;
            }
            public void setStaticName(String staticName) {
                this.staticName = staticName;
            }
        }
        /**
         * 成员内部类
         * Person$Head.class
         * 人的头
         * @author Administrator
         *
         */
        class Head {
            /**
             * 头的大小
             */
            private int size;
            public int getSize() {
                return size;
            }
            public void setSize(int size) {
                this.size = size;
            }
            @Override
            public String toString() {
                return "Head [size=" + size + "]";
            }
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    /**
     * 兄弟类
     * @author Administrator
     *
     */
    class Dog{
    }
    /**
     * 兄弟类
     * @author Administrator
     *
     */
    class Cat{
    }
    package com.woniuxy.java23.study;
    import com.woniuxy.java23.study.Person.Head;
    public class MainEnter {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //定义人
            Person person = new Person();
            person.setName("张三");
            //---------------------------------------
            //成员内部类的用法
            //---------------------------------------
            Head head = person.new Head();
            head.setSize(20);//人的头的大小
            //---------------------------------------
            //静态内部类的用法
            //---------------------------------------
            Person.StaticInner inner = new Person.StaticInner();
            inner.meth01();
            //---------------------------------------
            //局部内部类的用法
            //---------------------------------------
            person.breath();
            //匿名内部类(类是没有名字的,即在定义类,又在实例化类)
            person.goHome(new Driverable() {
                @Override
                public void driver() {
                    // TODO Auto-generated method stub
                    System.out.println("开车回家!!!!");
                }
                @Override
                public void stop() {
                    // TODO Auto-generated method stub
                    System.out.println("我停下来了!!!");
                }
            });
        }
    }

匿名内部类(2):

    package com.woniuxy.java23.study;
    public class Student implements Comparable<Student>{
        private String name;
        private int age;
        private int gender;
        public Student(String name, int age, int gender) {
            super();
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        public Student() {
            super();
            // TODO Auto-generated constructor stub
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public int getGender() {
            return gender;
        }
        public void setGender(int gender) {
            this.gender = gender;
        }
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
        }
        @Override
        public int compareTo(Student o) {
            // TODO Auto-generated method stub
            return this.age - o.age;
        }
    }
    package com.woniuxy.java23.study;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import com.woniuxy.java23.study.Person.Head;
    public class MainEnter {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    //        study01();
            study02();
        }
        private static void study02() {
            // TODO Auto-generated method stub
            Student stu = new Student("张三", 12, -1);
            Student stu2 = new Student("李四", 32, 1);
            Student stu3 = new Student("王五", 23, 0);
            Student stu4 = new Student("赵六", 45, 1);
            Student stu5 = new Student("田七", 13, 0);
            List<Student> stus = new ArrayList<Student>();
            Collections.addAll(stus, stu,stu2,stu3,stu4,stu5);
            //默认升序
            Collections.sort(stus);
            //降序(匿名内部类)
            Collections.sort(stus, new Comparator<Student>() {
                @Override
                public int compare(Student o1, Student o2) {
                    // TODO Auto-generated method stub
                    return o1.getGender() - o2.getGender() ;
                }
            });
            System.out.println(stus);
        }
        private static void study01() {
            // TODO Auto-generated method stub
            // 定义人
            Person person = new Person();
            person.setName("张三");
            // ---------------------------------------
            // 成员内部类的用法
            // ---------------------------------------
            Head head = person.new Head();
            head.setSize(20);// 人的头的大小
            // ---------------------------------------
            // 静态内部类的用法
            // ---------------------------------------
            Person.StaticInner inner = new Person.StaticInner();
            inner.meth01();
            // ---------------------------------------
            // 局部内部类的用法
            // ---------------------------------------
            person.breath();
            // 匿名内部类(类是没有名字的,即在定义类,又在实例化类)
            person.goHome(new Driverable() {
                @Override
                public void driver() {
                    // TODO Auto-generated method stub
                    System.out.println("开车回家!!!!");
                }
                @Override
                public void stop() {
                    // TODO Auto-generated method stub
                    System.out.println("我停下来了!!!");
                }
            });
        }
    }