比如说:
public interface A //是X的接口
{
void m1();
}
public class X implements 
{
public void m1(){System.out.println("m1");}//实现抽象方法
void m2(){System.out.println("m1");}//自己定义的方法
public static void main(String[] args)
{
A a=new X();
X x1=(X)a;//强转,问为什么这样定义?为什么不直接定义为:X x1=new X();
x1.m1;
x.m2;
a=x1;
a.m1;
}
}

解决方案 »

  1.   

    达内学员?没好好听课吧...
    //强转,问为什么这样定义?为什么不直接定义为:X x1=new X();
    可以直接定义吧,
    有些时候这样写比较方便
    具体的我也不清楚,什么多态,继承,好像挺复杂
    反正a.m2()不行希望达人解答
      

  2.   

    类型A只"看得见"方法m1()
    类型X"看得见"方法m1(),m2()
    A a=new X();是为实现多态特性(upcasting).但此时a的声明类型是A,因此只能看的到m1()
    当需要用到m2()时,必须把a还原为X类型(downcasting)
    X x1=(X)a;
    如果是X x1=new X();这样就失去了多态的特性.另外
    A a=new X();
    X x1=(X)a;
    始终是针对一个对象操作
    A a=new X();
    X x1=new X();
    就变成对两个对象的操作了
      

  3.   

    我想说的是,A是某接口,B是某类实现A接口。如果程序中出现例如
    A a=new B();
    这句话到底有多大意义?(当然我知道这是多态)
    仔细想想,我们会在什么情况下运用到这种表达式的?几乎没有吧,我们几乎没有任何地方要运用到这种表达式。
    如果一个客户应用要用到B实例的情况下还需要用new来自己建立这个实例的话,那么再用父类去指向它的这种方式似乎是完全必要的。而且后面还可能造成不得不强转它来损耗性能。
    个人觉得如果要用到这种多态的形势,很大程度上必须把类的运用者和建立者隔离。利用类建造者来为类运用者生成实例的方式。而且个人也觉得这种表达式似乎也不太容易让人理解多态和它的意义的。
      

  4.   

    B implements A
    A a = new B()
    如果都没意义的话,那那些容器都是怎么实现的?
      

  5.   

    >to spiniper
    假设你有10个类实现这一个接口,而你需要在运行时动态的调用其中某个类的具体方法时,就有用了.
      

  6.   

    spiniper() ( ) 
    你的说法完全不对
    你的考虑完全是基于明确的调用情况下才能这么做的
    并且,不考虑上层调用者的需要多态的意义在于能让不同层次的调用者忽略类的实际调用
    也就是virtual的效果另外,JAVA里转换的只是指针类型而已,并没有什么损耗性能
    记住JAVA都是类引用的..你并没有转换类的类型
      

  7.   

    Vector v=new Vector();
    v.addElement(new JButton("haha"));
    JFrame jf=new JFrame();
    jf.getContentPane().add((JButton) v.elementAt(0)); //知道为什么要强转了吧.
      

  8.   

    我想说的是,A是某接口,B是某类实现A接口。如果程序中出现例如
    A a=new B();
    这句话到底有多大意义?(当然我知道这是多态)
    仔细想想,我们会在什么情况下运用到这种表达式的?几乎没有吧,我们几乎没有任何地方要运用到这种表达式。
    如果一个客户应用要用到B实例的情况下还需要用new来自己建立这个实例的话,那么再用父类去指向它的这种方式似乎是完全必要的。而且后面还可能造成不得不强转它来损耗性能。
    个人觉得如果要用到这种多态的形势,很大程度上必须把类的运用者和建立者隔离。利用类建造者来为类运用者生成实例的方式。而且个人也觉得这种表达式似乎也不太容易让人理解多态和它的意义的。
    *****************************************
    我说一个吧
    请看各种过滤器
    public class AAFilter implements Filter {

            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    这回你应该明白了吧
    Filter 是个接口,也可以说是个标准,你要写的话必须得实现他的方法XXXX等等,容器比如Tomcat等会去自动调用它的这些方法。
    在这里,doFilter方法中,FilterChain 也是个接口,而不是一个类。filterChain从哪来的呢?当然是容器啦....
    好像说得不太清楚哈,意会容易,言传难。
      

  9.   

    重点在于,FilterChain 是个接口类型哦
      

  10.   

    晕,越解释越迷糊....
    试验如下代码:
    public class Base
    {
    int i = 99; public void m1()
    {
    System.out.println("Base:m1()");
    }
    }
    public class RType extends Base
    {
    int i = -1;
    public void m1(){
    System.out.println("RType:m1()");
    }
    public static void main(String[] args)
    {
    Base b = new RType();
    b.m1();
    System.out.println(b.i);
    RType bb = new RType();
    bb.m1();
    System.out.println(bb.i);
    }
    }
    刚刚翻了翻SCJP的考试指南,找到的这个...也就是说
    A a=new B();
    调用属性的时候,是引用类型的属性,也就是A的以上可能是原因之一,我不记得老师是怎么说得了...
      

  11.   

    研究下java多态,建议看java编程思想。
      

  12.   

    首先~ 一个接口不能直接实力话一个对象!
    所以他用 A a = new X(); 目的是 实力话个X类的对象 然后把这个对象的复给接口类型变量a
    这样a就有了内存空间!
    你问:“为什么要强制转化” 因为你new 的是X类的值然后赋给的是接口类型A的变量小a,
    所以要X x1 = (X)a;如果值的类型不一样的话是不能用“=”号运算的!所以必须要转换!
    建议你看看JVM内存那