java中覆盖和重定义的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中覆盖和重定义的区别相关的知识,希望对你有一定的参考价值。

一开始我认为这两个东西是一样的 可是看书看到一段话

Finally remember that static methods can not be overridden!This does not mean they can not be redefined in a subclass,but redefining and overriding are not the same thing

这段话 我理解为 重定义 和 覆盖 不是一样的 至少在static methods 的继承上面

求人解释 谢谢

  准确的术语应该是重写(覆盖)和重载(自定义)。它们的区别如下:

  重写:
1、父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法 与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

2、 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

3、子类函数的访问修饰权限不能少于父类的;

  
重载:
1、方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。

2、Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。

3、重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
参考技术A 最后要记住,静态方法不能被覆盖!这不意味着他不能被重定义在子类,但是重定义和覆盖不是一回事。
不知道你从哪弄来这段话,我理解是静态方法是类的方法,不需要继承就能访问它。而覆盖说的是子类继承父类而且这是必须的。但是你可以在子类里面重新定义这个静态方法。我认为这段话是在概念上区分它们两个的,实际上相差不大。本回答被提问者采纳
参考技术B 这段话是这么说的:
最后记住,静态方法不能被覆盖!这并不意味着它们不能在子类中重新定义,而是重新定义和压倒一切的是不一样的事

静态方法不能被覆盖!对于这句话看代码
public class Test extends T

void f(int ) //! 这里不能这么写,就是无法覆盖静态的方法
System.out.println("子类f()");


public static void main(String args[])
Test t = new Test();
t.f(10);




class T

static void f()
System.out.println("父类f()");


不意味着不能在子类中重新定义:这句话看代码
public class Test extends T

static void f() // 就是不意味着不能在子类中重新定义
System.out.println("子类f()");


public static void main(String args[])
Test t = new Test();




class T

static void f()
System.out.println("父类f()");


但这里是相当于在子类中重新定义了一个f()方法和父类中的f()方法十分属于两个方法,他们两个是没有任何关系的,不存在多态的问题
-----------
这段话就是这个意思,不知道你明白了没有
参考技术C 这个问题我一开始和不是很明白,问了老师才知道的:
重定义就是方法的重载,方法重载是面向对象语言多态性的一种形式.必须遵循两个原则:
1.方法的参数表必须不同,包括参数d类型和个数,以此区分不同的方法体
2.方法的返回类型\修饰符可以相同,也可以不同.
例如:
public void println() //参数为空
public void println(Boolean x) //参数逻辑型
public void println(char x) //参数字符型
public void println(int x) //参数整形
public void println(String x) //字符串
覆盖的话,
一般在继存中,子类覆盖父类的方法;参数.返回类型都一样,就是出现覆盖!
参考技术D class A

public void methodA()
System.out.println("methodA class A");


public void methodB()
System.out.println("methodB in class A");



class B extends A

public void methodA()
System.out.println("methodA in class B, 覆盖 class A 中的 methodA");


public void methodB(String msg)
System.out.println("重载class A中的methodB");

以上是关于java中覆盖和重定义的区别的主要内容,如果未能解决你的问题,请参考以下文章

web开发中请求转发和重定向的区别

java中转发和重定向的区别

java手记------------------------java中转发和重定向区别

运维管道和重定向语法

java web开发中的转发和重定向问题的理解,要的是理解

类成员函数中重载/重写(覆盖)/重定义(隐藏)的区别