比如说:
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;
}
}
------解决方案--------------------
达内学员?没好好听课吧...
//强转,问为什么这样定义?为什么不直接定义为:X x1=new X();
可以直接定义吧,
有些时候这样写比较方便
具体的我也不清楚,什么多态,继承,好像挺复杂
反正a.m2()不行
希望达人解答
------解决方案--------------------
多态必然伴随着转型,向上转型是自动的,向下转型需要强制转型,也就是(X)a这种形式
------解决方案--------------------
对~~~~~对 up
------解决方案--------------------
这样可以提高系统的松耦合性
------解决方案--------------------
类型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();
就变成对两个对象的操作了
------解决方案--------------------
我想说的是,A是某接口,B是某类实现A接口。如果程序中出现例如
A a=new B();
这句话到底有多大意义?(当然我知道这是多态)
仔细想想,我们会在什么情况下运用到这种表达式的?几乎没有吧,我们几乎没有任何地方要运用到这种表达式。
如果一个客户应用要用到B实例的情况下还需要用new来自己建立这个实例的话,那么再用父类去指向它的这种方式似乎是完全必要的。而且后面还可能造成不得不强转它来损耗性能。
个人觉得如果要用到这种多态的形势,很大程度上必须把类的运用者和建立者隔离。利用类建造者来为类运用者生成实例的方式。而且个人也觉得这种表达式似乎也不太容易让人理解多态和它的意义的。
------解决方案--------------------
> to spiniper
假设你有10个类实现这一个接口,而你需要在运行时动态的调用其中某个类的具体方法时,就有用了.
------解决方案--------------------
spiniper() ( )
你的说法完全不对
你的考虑完全是基于明确的调用情况下才能这么做的
并且,不考虑上层调用者的需要
多态的意义在于能让不同层次的调用者忽略类的实际调用
也就是virtual的效果
另外,JAVA里转换的只是指针类型而已,并没有什么损耗性能
记住JAVA都是类引用的..你并没有转换类的类型
------解决方案--------------------
Vector v=new Vector();
v.addElement(new JButton( "haha "));
JFrame jf=new JFrame();
jf.getContentPane().add((JButton) v.elementAt(0)); //知道为什么要强转了吧.
------解决方案--------------------
学习........
------解决方案--------------------
学习........
------解决方案--------------------
我知道有用
但是也不太清楚真实的作用
我知道向上转换是自动
向下是强制的
但是我还是不太清楚真实的作用
我只是觉得有的时候写的东西不匹配就强制转化
我想应该是实现程序的弱耦合性而设计的功能
------解决方案--------------------
研究下java多态,建议看java编程思想。
------解决方案--------------------
学习中...
------解决方案--------------------
首先~ 一个接口不能直接实力话一个对象!
所以他用 A a = new X(); 目的是 实力话个X类的对象 然后把这个对象的复给接口类型变量a
这样a就有了内存空间!
你问:“为什么要强制转化” 因为你new 的是X类的值然后赋给的是接口类型A的变量小a,
所以要X x1 = (X)a;如果值的类型不一样的话是不能用“=”号运算的!所以必须要转换!
建议你看看JVM内存那