• java学习day19--API-内部类


    内部类

    概念

    ​ 如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。就是把类定义在类的内部的情况就可以形成内部类的形式。

    ​ A类中又定义了B类,B类就是内部类。B类可以当做A类的一个成员看待。

    基本格式:

    class A {//外部类
        class B{//内部类
            
        }
    }
    

    特点:

    1、 内部类可以直接访问外部类中的成员,包括私有成员

    2、 外部类要访问内部类的成员,必须要建立内部类的对象

    3、 在成员位置的内部类是成员内部类

    4、 在局部位置的内部类是局部内部类

    入门案例

    package cn.tedu.reflection;
    //这个类用来测试  内部类
    public class Test4_InnerClass {
        public static void main(String[] args) {
            //1、创建内部类对象    ---    外部类名.内部类名   变量 =  外部类对象.内部类对象
            Outer.Inner oi = new Outer().new Inner();
            //2、调用内部类的资源
            //        oi.showIn();
            //        System.out.println( oi.age );
            new Outer().showOut();//触发外部类方法showOut()
        }
    }
    class Outer{//外部类
        private String name = "皮皮霞" ;
        public void showOut(){
            //在外部类类  调用  内部类 资源  ---  不可以直接用!!创建内部类对象来调用!!
            new Inner().showIn();
            System.out.println( new Inner().age  );
    
            System.out.println("showOut()...");
        }
    
        class Inner{//内部类
            int age = 20 ;
            public void showIn(){
                //在内部类里  可以使用 外部类的资源吗   -- 可以!!
                //            showOut();
                //            System.out.println("name = " + name);
                System.out.println("showIn()...");
            }
        }
    }
    

    成员内部类

    成员内部类被private和static修饰

    public class Test1_Inner {
        public static void main(String[] args) {
            //创建内部类对象,使用内部类资源
            //Outer.Inner oi = new Outer().new Inner() ; 
            //2、因为内部类被Private,无法直接new
            //        oi.showIn();
            //4、触发showOut()
            new Outer().showOut();
            //6、使用静态的内部类Inner2的资源  --  可以直接通过外部类名.内部类名来定位内部类
            Outer.Inner2 oi = new Outer.Inner2() ;
            oi.showIn2();
            //7、访问静态内部类里  静态方法
            Outer.Inner2.showIn2();
        }
    }
    class Outer{//外部类
        String name ;
        public void showOut(){
            //3、间接访问showIn()
            new Inner().showIn();
            System.out.println("showOut()...");
        }
        //5、内部类被static修饰
        static class Inner2{
            int count = 10 ;
            static public void showIn2(){
                System.out.println("showIn2()...");
            }
        }
        //1、在成员位置的内部类,叫成员内部类。可以被private修饰,也可以被static修饰
        private class Inner{//内部类
            int age ;
            public void showIn(){
                System.out.println("showIn()...");
            }
        }
    }
    

    匿名内部类

    匿名内部类属于局部内部类,并且是没有名字的内部类.

    1 普通类的匿名内部类

    class A{
        public void show(){
            System.out.println("show()");
        }
    }
    public static void main(String[] args){
        new A(){
            @Override
            public void show(){
            System.out.println("show()的重写");
        	}
        }.show();//调用指定的方法
    }
    
    

    2 接口的匿名内部类

    interface Inter{
        void save() ;
        void get() ;
    }
    public static void main(String[] args) {
        //new Inter(),相当于创建了一个接口的实现类的对象,只不过是匿名对象。只能执行一个任务!!
        new Inter(){//匿名内部类
            @Override
            public void save() {
                System.out.println("save()...");
            }
            @Override
            public void get() {
                System.out.println("get()...");
            }
        }.save();//调用指定方法
    }
    

    如果想要调用多个方法,可以给匿名对象起一个名字,就可以执行多个任务

    Inter in = new Inter(){//匿名内部类  ,给匿名对象起个名字,就可以执行多个任务了!!
        @Override
        public void save() {
            System.out.println("save()...");
        }
        @Override
        public void get() {
            System.out.println("get()...");
        }
    };
    in.save();
    in.get();
    

    若想通过匿名内部类访问多个方法,且不给匿名对象起名,可以按照以下方法

    public static void main(String[] args) {
        new Inter(){
            @Override
            public Inter save() {
                System.out.println("save()");
               	return this;
            }
            @Override
            public Inter get() {
                System.out.println("get()");
                return this;
            }
        }.get().save();
    }
    interface Inter{
        Inter save();
        Inter get();
    }
    

    3 抽象类的匿名内部类

    abstract class Demo{
        public abstract void update() ;
        public void show(){  System.out.println("show()..."); }
    }
     public static void main(String[] args) {
         new Demo(){//就相当于创建了抽象类的对象
             @Override
             public void update() {
                 System.out.println("update()...");
             }
         }.update();//调用指定方法  
     }
    
  • 相关阅读:
    在一天的24小时之中,时钟的时针、分针和秒针完整重合在一路的时辰有几回?都分辨是什么时光?你如何算出来的?
    12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)
    Bootstrap4默认样式不对胃口?教你使用NPM+Webpack+SASS来定制
    Java 内存模型和 JVM 内存结构真不是一回事
    还在为垂直居中苦恼?CSS 布局利器 flexbox 轻轻松松帮你搞定
    这 3 个 Set 集合的实现有点简单,那来做个总结吧
    TreeMap 还能排序?分析下源码就明白了
    红黑树这个数据结构,让你又爱又恨?看了这篇,妥妥的征服它
    模拟实现 Tomcat 的核心模块:NIO,HTTP,容器和集群
    「福利」Java Swing 编写的可视化算法工程,包含树、图和排序
  • 原文地址:https://www.cnblogs.com/liqbk/p/12968317.html
Copyright © 2020-2023  润新知