久染

导航

Java Day16【第二十八章】内部类基本概念

【第二十八章】内部类基本概念

一.内部类的基本定义

范例:内部类

class Outer {
    private String msg = "www.mldn.cn";
    public void fun() {
        Inner in = new Inner();
        in.println();
    }
    class Inner{
        public void println() {
            System.out.println(Outer.this.msg);
        }
    }
}

  内部类的优势:轻松访问外部类的私有属性

二.内部类的相关说明:

  现在已经清楚的认识到了内部类的优势以及结构,现在对内部类进行一些相关说明

  1.外部类也可以轻松访问内部类中的私有属性。

范例:内部类实例化对象

  外部类.内部类 内部类对象 = new 外部类().内部类();

  在内部类编译完成之后会自动形成一个“Out$Inner.class”类文件,其中"$"这个符号换到程序之中就是”.“,所以内部类的全程就是外部类.内部类

  内部类与外部类之间可以直接进行私有成员的访问,所以一点要保证外部类的实例化。

class Outer {
    private String msg = "www.mldn.cn";
    class Inner{
        public void println() {
            System.out.println(Outer.this.msg);
        }
    }
}
public class Main
{
    public static void main(String[] args) {
        Outer.Inner in = new Outer().new Inner();
        in.println();
    }
}

 

  内部类结构也可以在抽象类或者接口之中使用

范例:定义内部接口

interface IChannel{
    public void send(IMessage msg);
    interface IMessage{
        public String getContent();
    }
}
class ChannelImpl implements IChannel{
    public void send(IMessage msg) {
        System.out.println("Send Message:"+msg.getContent());
    }
    class MessageImpl implements IMessage{
        public String getContent() {
            return "www.mldn.com";
        }
    }
}
public class Main
{
    public static void main(String[] args) {
        IChannel channel = new ChannelImpl();
        channel.send(((ChannelImpl)channel).new MessageImpl());
    }
}

 

三.static定义内部类

范例:使用static定义内部类接口:

 

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.println("消息通道建立失败");
        }
    }
}
class DefaultMessage implements IMessageWarp.IMessage{
    public String getContent() {
        return "www.mldn.com";
    }
}
class NetChannel implements IMessageWarp.IChannel{
    public boolean connect(){
        return true;
    }
}
public class Main{
    public static void main(String[] args) {
        IMessageWarp.send(new DefaultMessage(), new NetChannel());
    }
}

之所以使用static定义内部接口,主要是因为这些操作是属于一组相关的定义,主要是可以明确的定义接口的功能。

 

四.方法中定义内部类

范例:在方法类中定义内部类

class Outer{
    private String msg = "www";
    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 Main{
    public static void main(String[] args) {
        new Outer().fun(121351L);
    }
}

 

五.匿名内部类

  匿名内部类是一种简化的内部类的处理形式,主要在抽象类和接口的子类上使用

范例:观察一个程序结构

interface IMessage{
    public void send(String str);
}
class MessageImpl implements IMessage{
    public void send(String str) {
        System.out.println(str);
    }
}
public class Main{
    public static void main(String[] args) {
        IMessage msg = new MessageImpl();
        msg.send("www");
    }
}

  如果说IMessage接口中的子类只是用一次,那么没必要单独设置一个class

范例:使用匿名内部类

interface IMessage{
    public void send(String str);
}
public class Main{
    public static void main(String[] args) {
        IMessage msg = new IMessage(){    //匿名内部类对象
            public void send(String str) {
                System.out.println(str);
            }
        };
        msg.send("www");
    }
}

 

 

posted on 2019-11-04 17:59  久染  阅读(150)  评论(0编辑  收藏  举报