首页编程java编程java为什么要重写父类方法,...我重写为什么还要用SUPER继承父类的构造方法

java为什么要重写父类方法,...我重写为什么还要用SUPER继承父类的构造方法

编程之家2023-10-1386次浏览

各位老铁们,大家好,今天由我来为大家分享java为什么要重写父类方法,以及...我重写为什么还要用SUPER继承父类的构造方法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

java为什么要重写父类方法,...我重写为什么还要用SUPER继承父类的构造方法

...我重写为什么还要用SUPER继承父类的构造方法

super和this这两个关键字非常相像,我个人总结super有3种用法:

1.调用超类中被子类重载的方法,如果向下面的代码

class A

java为什么要重写父类方法,...我重写为什么还要用SUPER继承父类的构造方法

{

void func(){}

}

java为什么要重写父类方法,...我重写为什么还要用SUPER继承父类的构造方法

class B extends A

{

void func(){}

}

如果B想要调用A中的func方法怎么办?必须这样super.func()才可以。

2.调用跟子类中成员变量同名的超类成员变量。如 super.成员变量名。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。

3.调用超类的构造函数。例如在swing编程中我们经常这么做

class MyFrame extends JFrame

{

public MyFrame()

{

super("MY frame");//这个必须方法中的第一行,否则报错。

.........

}

}

super调用超类的构造函数时,必须放在方法中的第一行,谨记。

写了十几分钟,望采纳!

为什么重写了的就不会使父类方法强制执行

这种机制简单点说就是java就是这么做的,不要去想什么强制执行,就当规则记就好了。

规则:

编译时看引用类型,运行时多态。多态就是你看到的现象,这是java这门语言三大特点之一,封装,继承,多态。

解释下,编译时就是你写程序时,用的都是父类引用a,当你a.p()的时候这个时候只看你父类里面有没有p()这个方法,只要有java编译器就不找你麻烦。但是运行时的时候只看你new的那个是什么,你new的父类调用的就是父类的p(),你new的子类掉的就是子类的p()。这就是规则必须记住。

说点需要理解的,为什么要这么做,编程都是面向接口的,有些时候你关心的只是大的类型,具体什么类型产生什么行为那是运行时才有分别的,比如书上的例子经常是Animal会吃,你只要声明Animal的引用就可以了,Animal.eat()这个时候你只关心把东西吃掉。但是狗是嚼碎了吃,猫是添完再吃,这个你根本不用关心,程序运行的时候狗怎么吃,猫怎么吃自然就分开了。自己写例子吧

JAVA中子类重写父类的方法,怎么写,什么要求

1.父类的方法不能降级,同级的话就要覆盖,例如public方法不能在子类中被声明为protected或者private(子类重载除外),否则会有

Cannot reduce the visibility of the inherited method from Father的编译错误。

2.父类的方法可以任意升级,但升级只有两种方式,要么覆盖,要么重载,覆盖就是方法体完全一样,重载则是参数必须改变,方法名称不变。

importjava.lang.reflect.Method;

classFather{

inta;

protectedintb=5;

protectedvoidfuncpro(){

//父类的保护方法,子类能够访问,但子类自身没有

System.out.println("fatherfuncpro");

}

publicvoidfuncpub(){

//父类公有方法,子类直接继承

}

privatevoidfuncpri(){

//父类私有方法,子类不可见

}

}

publicclassTestOverideextendsFather{

/**

*@paramargs

*/

//父类保护方法的重写

//publicvoidfuncpro(){

////子类自己可以这样定义,将会覆盖父类protected方法

//System.out.println("子类的func方法");

//}

//protectedvoidfuncpro(){

////ok

//}

//publicshortfuncpro(){

////illegal父类的protected和public方法在子类中是可见的,试想一下,如果编译器认为这个方法体正确,

//那么子类调用funcpro的时候究竟调用哪个呢?这样没有能构成重载

//}

//privatevoidfuncpro(){

////illegal

//}

privatevoidfuncpro(inta){

//这是方法重载,不会报错

System.out.println("sunfuncpro");

}

//父类公有方法的重写

//privatevoidfuncpub(){

////illegal:CannotreducethevisibilityoftheinheritedmethodfromFather

//}

//protectedvoidfuncpub(){

////illegalCannotreducethevisibilityoftheinheritedmethodfromFather

//}

//publicvoidfuncpub(){

////ok

//}

//publicintfuncpub(){

////illegal和父类的返回值不匹配

//}

//publicintfuncpub(inti){

////ok子类构成重载

//return1;

//}

//父类私有方法的重写

//publicvoidfuncpri(){

////ok

//}

//protectedvoidfuncpri(){

////ok

//}

//privatevoidfuncpri(){

////ok

//}

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

TestOveridetestOveride=newTestOveride();

Classclass1=testOveride.getClass();

try{

Method[]methods=class1.getMethods();

System.out.println("子类中的所有方法:");//可以看到,并没有父类的funcpro方法

for(Methodm:methods){

System.out.println(m);

}

System.out.println("子类调用父类的protected方法:");

testOveride.funcpro();

System.out.println("子类调用自己的func方法:");

testOveride.funcpro(1);

System.out.println("子类调用父类的字段");

System.out.println(testOveride.b);

}catch(Exceptione){

e.printStackTrace();

}

}

}

java中为什么要使用继承

