P194 页中的内部类与向上转型的一些思考?

来源:互联网 发布:c语言rand函数用法 编辑:程序博客网 时间:2024/06/08 12:35

原话-

当将内部类向上转型为其基类时,尤其是转型为一个接口的时候,内部类就有了用武之地。(从实现了某个接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。)这是因为此内部类-某个接口的实现-能够完全不可见,并且不可用。所得到的只是只想基类或接口的引用,所以能够很方便的隐藏实现细节。

我对这个隐藏细节不能理解啊?先摘网上几个例子做记录吧。


/*内部类向上转型为接口

  如果将一个权限修饰符为private的内部类向上转型为其父类对象,或者直接向上转型为一个接口,
  在程序中就可以完全隐藏内部类的具体实现过程。可以在外部提供一个接口,在接口中声明一个方法。
  如果在实现该接口的内部类中实现该接口的方法,就可以定义多个内部类以不同的方式实现接口中的

  同一个方法*/


interface OutInterface   //定义一个接口
{
public void f();
}

class OuterClass      
{
//定义一个内部类实现OutInterface接口
private class InnerClass implements OutInterface
{
InnerClass(String s){    //内部类构造方法
System.out.println(s);
}

public void f(){//实现接口中的f()方法
System.out.println("访问内部类中的f()方法");
}
}

//定义一个方法,返回值类型为OutInterface接口  可以被继承下去
public OutInterface doit(){
return new InnerClass("访问内部类构造方法");
}
}

public class InterfaceInner 
{
public static void main(String[] args) 
{
OuterClass out = new OuterClass();    //实例化一个OuterClass对象


OutInterface outinter = out.doit(); //调用doit()方法,返回一个OutInterface接口


outinter.f(); //调用f()方法

}
}

/*
  OuterClass类中定义了一个修饰权限为private的内部类,这个内部类实现了OutInterface接口,
  然后修改doit()方法,使该方法返回一个OutInterface接口。由于内部类InnerClass修饰权限为
  private,所以除了OuterClass类可以访问该内部类之外,其他类都不能访问,而可以访问doit()方法。
  由于该方法返回一个外部接口类型,这个接口可以作为外部使用的接口。如果某个类继承了外部类,
  由于内部的权限不可以向下转型为内部类InnerClass,同时也不能访问f()方法,但是却可以访问接口
  中的f()方法。
  
  例如,InterfaceInner类中最后一句outinter.f();接口引用调用f()方法,从执行的结果可以看出,这条
  语句执行的是内部类中的f()方法,很好地对继承该类的子类隐藏了实现细节,仅为编写子类的人留下一个
  接口和一个外部类,同时也可以调用f()方法,但是f()方法的具体实现过程却被很好地隐藏了*/


//---------------------------------------------------分割---------------------------------------------------------------------------------------

 

public interface A {
    public String a();
}

public class Sub  {//并未实现接口A但是可以从类Sub的实例来获取接口A
    class implements A{//类Sub的内部类C
        public String a(){
            return "this is C implements A";
        }
    }
    public String a(){
        return "this is Sub";
    }
 
    public static void main(String[] args) {
        A a = new Sub().new C();//向上转型为接口A
        System.out.println(a.a());
    }
 
}


内部类C实现了,隐藏了方法a的实现方式,这样在类Sub中实现的a方法与内部内实现的a不同,同时,内部类向上转型为接口A使用

追问
也就是说,向上转型就是指一个内部类实现了他外面那个类所实现不了的功能,是不?可是那里有隐藏呢?Java中的隐藏到底是什么意思呢对了,你帮我我问的题目问的都解答了吧,给加分,一次一次追问的太麻烦
回答
已经够隐藏了啊,内部类C的实现未对其他的对象开放,只有设计者可以来访问,其实最有效的是匿名类。在你的实现类(这个内部类)里面,你的实现方式不提供给任何人员使用,只有你自己使用,其他人员基本访问不到,当然,知道你结构的开发人员也可以访问。
追问
嗯嗯,明白了那么什么是向上转型?何谓向上?有相对的向下转型不?
回答
有啊,强制转型A a = new Sub().new C();C c = (Sub.C)a;//这个就是向下转型


zjj239|五级

说白了,就是定义的父类广,而内部类作为实现父类时,可以对外隐藏其具体实现方式(也就是对方法的重新实现),就是在运行时候才知道到底怎么实现,代码是活动的,不是你一看到代码,就知道是要做什么,结果会是什么,是运行情况不同实现机理也不一样


炎龙_果| 四级

内部类就是在一个类的内部还可以使用类 详细可查匿名内部类 多看几个例子就好了!!List list=new ArrayList(); 就是一个向上转型 List类是由ArrayList来实现的 个人觉得隐藏的意思就是不让别人轻易看懂 盗用代码 这只是个人理解 请勿传播

//---------------------------------------------------------某大神解释
 似的 2014/5/16 19:54:51
说白了就是在其他类中,比如你第一个例子里的那个main方法里调用doit()方法的时候,并不能知道它是通过实例化了一个内部类的对象来实现的,因为它不能访问这个内部类
似的  19:56:05
main方法压根不知道这个内部类,以及它的对象的存在,在main方法看来只是调用了前面那个外部类的一个public的方法而已
Eternally  20:08:15
额。。。那可以理解为 返回的 接口的基类 不能判断 是内部类来实现或者还是外部类来实现?
似的  20:10:08
对,main虽然可以访问那个方法,但是方法内部是怎么实现的它并不清楚,所以也不知道是通过实例化了一个内部类的对象并调用它的f()来做的
Eternally  20:14:18
那麻烦能说明一下隐藏的好处吗?
这个隐藏是不是比如你提供一个开发包让别人用,但是却不想让别人知道你代码的实现?
似的  20:25:25
有这方面
另外
如果以后代码要修改,也可以不影响其他代码
似的  20:26:52
比如还是那个例子,以后你不想用内部类了,只要把doit()方法改掉就行了,调用doit的main方法不需要修改,因为它之前压根不知道内部类的事,所以有没有内部类对它来说是一样的
似的  20:27:55
说白了,doit就好象一个黑盒,反正我main这么调用它就行了,不管它内部是用内部类还是直接写逻辑 




0 0
原创粉丝点击