Java中的方法覆盖

如何在Java中实现方法重写? 在C ++中我们有vtable的概念..这是如何在Java内部实现的?

要回答这个问题,特别是在虚拟机中如何实现覆盖,可以在Java虚拟机编程 (Google Books链接)中进行编写。

VM将在引用的类中查找适当的方法定义,然后通过inheritance堆栈向上工作。 显然,在某些阶段,将适用各种优化措施。

有关相关字节码指令invokevirtual的说明,请参见此处 :

invokevirtual查看给定的描述符,并确定该方法采用的参数数量(这可能为零)。 它将这些参数从操作数堆栈中弹出。 接下来,它将objectref从堆栈中弹出。 objectref是对正在调用其方法的对象的引用。 invokevirtual检索objectref的Java类,并搜索该类定义的方法列表,然后查找其超类,查找名为methodname的方法,其描述符为描述符。

正如gustafc在下面强调的那样,可以应用各种优化,毫无疑问,JIT将进一步引入。

也许这种C ++ Vtables和Java方法调用表的比较很有意义。

方法重写它意味着一个方法在supper类中可用,它显示一些字符串,但是你想要扩展这个类,并且你想要打印自己的方法,那时你需要将这个方法重写到你的本地类中。
这是压倒一切的基本介绍。

 eg. class Animal { public void displayMessage() { System.out.println("Animal is eating"); } } class Dog extends Animal { public void displayMessage() { System.out.println("Dog is eating"); } public static void main(String arg[]) { Dog d=new Dpg(); d.displayMessage(); } } 

OUTPUT:

狗在咆哮

方法覆盖的优点是类ca为inheritance的方法提供自己的特定实现,而不修改父类方法。

方法覆盖规则是。

参数列表 :参数列表必须相同。
访问修饰符 :如果覆盖该方法,则必须提供相同的超类方法修饰符,假设超类具有公共方法,则不能提供受保护的或私有的….等等

Java中的方法覆盖是基于多态OOPS概念的概念,它允许程序员在接口上创建具有相同名称和方法签名的两个方法,并且在运行时根据运行时对象的类型调用其各种实现和实际方法。 方法覆盖允许您使用Java编写灵活且可扩展的代码,因为您可以通过最少的代码更改来引入新function。

在覆盖Java中的任何方法时,需要遵循的规则很少,不遵循这些规则会导致Java中的编译时错误。

  1. 关于Java中方法重写的第一个也是最重要的规则是你只能覆盖子类中的方法。 您不能覆盖同一类中的方法。
  2. Java中方法覆盖的第二个重要规则是,在Super class和Sub类或接口及其实现中,方法的名称和签名必须相同。
  3. 在Java中覆盖方法的第三个规则是覆盖方法不能减少Java中重写方法的可访问性。 例如,如果重写方法是公共的,则重写方法不能被保护,私有或包私有; 但相反的是,真正的重写方法可以增加Java中方法的可访问性,即如果被覆盖的方法受到保护,则覆盖方法可以被保护或公开。
  4. 在Java中另一个值得注意的方法覆盖规则是覆盖方法不能抛出格式化的exception,它在层次结构中比重写方法更高。 这意味着如果重写方法抛出IOException而不是重写方法,则不能在其throws子句中抛出java.lang.Exception,因为java.lang.Exception高于exception层次结构中的IOException。 此规则不适用于Java中的RuntimeException,甚至不需要在Java中的throws子句中声明。
  5. 您不能在Java中覆盖private,static和final方法。 私有和静态方法在编译期间使用Java中的静态绑定进行绑定,并且在运行时不会解析。 在Java中重写final方法是编译时错误。 虽然如果在子类中声明另一个具有相同和签名的方法,则可以隐藏私有和静态方法。
  6. 在运行时基于Object的类型在Java中使用动态绑定调用重写方法。
  7. 如果要扩展抽象类或实现接口,则需要覆盖所有抽象方法,除非您的类不是抽象的。 abstract方法只能通过使用方法覆盖来使用。
  8. 在覆盖Java中的方法时始终使用@Override注释。 虽然这不是规则,但它是最好的Java编码实践之一。 从Java 6开始,您也可以在从接口inheritance的方法上使用@Override注释。
 --Defining the same method with the same method signature(ie same number/type of arguments and same return type/s.)in base and derived class. --Which method is to be called is decided at runtime so, it is also called runtime polymorphism/late binding. --we should override the method defined in the superclass. --when the method is called the method defined in the subclass is called and executed instead of the one in superclass. --we overcome this by use of 'super' keyword. //program class A { void disp(){ System.out.println("class A"); } } class B extends A { public void disp(){ System.out.println("class B"); } } public class ExampleIdea{ public static void main(String[] args){ B o=new B(); o.disp(); } }//end of program when we run this output will be class B. In order to access the function of class A we have to use super keyword as: class B extends A { public void disp(){ System.out.println("class B"); super.disp(); } 

只要您希望覆盖的函数(方法)没有标记为final您只需通过扩展保存该方法的类来覆盖该方法,然后提供具有相同签名但不同主体的方法。