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();//调用指定方法  
 }
原文地址:https://www.cnblogs.com/liqbk/p/12968317.html