java方法重载和覆盖、子类与父类的转换
2012-02-15 10:27
393 查看
Base------------------------------------------ package chapter6; public class Base { public int publicVarOfBase = 1; protected int protectedVarOfBase = 1; int defaultVarOfBase = 1; // private int privateVarOfBase = 1; public void publicMethodOfBase() { System.out.println("publicMethodOfBase()"); } protected void protectedMethodOfBase() { System.out.println("protectedMethodOfBase()"); } void defaultMethodOfBase() { System.out.println("defaultMethodOfBase()"); } /* * private void privateMethodOfBase() { privateVarOfBase = 2; * System.out.println("privateMethodOfBase()"); } */ } Sub------------------------------------------ package chapter6; public class Sub extends Base { public static void main(String[] args) { Sub sub = new Sub(); System.out.println(sub.publicVarOfBase); System.out.println(sub.protectedVarOfBase); System.out.println(sub.defaultVarOfBase); sub.publicMethodOfBase(); sub.protectedMethodOfBase(); sub.defaultMethodOfBase(); } } ------------------------------------------------- 对于方法重载来说,关键就是参数的类型、参数的个数、参数的顺序至少有一项不相同。至于修饰符(private/protected/public/abstract/final/static),返回类型都无所谓。 ------------------------------------------------ 怎样才算是一个方法覆盖: 1 首先要保证方法名、参数类型、参数个数、参数顺序完全一样 2 返回类型也必须要一致 3 子类方法不能缩小父类方法的访问权限比如不能由public变成private了如果可以的话请看下面一段代码会出现什么问题 package chapter6; class Base { public void method() { System.out.println("Base"); } } public class Sub extends Base { private void method() { System.out.println("Sub"); } public static void main(String[] args) { Base sub = new Sub(); sub.method(); } } 4 子类方法不能抛出比父类方法更多的异常,只能够相同,或者是父类方法抛出的异常类的子类。 因为如果可以的话,就会与Java语言的多态机制发生冲突,比如: package chapter6; import java.io.IOException; class Base { protected void method() throws ExceptionSub1 { System.out.println("Base"); throw new ExceptionSub1(); } } public class Sub extends Base { public void method() throws ExceptionBase { System.out.println("Sub"); throw new ExceptionBase(); } public static void main(String[] args) { Base sub = new Sub(); try { sub.method(); } catch (ExceptionSub1 ex) { System.out.println("ok!"); } } } 不过这句话也不全对看下面一个实例: package chapter6; class Base { protected void method() throws IndexOutOfBoundsException { System.out.println("Base"); } } public class Sub extends Base { public void method() throws RuntimeException { System.out.println("Sub"); } public static void main(String[] args) { Base sub = new Sub(); try { sub.method(); } catch (Exception ex) { } } } 可是IndexOutOfBoundsException却是RuntimeException的子类!要抛出的是java.lang.RuntimeException就无所谓了,因为运行时异常可以不用做检查。 5 父类的static方法不能被子类覆盖为非static方法 子类可以定义static方法覆盖父类的static方法 子类不可以定义static方法覆盖父类的非static方法 6 子类方法覆盖父类方法的前提是,子类必须能够继承父类的特定方法 class Base { private void method() throws ExceptionBase { System.out.println("Base"); } } public class Sub extends Base { public void method() throws ExceptionSub1 { System.out.println("Sub"); } public static void main(String[] args) { Sub sub = new Sub(); try { sub.method(); } catch (ExceptionBase ex) { ex.printStackTrace(); } } } 因此Base的method()方法和Sub的method()方法没有覆盖关系!再看 class Base { private String showMe(){ return "Base"; } public void print(){ System.out.println(showMe()); } } public class Sub extends Base { public String showMe(){ return "Sub"; } public static void main(String[] args) { Sub sub = new Sub(); sub.print(); } } 执行的结果将是"Base" 这是因为print()方法在Base类中定义,因此print()方法会调用在Base类中定义的private类型的showMe()方法。如果把private改为其它,将会打印"Sub",因为这个时候有方法覆盖! 7 父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。 abstract class Base { abstract void method1(); abstract void method2(); } public abstract class Sub extends Base { void method1() { } abstract void method2(); } 父类的非抽象方法可以被覆盖为抽象方法! abstract class Base { void method1(){System.out.println("method1");}; abstract void method2(); } public abstract class Sub extends Base { abstract void method1(); void method2(){System.out.println("method2");}; public static void main(String[] args) { Sub sub = new End(); sub.method1(); } } class End extends Sub { void method1(){ System.out.println("end-method1"); } } 结果将为"end-method1" 子类与父类的转换 class base { public void print() { System.out.println("base"); } public void doprint() { print(); } } class testVirtual extends base{ public void print() { System.out.println("derive"); } public static void main(String args[]) { base c = new base(); System.out.println(c); c.doprint();//fu testVirtual b = new testVirtual(); System.out.println(b); b.doprint(); c = (base)b; //zi->fu System.out.println(c); c.doprint();//diaoyong zi b = (testVirtual)c;//fu->zi,父类转换为了子类 System.out.println(b); b.doprint();//diaoyong zi } } |
相关文章推荐
- Java学习笔记47. 子类中对父类方法的覆盖
- Java子类与父类方法的隐藏和覆盖
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- JAVA面试题:子类无法覆盖父类中的方法
- Java 子类继承父类方法的重写(或者覆盖,override)
- 在Java中子类能否重载父类的构造方法?
- (java)父类的静态方法为子类覆盖后,丢失多态性的问题
- java基础学习之——子类重写(覆盖)父类的方法必须满足的条件
- 从父类构造器调用子类覆盖方法看Java初始化过程
- Java关于子类对父类私有方法覆盖的问题
- JAVA基础:子类、父类继承关系 静态块、非静态块、构造函数初始化顺序性、静态非静态方法覆盖
- java中父类有static修饰的方法其子类能继承吗?若子类也有该方法,是覆盖还是重写?
- java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)
- java 子类可以继承父类中的什么,子类中方法覆盖,final关键字的含义
- java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)
- 2018/01/07JAVA 基础 / 接口与继承:重写【子类继承并覆盖父类的对象方法】、隐藏【子类继承并覆盖父类的类方法】与实现类实现接口方法の区别
- java 用户自定义的父类转换成子类的方法
- Java多态中重载方法参数分别为父类和子类时的疑惑
- 有关java中子类覆盖父类的方法的返回值的问题
- java中子类覆盖父类方法所必须满足的条件