java基础篇:内部类

使用内部类的目的:可以轻松的访问外部类的私有属性和方法

普通内部类

  • 外部类也可以轻松的访问内部类的私有成员和方法
  • 创建方式:外部类.内部类 内部类对象 = new 外部类().new 内部类()
  • 编译完成后,内部类class文件为“Outer I n n e r . c l a s s ” , 其 中 Inner.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");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值