继承: 1,提高了代码的复用性。 2,类与类之间产生了关系,关系的出现,就是多态的由来。

java只支持单继承,不支持不多继承。原因:当出现多个类中有相同方法时,子类不确定调用的是哪一个。其实就是父类中的方法有方法体。但是java支持多层继承。在多层继承中,父类定义都是共性成员。所体现的内容: 1,父类是不断向上抽取而来的。 2,既然父类体现的共性内容,那么在使用一个继承体系时,只需要查阅最顶层父类即可了解该体系的基本功能。(查阅API技巧之一) 3,只要建立最子类的对象即可对该继承体系进行应用。

子父类的出现,子类因为持有一个父类引用super,可以获取到父类中非私有的成员。如同子类中也有一个份一样。

覆盖(复写)override.对于成员函数,当子父类中出现了一模一样的函数时,会出现一个覆盖操作。在运行时,会运行子类中的方法。覆盖注意: 1,子类覆盖父类方法,必须权限大于等于父类。 2,静态覆盖静态。 3,覆盖只发生在函数上。

什么时候使用覆盖呢?可以通过覆盖的形式对父类的功能进行重新定义。比如:对功能进行修改或者对功能进行升级。注意:不要在子类中定义新功能。还要以父类中的声明为主。

class Demo{

void show(){

System.out.println("Demo show");

}

}

main()

{//Demo d= new Demo();

SubDemo d= new SubDemo();

d.show();

}

二年后。为了提高可维护性。建立一个子类继承Demo,复写其中的某些需要修改的功能即可。

class SubDemo extends Demo{

void show(){

System.out.println("subdemo show");

}

}

super关键字:代表的父类应用。super的应用和this的使用完全一样。

子类的实例化过程:子类中所有的构造函数回去访问父类中的空参数构造函数。那是因为:每一个子类构造函数中的第一行都有一个句隐式super()语句。原理:子类继承父类,获取获取到了父类中的成员,所以子类必须要先明确父类是如何对这些成员进行初始化的。

如何父类中没有了空参数构造函数,需要在子类的构造函数通过super,或者this语句指定要访问的构造函数。

什么时候使用继承呢?当类与类之间出现所属(is a)关系时,就使用继承。类中的所有成员是否可以被另一个类所以拥有.如果是继承.如果不是,看是否具备向上抽取的可能. class A{

void method(){}

void function(){}

}

有了一个B类,B中也需要一个method()方法。这时,是否可以用B继承A来获取这个方法呢?因为这样不是可以提高复用性吗?

那么判断,B和A之间有所属关系吗?不会判断。这时,可以通过另一个方式,B是否应用具备A中所有功能?不是。B只需一个method()方法即可。不需要function()。这样就不需要继承。但是B中就会重复定义method()方法。那么A和B出现了共性的内容,就具备了向上抽取的内容。这时A和B就又出现一个父类C。

class B{

void method(){}

void show(){}

}

所以最终设计: class C{

void method(){}

}

class A extends C{

void function(){}

}

class B extends C{

void show(){}

}

----------------------------------------------

final关键字 1,final可以修饰类,方法,变量。 2,final修饰类不可以被继承,但是可以继承其他类。 3,final修饰的方法不可以被覆盖,但可以覆盖父类方法。 4,final修饰的变量包括成员变量,类变量,局部变量,这些变量只能赋值一次。 5,内部类在局部时,只可以访问被final修饰的局部变量。通常规范中,被final修饰的变量是一个常量,常量名称所有字母大写。

-----------------------------------------------

抽象类:分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声明相同,但功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么该方法就是一个抽象方法。抽象方法的表现形式:abstract返回值类型函数名称(参数列表);抽象方法一定要存放在抽象类中。

特点:抽象类不能用new进行实例化。想要创建对象,必须通过子类复写父类中所有的抽象方法后,该子类才可以创建对象。

抽象类定义时,和一般类一样,都是在描述事物,只不过抽象类可以存放抽象方法,不可以建立对象。

抽象方法的出现可以强迫子类去做某些事。

例:学员类的例子。学员类的出现其实分析了现实生活中的学生而来的。张三:躺着睡觉,学习(总结式)李四:躺着睡觉,学习(机械式)

abstract class学员{

void睡觉(){

躺着睡觉;

}

abstract void学习();

}

--------------------------------------------接口:简单的理解成抽象类的特殊表现形式,当抽象类的方法全都是抽象的,那么这时就用接口来表示。

特点:--接口是对外暴露的规则。--接口是功能的扩展。--接口的出现降低了耦合性。--在java中,多继承的机制被java通过另一种形式来体现,就是多现实。--在java中,一类可以继承一个类的同时,实现多个接口。例子:主板的pci接口。插座。笔记本电脑的usb接口。

interface抽烟{

抽烟方法;

}

class张三 extends学员 implements抽烟{

void睡觉(){

躺着睡觉;

}

void学习(){}

抽烟方法{}

}

接口中通常的定义的内容: 1,全局常量。public static final 2,公有的抽象方法。 public abstract

类与类之间是继承关系。

类与接口之间是实现关系。

接口与接口之间是继承关系,而且,接口之间存在多继承

java为什么要重写父类方法和...我重写为什么还要用SUPER继承父类的构造方法的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

java创建包需要什么格式的 java 中 package 是什么java中什么叫初始化,java中的初始化具体是什么意思