小弟刚从C++转java,有个问题不明白,下面代码为什么调用了A::print?A和B中的print函数是重载关系?import java.io.*;
import java.util.*;public class class1{
public static void main(String[] args)throws Exception{
B b=new B();
b.print(5);
}
}class A{
public void print(int i){
System.out.println("A::print(int i)");
}
}class B extends A{
public void print(double i){
System.out.println("B::print(double i)");
}
}附上类似的C++代码,结果和java不一样。#include<iostream>
using namespace std;class A{
public:
void print(int i){
cout<<"A::print(int i)"<<endl;;
}
};class B :public A{
public:
void print(double i){
cout<<"B::print(double i)"<<endl;
}
};int main(){
B* pb = new B();
pb->print(5);//class B的print将class A的print隐藏起来
}
import java.util.*;public class class1{
public static void main(String[] args)throws Exception{
B b=new B();
b.print(5);
}
}class A{
public void print(int i){
System.out.println("A::print(int i)");
}
}class B extends A{
public void print(double i){
System.out.println("B::print(double i)");
}
}附上类似的C++代码,结果和java不一样。#include<iostream>
using namespace std;class A{
public:
void print(int i){
cout<<"A::print(int i)"<<endl;;
}
};class B :public A{
public:
void print(double i){
cout<<"B::print(double i)"<<endl;
}
};int main(){
B* pb = new B();
pb->print(5);//class B的print将class A的print隐藏起来
}
方法名一样, 参数类型或者个数不一样, 叫做方法重载;
方法名一样,类型个数类型都一样,叫做方法覆盖或者叫做重写.java例中, 传入的参数是5 ,是整型, 所以会调用print(int) 这个方法
1)函数名一样,参数不同
2)在同一个域中
比如我例子中C++里的两个print函数一个在class A域,一个在 class B域,所以在C++里就不是重载。在java里,这样也算重载?
pb->A::print(5);
覆蓋 overriding
還有hiding和obscuring但感覺本質差不多,只是適用對象有些區別,c++中的所謂隱藏它的條件貌似更寬鬆,只要方法同名即可達成,返回類型可能也要求的
2.overriding 指实例方法的覆盖,运行时可发生多态
3.hiding 指静态方法的覆盖,无多态
4.obscuring 是自定义变量名与系统中已存在类型重叠时
C++中函数重载必定要求在同一个域中(java没有此要求?)
關鍵我覺得理解重載是什麽,這個我想不管是c++還是java應該是大同小異的
允許同名不同參數列表的方法在同一個域中同時存在,是這種概念吧?
这个问题涉及到两个子问题:
(1)java中“函数重载”
(2)C++中“函数重载”
其中(1)我很明白,(2)莫名其妙。
这个问题涉及到两个子问题:
(1)java中“函数重载”
(2)C++中“函数重载”
其中(2)我很明白,(1)莫名其妙。
import java.util.*;public class class1{
public static void main(String[] args)throws Exception{
B b=new B();
b.print(5);
}
}class A{
public void print(int i){
System.out.println("A::print(int i)");
}
}class B extends A{
public void print(double i){
System.out.println("B::print(double i)");
}
}
注意了。A中的方法是print(int i),B中的方法是print(double i) 参数不一样不是重载。
你在main函数中调用b.print(5),你传入的是int参数,所以调用A中的函数,如果改成b.print(5.0)那么参数就是double类型了,这时就调用B中的函数。
覆盖 : 利用了虚函数表来完全取代从父类那里继承过来的虚函数 即把虚函数表中的父类得函数指针替换成子类中用来完成覆盖的新的同名函数指针 且无论子类函数是否指定virtual 子类中的用来覆盖的函数都被处理成虚函数。即利用虚函数表事先多态
隐藏: 子类中的和父类中的同名函数 因为子类中函数重新编写隐藏掉了父类得函数。类似于重载 覆盖要函数名 返回值 参数类型 参数个数完全相同 、 隐藏 只要求函数名相同即可
覆盖用来实现多态 而隐藏 一般是用来重载 实现函数的多元化功能
同名成员会把基类的给覆盖掉。要使用基类的话格式是obj.Base::f()动态编联
函数名 参数列表 返回值完全一样。基类有virturl。