您的位置:首页 > 编程语言 > Java开发

Override and Overload in Java

2010-03-21 13:50 387 查看
面试可以让人重新点燃学习的热情,尽管目的性比较强,但是客观上的确学习到了东西。在一次面试中发现自己又搞混了override和overload。
class A { public void print (A a) { System.out.println("A"); } }
//this is overload, not override, override requires
//the same method signature (method name and parameters).
class AA extends A{ public void print (AA aa) { System.out.println("AA"); } }
public class Test{
public static void main(String[] args){
A a = new AA();
a.print((AA)a);          //output is "A", overload
a.print(a);                 //output is "A",  overload
AA a1 = (AA)a;
a1.print(a);               //output "A", overload
a1.print(a1);            //output "AA", overload
A a2 = new A();
//AA aa = a2;             //compile error, cannot convert from A to AA;
AA aa=(AA)a2;         //compile success; but throws ClassCastException in runtime
}
}


在Visitor设计模式中也是要特别注意overload和override的。很多人可能会写出如下的Visitor代码

package test.swing;
import java.util.ArrayList;
import java.util.List;
interface IVisitor{
void visit(Node node);
void visit(SimpleNode node);
void visit(ComplexNode node);
}
class VisitorImpl implements IVisitor{
@Override
public void visit(Node node) {
System.out.println("Node");
}
@Override
public void visit(SimpleNode node) {
System.out.println("SimpleNode");
}
@Override
public void visit(ComplexNode node) {
System.out.println("ComplexNode");
}

}
class Node{
public String name;
public String value;
public void accept(IVisitor visitor){
visitor.visit(this);
}
}
class SimpleNode extends Node{
public void accept(IVisitor visitor){
visitor.visit(this);
}
}
class ComplexNode extends Node{
public void accept(IVisitor visitor){
visitor.visit(this);
}
}
public class Test {
public static void main(String[] args) {
IVisitor visitor = new VisitorImpl();
List<Node> nodes = new ArrayList<Node>();
nodes.add(new Node());
nodes.add(new SimpleNode());
nodes.add(new ComplexNode());
for(Node node : nodes){
node.accept(visitor);
}
}
}


输出结果是“Node Node Node”,显然这不是你想要的。为什么会这样呢?这在于visitor.visit(this)这行代码,所谓的动态调用(override)指的是visitor会调用被override的方法,但是显然visitor提供了三个函数,分别对应Node, SimpleNode, ComplexNode三种参数。具体调用哪个呢?其实this指的是Node类型,所以调用的是Node对应的函数,结果输出都是“Node“。我们需要修改的就是按照Visitor模式中的方法,给每种Node都加上一个accept方法,使得this指向正确的类型。这也是Visitor模式被人诟病的一个地方。另一个讨厌的地方就是,增加一个Node子类,必须在Visitor中增加一个visit方法。据说Visitor模式刚进入中国的时候,没有几个人能懂。现在想来还是很容易理解的,因为要真正懂的现在也未必有很多人。不信你可以解释一下Visitor中的每个元素作用,尤其是看过书之后一年再来解释,如果还能够正确讲出来,说明你是理解了而不是背下来。

package test.swing;
import java.util.ArrayList;
import java.util.List;
interface IVisitor{
void visit(Node node);
void visit(SimpleNode node);
void visit(ComplexNode node);
}
class VisitorImpl implements IVisitor{
@Override
public void visit(Node node) {
System.out.println("Node");
}
@Override
public void visit(SimpleNode node) {
System.out.println("SimpleNode");
}
@Override
public void visit(ComplexNode node) {
System.out.println("ComplexNode");
}

}
class Node{
public String name;
public String value;
public void accept(IVisitor visitor){
visitor.visit(this);
}
}
class SimpleNode extends Node{
public void accept(IVisitor visitor){
visitor.visit(this);
}
}
class ComplexNode extends Node{
public void accept(IVisitor visitor){
visitor.visit(this);
}
}
public class Test {
public static void main(String[] args) {
IVisitor visitor = new VisitorImpl();
List<Node> nodes = new ArrayList<Node>();
nodes.add(new Node());
nodes.add(new SimpleNode());
nodes.add(new ComplexNode());
for(Node node : nodes){
node.accept(visitor<textarea name="code" class="java" cols="50" rows="15">package test.swing;
import java.util.ArrayList;
import java.util.List;
interface IVisitor{
void visit(Node node);
void visit(SimpleNode node);
void visit(ComplexNode node);
}
class VisitorImpl implements IVisitor{
@Override
public void visit(Node node) {
System.out.println("Node");
}
@Override
public void visit(SimpleNode node) {
System.out.println("SimpleNode");
}
@Override
public void visit(ComplexNode node) {
System.out.println("ComplexNode");
}

}
class Node{
public String name;
public String value;
public void accept(IVisitor visitor){
visitor.visit(this);
}
}
class SimpleNode extends Node{
//public void accept(IVisitor visitor){
// visitor.visit(this);
//}
}
class ComplexNode extends Node{
//public void accept(IVisitor visitor){
// visitor.visit(this);
//}
}
public class Test {
public static void main(String[] args) {
IVisitor visitor = new VisitorImpl();
List<Node> nodes = new ArrayList<Node>();
nodes.add(new Node());
nodes.add(new SimpleNode());
nodes.add(new ComplexNode());
for(Node node : nodes){
node.accept(visitor);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: