Override and Overload in Java
2010-03-21 13:50
387 查看
面试可以让人重新点燃学习的热情,尽管目的性比较强,但是客观上的确学习到了东西。在一次面试中发现自己又搞混了override和overload。
在Visitor设计模式中也是要特别注意overload和override的。很多人可能会写出如下的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);
}
}
}
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);
}
}
}
相关文章推荐
- Overload and Override without Overwrite - Java
- override the hashcode and equals method in java
- java override and overload
- Overload and override in c++
- java多态性override和overload的区别
- java中的Overload(重载)和Override(重写)的区别(二)
- Difference between Serializable and Externalizable in Java Serialization
- On Memory Leaks in Java and in Android.
- create log by common-logging and log4j in java project
- java学习笔记(八)—— extends and override
- is not abstract and does not override abstract method getIncludes() in org.apache.jasper.runtime.HttpJspBase 问题
- Difference between getmessage and getlocalizedmessage in exceptions Java?
- Java Development Environment in Linux: Install and Configure Oracle
- Java Override/Overload
- java中overload和override区别
- Difference between Vector and ArrayList in java?
- java 重载(overload)与重写(override)详解及实例
- Java中overload和override的区别
- leetcode-java-105. Construct Binary Tree from Preorder and Inorder Traversal
- XML, XSLT, Java, and JSP: A Case Study in Developing a Web Application