❶ java多态问题。
其实多态很简单的,不要把它理解的过难。
每个Java程序的引用变量(你这个里面引用变量就是a),都有编译类型和运行类型。编译就是将 .java文件编译成 .class文件,而运行就是 .class文件在操作系统上运行。
那么,这个时候,就出现多态了,一个类,他在编译时期和运行时期相同的动作却出现了不同的结果。Animal a = new Cat(); 如你的这个,a在编译的时候,只能调用Animal里面的方法和属性,而不能调用Cat的方法和属性。
要注意的是,这样写Animal a = new Cat(); 后面的Cat必须继承Animal类,为了出现多态,Cat类中必须重写Animal的方法。所谓重写,就是要有和父类Animal中有一模一样的方法。
编译的时候,a调用的是自己的方法,我们可以预测结果,但是运行的时候,却出现了不同的结果,因为他这个时候调用的是Cat的方法,这就是多态。
多态呢,很简单,面向对象吗,动物是总类,他又自己特定方法,继承与他的其他动物也有这个特定方法,但是他们方法结果不一样的。
多态,也仅仅是指类的方法,与属性没有任何关系。
Animal a = new Cat(); a这个引用变量指向了Cat这个对象。
优点是:统一化
❷ Java程序如图,多态,为什么编译不通过f.function这里为什么不能
子类可以调用父类不受保护的方法,但是当子类转换成父类时候,父类不能调用子类的方法。类型转换,这种转换在java中是自动实现的
❸ java 多态,变量不能被重写,为什么
多态中的方法是可以重写的,但是变量不能重写,你运行一下这个看看结果就知道了,父类声明,子类实例化,用这个对象去调方法是子类的方法,但是去调属性,就是父类的了。
public class A {
public String a="a";
public void A(){
System.out.println("我是A类中的A方法");
}
}
public class B extends A {
public String a="b";
public void A(){
System.out.println("我是B类中的A方法");
}
public static void main(String[] args) {
A b = new B();
b.A();
System.out.println(b.a);
}
}
结果:
我是B类中的A方法
a
❹ java习题,多态的用法,这段代码无法输出结果,谁能帮我找出错误!
你的 Test 类应该这样写:
publicclassTest{
publicstaticvoidmain(String[]args){
//Operationop=newOperation(10.0,20.0);
Operationo;
o=newOpeartionAdd(10.0,20.0);
o.getResult();
o=newOpeartionCha(10.0,20.0);
o.getResult();
}
}
你的OpeartionCha类中的getResult 方法如果是希望它是覆盖父类的 getResult 方法的话,那么OpeartionCha类中的getResult 方法和父类的 getResult 方法应该参数声明是一致的,即OpeartionCha类中的getResult 方法 也应该是无参的才对。所以OpeartionCha类 应该是这样:
{
publicOpeartionCha(){
}
publicOpeartionCha(doublenum1,doublenum2){
super(num1,num2);
}
@Override
publicvoidgetResult(){
doublecha=(super.getNum1()-super.getNum2());
System.out.println(cha);
}
}
建议写代码的时候如果是覆写方法,把 @Override 加上,这样如果覆写有误,编译阶段就可以给出提醒。
❺ C++中,我的多态,为什么不成功呢编译运行后选哪个结果都是一样的~
因为你的Mammal类里面speak函数定义的是非const的,而继承类中是const的,这样多态机制是无法识别的,把speak后面也加上const就可以了
❻ C++多态的一个练习,基类是CAccount,CSavings,CChecking分别为子类,编译老是提示:error C2143:
你的想法是没有问题的,将Withdrawal()函数作为虚函数,然后派生类里实现,在实际调用时会根据实际类型调用相应函数实现,我在自己机器上简单的把你的程序模拟了一遍是没有问题的,你看看是不是其他函数的问题。
class CAccount
{
public:
CAccount(){}
~CAccount(){}
virtual void Withdrawal()=0; //取款
};
class CSavings:public CAccount
{
public:
CSavings(){}
~CSavings(){}
void Withdrawal();
};
class CChecking:public CAccount
{
public:
CChecking(){}
~CChecking(){}
void Withdrawal();
};
void CSavings::Withdrawal()
{
cout << "CSavings Withdrawal" << endl;
}
void CChecking::Withdrawal()
{
cout << "CChecking Withdrawal" << endl;
}
void fn(CAccount* account)
{
account->Withdrawal();
}
int main()
{
CSavings saving;
CChecking cheching;
fn(&saving);
fn(&cheching);
return 1;
}
输出是:
CSavings Withdrawal
CChecking Withdrawal