如何理解java中重写,重载与多态(整理)
2013-07-21 22:25
309 查看
OVERRIDE(重写)
OVERRIDE(只体现在具有继承关系)是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类是,重新实现父类中的方法。
规则:
1.重写方法的参数列表必须完全与被重写的方法相同
2.重写方法修饰符必须大于呗重写方法的访问修饰符(PUBLIC>PROTECTED>DEFAULT>PRIVATE)
3.重写方法的返回值和被重写方法的返回值必须一致
4.重写方法所抛出的异常必须与被重写方法抛出的异常一致,或为其子类
5.被重写方法不能为PRIVATE,否则只是在子类中重新定义一个新的方法。
且父类中,被重写的方法一旦被FINAL, 无论为public,protected或default修饰,子类均不能重写。否则报错
例子
OVERLOAD(重载)
OVERLOAD一般用于在一个类内实现若干重载的方法,这些方法名称相同而参数形式不同
规则:
1.在使用重载是只能通过相同的方法名,不同的参数形式实现。不同的参数类型,或不同的参数个数,或不同的参数顺序
2.可以有不同类型的返回类型,也可相同
3.可以抛出不同的异常
4.可以有不同的访问修饰符
5.不能通过防卫权限,返回类型,跑出异常的不同来进行重载
例子
POLYMORPHISM(多态)
1,接口和实现并覆盖接口的统一方法的几个不同类的体现
2,父类和继承父类中同一方法的几个不同子类的实现
多态性:发送消息给某个对象,让该对象自行决定相应何种行为。通过子类对象引用 赋值给 超类对象引用变量 来实现动态方法的调用
当超类对象引用变量引用子类对象是,被引用对象的类型(而不是引用变量的类型)决定调用谁的成员方法,但这个被调用的方法,必须是在超类
中定义过的,也就是说被子类覆盖的方法。
使用父类类型的引用指向子类的对象(比如 Animal a = new Cat(); ),该引用只能调用父类中定义的方法和变量,若子类中重写了父类中的一个方法,
那么在调用这个方法是,会调用子类的这个方法
如
上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。
重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。
而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。 那么该程序将会打印出什么样的结果呢?
很显然,应该是“CCC”。
都调用了相同的方法,出现了不同的结果!这就是多态的表现!
OVERRIDE(只体现在具有继承关系)是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类是,重新实现父类中的方法。
规则:
1.重写方法的参数列表必须完全与被重写的方法相同
2.重写方法修饰符必须大于呗重写方法的访问修饰符(PUBLIC>PROTECTED>DEFAULT>PRIVATE)
3.重写方法的返回值和被重写方法的返回值必须一致
4.重写方法所抛出的异常必须与被重写方法抛出的异常一致,或为其子类
5.被重写方法不能为PRIVATE,否则只是在子类中重新定义一个新的方法。
且父类中,被重写的方法一旦被FINAL, 无论为public,protected或default修饰,子类均不能重写。否则报错
例子
public class Father{ public void speak(){ System.out.println("FATHER"); } } public class Son extends Father{ public void speak(){ System.out.println("SON"); } }
OVERLOAD(重载)
OVERLOAD一般用于在一个类内实现若干重载的方法,这些方法名称相同而参数形式不同
规则:
1.在使用重载是只能通过相同的方法名,不同的参数形式实现。不同的参数类型,或不同的参数个数,或不同的参数顺序
2.可以有不同类型的返回类型,也可相同
3.可以抛出不同的异常
4.可以有不同的访问修饰符
5.不能通过防卫权限,返回类型,跑出异常的不同来进行重载
例子
public class Overloading { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2"); } //以下两个参数类型顺序不同 public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading o = new Overloading(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"test3")); System.out.println(o.test("test4",1)); }
}
POLYMORPHISM(多态)
1,接口和实现并覆盖接口的统一方法的几个不同类的体现
2,父类和继承父类中同一方法的几个不同子类的实现
多态性:发送消息给某个对象,让该对象自行决定相应何种行为。通过子类对象引用 赋值给 超类对象引用变量 来实现动态方法的调用
当超类对象引用变量引用子类对象是,被引用对象的类型(而不是引用变量的类型)决定调用谁的成员方法,但这个被调用的方法,必须是在超类
中定义过的,也就是说被子类覆盖的方法。
使用父类类型的引用指向子类的对象(比如 Animal a = new Cat(); ),该引用只能调用父类中定义的方法和变量,若子类中重写了父类中的一个方法,
那么在调用这个方法是,会调用子类的这个方法
如
class Father{ public void func1(){ func2(); } //这是父类中的func2()方法,因为下面的子类中重写了该方法 //所以在父类类型的引用中调用时,这个方法将不再有效 //取而代之的是将调用子类中重写的func2()方法 public void func2(){ System.out.println("AAA"); } } class Child extends Father{ //func1(int i)是对func1()方法的一个重载 //由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用 //所以在下面的main方法中child.func1(68)是不对的 public void func1(int i){ System.out.println("BBB"); } //func2()重写了父类Father中的func2()方法 //如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法 public void func2(){ System.out.println("CCC"); } } public class PolymorphismTest { public static void main(String[] args) { Father child = new Child(); child.func1();//打印结果将会是什么? } }
上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。
重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。
而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。 那么该程序将会打印出什么样的结果呢?
很显然,应该是“CCC”。
//父类 public class Father{ //父类有一个打孩子方法 public void hitChild(){ } } //子类1 public class Son1 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("为什么打我?我做错什么了!"); } } //子类2 public class Son2 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我知道错了,别打了!"); } } //子类3 public class Son3 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我跑,你打不着!"); } } //测试类 public class Test{ public static void main(String args[]){ Father father; father = new Son1(); father.hitChild(); father = new Son2(); father.hitChild(); father = new Son3(); father.hitChild(); } }
都调用了相同的方法,出现了不同的结果!这就是多态的表现!
相关文章推荐
- JAVA面试题解惑系列(九)——继承、多态、重载和重写
- Java多态:重写和重载
- JAVA面试题解惑系列(九)——继承、多态、重载和重写
- JAVA面试题解惑系列(九)――继承、多态、重载和重写
- 1.为什么需要继承?如何继承?继承到什么? 2.方法的重载与重写的区别 3.类型的自动转换和强制转换 4.子类特有的方法的调用规则 5.子类重写的方法的调用规则 6.多态的理解 7.面向对象的三大特征
- JAVA【类】析构器、重载与继承、方法的重写、自动转型、多态、方法与类的分类、接口继承
- [Java]重载,重写以及继承,多态的区别
- 多态,重写,重载的简单理解
- java中重载与重写的区别以及与多态的关系
- 我理解的Java中重载与重写
- java的多态以及重载,重写,前期绑定,后期绑定
- Java中重载和重写,多态几个概念之间的区别
- 这几天学习java里面的子类父类继承接口重载重写。学的好吃力。我得想办法赶紧理解理解!
- Java多态:重载和重写
- 【Java】重写、重载、多态、继承
- java中final的理解和java方法中的重载和重写
- JAVA面试题解惑系列(九)——继承、多态、重载和重写
- JAVA——继承、多态、重载和重写
- java 重写、重载以及多态
- 多态,重载,重写的理解