内部类

2020-11-12  本文已影响0人  曾梦想仗剑天涯

内部类的基本定义

//内部类的基本定义
package demo;
class Outer {   //外部类
  private String msg = "www.baidu.com";    //私有成员属性
  public void fun() {   //普通方法
    Inner in = new Inner();   //实例化内部对象
    in.print();   //调用内部类方法
  }
  class Inner {   //内部类
    public void print() {
      System.out.println(Outer.this.msg);    //msg是Outer的属性
    }
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    Outer out = new Outer();    //实例化外部对象
    out.fun();    //调用外部类中的方法
  }
}
//将刚才的程序分为两个类
package demo;
class Outer {   //外部类
  private String msg = "www.baidu.com";    //私有成员属性
  public void fun() {   //普通方法
//思考五:需要将当前对象Outer传递到Inner类之中
    Inner in = new Inner(this);   //实例化内部对象
    in.print();   //调用内部类方法
  }
  //思考一:如果msg要想被外部访问,须提供getter方法
  public String getMsg() {
    return this.msg;
  }
}
class Inner {   //内部类
  //思考三:Inner类实例化对象的时候要有Outer类的引用
  private Outer out;
  //思考四:应该通过Inner的构造方法获取Outer类对象
  public Inner(Outer out) {
    this.out = out;
  }
  public void print() {
    //思考二:如果想要调用外部类中的getter方法,必须有Outer类对象
    System.out.println(this.out.getMsg());    //msg是Outer的属性
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    Outer out = new Outer();    //实例化外部对象
    out.fun();    //调用外部类中的方法
  }
}

内部类相关说明

//外部类访问内部类中的私有属性
package demo;
class Outer {  
  private String msg = "www.baidu.com";  
  public void fun() {   
    Inner in = new Inner();  
    in.print(); 
    System.out.println(in.info);    //访问内部类的私有属性
  }
  class Inner { 
    private String info = "一些信息";
    public void print() {
      System.out.println(Outer.this.msg); 
    }
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    Outer out = new Outer(); 
    out.fun();    
  }
}
package demo;
class Outer {  
  private String msg = "www.baidu.com";
  class Inner {
    public void print() {
      System.out.println(Outer.this.msg); 
    }
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    Outer.Inner in = new Outer(). new Inner();  
    in.print();
  }
}
class Outer {  
  private String msg = "www.baidu.com";
  private class Inner {
    public void print() {
      System.out.println(Outer.this.msg); 
    }
  }
}
//定义内部接口
package demo;
interface IChannel {    //定义接口
  public abstract void send(IMessage msg);   //发送消息
  interface IMessage {
    public abstract String getContent();    //获取消息内容
  }
}
class ChannelImpl implements IChannel {
  public void send(IMessage msg) {
    System.out.println("发送消息:" + msg.getContent());
  }
  class MessageImpl implements IMessage {
    public String getContent() {
      return "www.baidu.com";
    }
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    IChannel channel = new ChannelImpl();
    channel.send(((ChannelImpl)channel).new MessageImpl());
  }
}
//观察内部抽象类
package demo;
interface IChannel {  
  public abstract void send();  
  abstract class AbstractMessage {
    public abstract String getContent();  
  }
}
class ChannelImpl implements IChannel {
  public void send() {
    AbstractMessage msg = new Message();
    System.out.println(msg.getContent());
  }
  class Message extends AbstractMessage {
    public String getContent() {
      return "www.baidu.com";
    }
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    IChannel channel = new ChannelImpl();
    channel.send();
  }
}
//接口内部进行接口实现
package demo;
interface IChannel {  
  public abstract void send();  
  class ChannelImpl implements IChannel {
    public void send() {
      System.out.println("www.baidu.com");
    }
  }
  public static IChannel getInstance() {
    return new ChannelImpl();
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    IChannel channel = IChannel.getInstance();
    channel.send();
  }
}

static定义内部类

//使用static定义内部类
package demo;
class Outer {
  private static final String MSG = "www.baidu.com";
  static class Inner {
    public void print() {
      System.out.println(MSG);
    }
  }
}
//实例化static内部类对象
public class JavaDemo {
  public static void main(String [] args) {
    Outer.Inner in = new Outer.Inner();
    in.print();
  }
}
//使用static定义内部接口
package demo;
interface IMessageWrap {
  static interface IMessage {
    public abstract String getContent(); 
  }
  static interface IChannel {
    public abstract boolean connect();    //消息通道
  }
  public static void send(IMessage msg, IChannel channel) {   //消息发送
    if(channel.connect()) {
      System.out.println(msg.getContent());
    } else {
      System.out.println("消息无法发送");
    }
  }  
}
class DefaultMessage implements IMessageWrap.IMessage {
  public String getContent() {
    return "www.baidu.com";
  }
}
class NetChannel implements IMessageWrap.IChannel {
  public boolean connect() {
    return true;
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    IMessageWrap.send(new DefaultMessage(), new NetChannel());
  }
}

方法中定义内部类

//观察在方法中定义的内部类
package demo;
class Outer {
  private String msg = "www.baidu.com";
  public void fun(long time) {
    class Inner {   //内部类
      public void print() {
        System.out.println(Outer.this.msg);
        System.out.println(time);
      }
    }
    new Inner().print();    //方法中直接实例化内部类对象
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    Outer out = new Outer();
    out.fun(12863L);
  }
}
//JDK1.8之前的访问
public void fun(final long time) {
    final String info = "net";
    class Inner {   //内部类
      public void print() {
        System.out.println(Outer.this.msg);
        System.out.println(time);
        System.out.println(info);
      }
    }
    new Inner().print();    //方法中直接实例化内部类对象
  }

匿名内部类

//观察一个基本的程序结构
package demo;
interface IMessage {
  public abstract void send(String msg);
}
class MessageImpl implements IMessage {
  public void send(String msg) {
    System.out.println(msg);
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    IMessage msg = new MessageImpl();
    msg.send("这是一个消息");
  }
}
//使用匿名内部类
package demo;
interface IMessage {
  public abstract void send(String msg);
}
public class JavaDemo {
  public static void main(String [] args) {
    IMessage msg = new IMessage() {   //匿名内部类
      public void send(String msg) {
        System.out.println(msg);
      }
    };
    msg.send("这是一个消息");
  }
}
//在接口中直接定义匿名内部类
package demo;
interface IMessage {
  public abstract void send(String msg);
  public static IMessage getInstance() {
    return new IMessage() {
      public void send(String msg) {
        System.out.println(msg);
      }
    };
  }
}
public class JavaDemo {
  public static void main(String []     args) {
    IMessage.getInstance().send("这是一个消息");
  }
}
上一篇 下一篇

猜你喜欢

热点阅读