java基礎篇:內部類

使用內部類的目的:可以輕鬆的訪問外部類的私有屬性和方法

普通內部類

  • 外部類也可以輕鬆的訪問內部類的私有成員和方法
  • 創建方式:外部類.內部類 內部類對象 = new 外部類().new 內部類()
  • 編譯完成後,內部類class文件爲“OuterInner.class,Inner.class”,其中$就是“.”的意思
  • 內部類創建之前,必須先創建外部類
  • 如果內部類定義爲private,那麼外部將無法創建內部類,也就無法使用內部類

接口中的內部類

  • 抽象方法和接口,也可以定義內部結構
// 內部接口
interface IChannel{
    public void send(IMessage msg);
    interface IMessage{
       public 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.mldn.cn";
        }
    }
}

public class JavaDemo{
    public static void main(String args[]){
        IChannel channel = new ChannelImpl();
        channel.send(((ChannelImpl)channel).new MessageImpl());
    }
}
  • 內部抽象類

interface IChannel{
    public void send(IMessage msg);
    abstract class AbstractMessage{
       public abstract String getContent();//獲得消息 
    }
}

class ChannelImpl implements IChannel{
    public void send(IMessage msg){
    AbstractMessage msg = new MessageImpl ();
        System.out.println("發送消息" + msg.getContent());
    }
    class MessageImpl extends AbstractMessage{
        public String getContent(){
            return "www.mldn.cn";
        }
    }
}

public class JavaDemo{
    public static void main(String args[]){
        IChannel channel = new ChannelImpl();
        channel.send(((ChannelImpl)channel).new MessageImpl());
    }
}
  • 我們還可以在接口內部定義一個類實現該接口
interface IChannel{
    public void send();
    class ChannelImpl implements IChannel{
      public void send(){
          System.out.println("www.mldn.cn");
      }
      public static IChannel getInstance(){
          return new ChannelImpl();
      }
    }
}
public class JavaDemo{
    public static void main(String args[]){
        IChannel channel = new IChannel.getInstance();
        channel.send(;
    }
}

static定義的內部類

  • 其實就是外部類,只是放在程序類的內部而已
class Outer{
private static final String MSG = "bridge";
static class Inner{
    public void print(){
        System.out.println(Outer.MSG);
    }
}
    
}

public class JavaDemo{
    public static void main(String args[]){
        Outer.Inner in = new Outer.Inner();
        in.print()
    }
}

  • 創建:外部類.內部類 內部類對象 = new 外部類.內部類()
  • 接口靜態內部類,軟件設計中比較常用
interface IMessageWarp{
    static interface IMessage {
        public String getContent();
    }
    static interface IChannel{
        public boolean connect();
    }
    public static void send(IMessage msg,IChannel channel){
        if(channel.connect()){
            System.out.println(msg.getContent());
        } else {
            System.out.print("消息通道無法建立")
        }
    }

class DefaultMessage implements IMessageWarp.IMessage{
    public String getContent(){
        return "bridge";
    }
}

class NetChannel implements IMessageWarp.IChannel{
    public boolean connect(){
        return true;
    }
}

public class JavaDemo{
    public static void main(String args[]){
        IMessageWarp.send(new DefaultMessage(), new NetChannel());
    }
}


方法的內部類

  • 內部類可以直接訪問方法參數time,但是jdk1.8之前需要加final
  • 內部類可以直接訪問類中的屬性
class Outer{
	private String msg = "bridge";
	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[]){
		new Outer().fun(1252323L);
	}
}

匿名內部類

  • 如果內部類只使用一次,我們就可以使用匿名內部類
interface IMessage{
	public void send(String str);
}
public class JavaDemo{
	public static void main(String args[]){
		IMessage msg = new IMessage(){
			public void send(String str){
				System.out.print(str);
			}
		};
		msg.send("bridge");
	}
}

接口方法中的靜態內部類

interface IMessage{
	public void send(String str);
	public static IMessage getInstance(){
		return new IMessage(){
			public void send(String str){
				System.out.println(str);
			}
		};
	}
}
public class JavaDemo{
	public static void main(String args[]){
		IMessage.getInstance().send("bridge");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章