super关键字

合集下载

为什么静态方法不能引用this和super方法

为什么静态方法不能引用this和super方法

为什么静态成员、静态方法中不能用this和super关键字1.在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行.因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在2.在问题之前先讲super的用法:1.super的用法跟this类似,this代表对本类对象的引用,指向本类已经创建的对象;而super代表对父类对象的引用,指向父类对象;2.静态优先于对象存在;3.由上面的1.和2.知:因为静态优先于对象存在,所以方法被静态修饰之后方法先存在,而方法里面要用到super指向的父类对象,但是所需的父类引用对象晚于该方法出现,也就是super所指向的对象没有,当然就会出错。

综上,静态方法中不可以出现super关键字。

3.首先你要明白对象和类的区别。

this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西所有的成员方法,都有一个默认的的参数this(即使是无参的方法),只要是成员方法,编译器就会给你加上this这个参数如:Class A中void method1(){}实际上是这样的--------> voidmethod1(A this)void method2(int x){}实际上是这样的--------> voidmethod2(A this, intx)而静态方法与对象无关,根本不能把对象的引用传到方法中,所以不能用this4.在一个类中定义一个方法为static,则为静态方法,那就是说,无需本类的对象即可调用此方法,调用一个静态方法就是“类名.方法名”既然"无需本类的对象即可调用静态方法",而this和super关键字都是用于本类对象的-----调用静态方法无需本类的对象这句话很清楚表明:静态方法中不能用this和super关键字5.静态方法是存放在内存中的数据段里,this和super调用的是堆空间里的应用对象不能调用数据段区域里的数据,因此静态方法中不能用this和super 关键字6.静态方法和静态类不属于单个对象,而是类的所有对象共享使用而this代表当前对象7.东西只属于类,不属于任何对象,所以不能用THIS和SUPER。

super关键字

super关键字

super关键字super关键字super代表的是“当前对象(this)”的⽗类型特征。

super的特征1. super是⼀个关键字,全部⼩写。

2. super和this对⽐着学习。

this:this能出现在实例⽅法和构造⽅法中.this的语法是:"this."、"this ()"this不能使⽤在静态⽅法中。

**this. ** ⼤部分情况下是可以省略的。

this. 什么时候不能省略呢? 在区分局部变量和实例变量的时候不能省略public void setName ( string nane) { = name ;}this()只能出现在构造⽅法第⼀⾏,通过当前的构造⽅法去调⽤"本类"中其它的构造⽅法,⽬的是:代码复⽤。

this可以单独使⽤super:super能出现在实例⽅法和构造⽅法中.this的语法是:"super. "、"super ()"super不能使⽤在静态⽅法中。

super. ⼤部分情况下是可以省略的。

super. 什么时候不能省略呢? ⽗类和⼦类有同名属性时,你想在⼦类调⽤⽗类的那个属性,这个时候“super.”是不可以省略的。

super()只能出现在构造⽅法第⼀⾏,通过当前的构造⽅法去调⽤"⽗类"中其它的构造⽅法,⽬的是:在创建⼦类对象的时候,先初始化⽗类型特征。

super不能单独使⽤,否则编译会报错!要么"super."要么"super()",由此可以得出,super不是引⽤,不存内存地址,也不指向任何对象,3. super ()表⽰通过⼦类的构造⽅法调⽤⽗类的构造⽅法。

模拟现实世界中的这种场景:要想有⼉⼦,需要先有⽗亲。

4. 重要的结论当⼀个构造⽅法第⼀⾏:既没有this()有没有super(),默认会有⼀个super(),表⽰通过当前⼦类的构造⽅法调⽤⽗类的⽆参数构造⽅法。

Java——补充:构造方法super()与构造方法无参有参构造方法this()与构造方法

Java——补充:构造方法super()与构造方法无参有参构造方法this()与构造方法

Java——补充:构造⽅法super()与构造⽅法⽆参有参构造⽅法this()与构造⽅法参考⽂章:构造⽅法在new的时候⾃动执⾏。

且只执⾏⼀次。

new⼀次执⾏⼀次每个类都有构造⽅法,即使不写也有,编译时javac会⾃动检查类是否有构造⽅法,如果有,就执⾏,没有就⾃动添加⼀个如果⽗类有含参构造⽅法,则⼦类也必须添加含参构造⽅法如果⽗类没有含参构造⽅法,⼦类⽆需添加构造⽅法this在构造⽅法之间的应⽤super在构造⽅法中的应⽤⾸先要明⽩super关键字的作⽤:1、super是调⽤⽗类的成员⽅法或成员变量。

但是还有⼀个问题:.也就是说⼦类对象中,⽗类的构造⽅法会先执⾏。

那么为什么要执⾏⽗类构造⽅法呢?假设,创建了⼀个⽗类,含有⼀个成员属性a=1;含有⼀个构造⽅法,将a=5;。

因为如果⼦类创建的对象调⽤⽗类的成员变量a时,在不添加super()时,会得到a=1;如果添加super()就会得到a=5;我们都知道,构造⽅法在创建对象时执⾏,a应该等于5,故如果不调⽤super()就会得到错误的值。

2、super()在构造⽅法中是调⽤⽗类构造⽅法的意思。

当创建⼦类对象时,⽗类对象先进内存。

这样⼦类才能⾃动拥有⽗类的成员。

3、⼦类的构造器,⽆论重载多少个,第⼀⾏必须是super();当你不写时表⽰空参super();是否写参数,要根据⽗类决定,⽗类有参数,那么⼦类的super()必须有参数。

4、构造⽅法⽆法继承,⾃然也没有重写这个概念。

5、super()语句必须是构造⽅法的第⼀⾏代码。

总结⼀下:其实这些内容说⽩了,就是在说⼀句话。

super是⽗类对象引⽤,this是本类对象引⽤。

super(),this()都必须放在构造⽅法的第⼀⾏,super()和this()绝不能⼀块⽤,super(),this()⽆参时可以省略不写。

会报错:快捷键:ctrl+T ⽤于打开继承关系图。

⼦类的构造函数必须要 super() 吗?不是必须,是⾃动必须的情况:————指明调⽤哪个含参构造函数public class Father {public String name;public Father(String name) { = name;}}public class Son extends Father{public Son(String name) {super(name);//必须调⽤,否则他会默认调⽤⽗类的⽆参构造函数,⽽⽗类的⽆参构造函数已经被有参的覆盖,所以找不到}this()只能⽤在构造函数中,且它必须是第⼀⾏语句?1.在构造函数中,如果你不指定构造器之间的调⽤关系,那么编译器会给你加上super();⽬的是在初始化当前对象时,先保证了⽗类对象先初始化。

描述super关键字的功能与用法

描述super关键字的功能与用法

描述super关键字的功能与用法Super是一个重要的关键字,用于访问父类对象和方法。

基本上,它是一个指示编译器在继承关系中向上当前类superclass父类结构的语言元素。

super关键字在Java中用于以下几种情况:1. 在子类中引用父类中的成员变量或成员方法时,使用了super关键字来代表父类对象。

2. 如果子类覆盖了父类的方法,可以使用super关键字来调用父类的方法。

3. 如果子类定义了构造函数,则可以使用super关键字来调用父类的构造函数。

4. 在多层继承关系中,如果需要访问中间层或更高级别的超类,可以使用super关键字。

如果子类继承了父类中的成员变量或成员方法,而子类本身也定义了与父类同名的成员变量或成员方法,可以使用super关键字来访问父类中的成员变量和成员方法。

例如,如果有一个具有两个类的继承关系,子类B继承自父类A,B 定义了与A同名的成员变量或成员方法,那么可以使用super关键字来访问A类的成员变量或成员方法。

使用super关键字调用父类的方法时,可以使用两种方式:1. 调用父类的构造函数:在子类中调用super()函数,该函数会调用父类的默认构造函数。

2. 在子类中调用带有参数的构造函数:使用super(arg1,arg2)来调用父类中与子类相匹配的构造函数。

super关键字的作用在于让开发者能够选择是否使用父类中已经存在的成员变量或成员方法,并且能够控制从哪个父类中获得成员变量或成员方法。

同样,使用它还可以提高代码的可读性,使继承关系更加清晰和易于维护。

总之,super关键字是Java编程中一个强大的工具,在多态和继承中发挥着重要的作用。

在实际编程中,我们必须理解这个关键字并正确地使用它,以便更好地管理继承关系和维护代码。

Java中的两个关键字——super、this

Java中的两个关键字——super、this

Java中的两个关键字——super、thisJava中的两个关键字——super、this ⼀、supersuper 是java中⽅的⼀个关键字,⽤它可以引⽤⽗类中的成员:super可⽤于访问⽗类中定义的属性super可⽤于调⽤⽗类中定义的成员⽅法super可⽤于在⼦类构造器中调⽤⽗类的构造器使⽤super关键字注意事项:1、当⼦类和⽗类都有同名的属性时,在⼦类中如果要使⽤⽗类的属性 super . 属性2、 super只能应⽤在成员⽅法和构造⽅法中,不能⽤在静态⽅法中(和this是⼀样的)3、如果在构造⽅法中使⽤必须放在第⼀⾏4、在构造⽅法中this()和super()不能同时出现super没有什么需要解释的地⽅,我们⽤代码来看看super具体的⼀些强⼤功能吧⽰例⼀、使⽤super调⽤基类的属性:public class Father { int num=20;}public class Child extends Father{ int num; public void print(){ num=10; super.num=30; System.out.println("num="+num); System.out.println("="+super.num); }}public class Test { public static void main(String[] args) { Child xm=new Child(); xm.print(); }}运⾏结果:⽰例⼆、使⽤super调⽤基类中的构造⽅法:public class Father { int num; public Father() { System.out.println("⽗类中的⽆参构造⽅法---"); } public Father(int num){ System.out.println("⽗类中的有参的构造⽅法----"+num); }}public class Child extends Father{ int num; public Child() { super(30); System.out.println("⼦类⽆参构造⽅法---"); } public Child(int num) { this.num = num; System.out.println("⼦类中的有参的构造⽅法---"+num); }}解释⼀下上⾯的这段代码:在Child类中的第⼀个构造函数⾥⾯,super(30);它会去调⽤⽗类中嗲有⼀个int型参数的构造⽅法。

在java中super的用途

在java中super的用途

在java中super的用途
在Java中,super是一个关键词,代表了父类对象的引用。

super可以在子类中使用,以调用父类的方法、构造函数和属性。

主要用途包括以下几个方面:
1. 调用父类的构造函数
在子类的构造函数中,可以使用super调用父类的构造函数。

这种情况通常发生在子
类需要在父类的基础上进行一些特定的初始化操作,或者需要传入一些父类的参数。

调用
父类的构造函数可以使用super(),并且必须是子类中的第一条语句。

3. 引用父类的属性
子类可以使用super来引用父类的属性。

这种情况通常发生在子类需要使用父类中的
某个属性作为基础,在此基础上进行一些特定的操作。

使用super的格式为super.属性名。

4. 提高程序的可维护性
使用super可以提高程序的可维护性,使得代码更加清晰简洁。

父类中的方法和属性
通常具有通用性和重复性,子类可以直接复用这些方法和属性,避免了重复的代码,并且
可以更加方便地进行程序的扩展。

5. 帮助实现多态
Java是一种面向对象的语言,多态是面向对象最重要的特征之一。

使用super可以帮助实现多态性。

当子类对象调用方法时,JVM首先在子类中查找方法,如果没有找到,就
会到父类中查找方法。

如果父类中也没有找到,那么会一直向上查找,直到找到Object类为止,这种机制就是多态性的体现。

super(context, attrs)用法

超级调用super(context, attrs)在Android开发中,我们经常会看到在自定义View或ViewGroup的构造方法中使用super(context, attrs)这样的代码。

那么这个super(context, attrs)到底是什么意思,有什么作用呢?在本文中,我将向大家介绍super(context, attrs)的用法,并解释其作用和意义。

1. super(context, attrs)的基本概念在Java语言中,super关键字表示对父类的引用,我们可以使用super来调用父类中的构造方法、属性和方法。

而在Android中,通常在自定义View或ViewGroup的构造方法中使用super(context, attrs)来调用父类的构造方法。

其中,context代表上下文,attrs代表属性集合(AttributeSet)。

2. super(context, attrs)的作用当我们在自定义View或ViewGroup中使用super(context, attrs)时,实际上是在调用父类构造方法的将传入的context和attrs传递给父类,以便父类能够对这些参数进行处理。

这样做的好处是能够保证自定义View或ViewGroup具有与系统控件相似的属性初始化方式,同时也能够保证上下文的正确传递,使得自定义控件能够正确地与其他系统控件进行交互。

3. super(context, attrs)的应用场景在实际的Android开发中,我们经常会使用自定义View或ViewGroup来实现复杂的界面和交互效果。

而在这些自定义控件中,通常都需要使用super(context, attrs)来保证正确的初始化和交互。

我们经常会在自定义控件的构造方法中使用super(context, attrs)来调用父类构造方法,以便正确地处理传入的上下文和属性。

4. super(context, attrs)的注意事项在使用super(context, attrs)时,需要注意一些细节问题。

kotlin子类构造方法调用父类构造方法

kotlin子类构造方法调用父类构造方法在Kotlin中,当我们创建一个子类时,子类默认会调用父类的无参构造方法。

但是,如果父类没有无参构造方法,或者我们想要在子类的构造方法中调用父类特定的构造方法,那么我们就需要手动处理。

Kotlin提供了简洁的语法来处理这种情况。

我们可以通过子类的构造函数来调用父类的构造函数,并传入相应的参数。

有以下几种方法可以实现。

1.使用super关键字调用父类的构造方法:在子类的构造方法中使用super关键字,后面跟上括号,传入相应的参数。

super关键字表示父类的引用,可以通过它来调用父类的构造方法。

例如,有一个父类Person和一个子类Student,我们可以在子类的构造方法中使用super关键字来调用父类的构造方法,如下所示:```kotlinopen class Person(val name: String)class Student(name: String, val grade: Int) : Person(name) {//子类的构造方法}```在子类的构造方法中,我们先接收name参数并传递给父类的构造方法。

这样,当我们创建Student对象时,会同时实例化Person类,并传入name参数。

2.使用this关键字调用本类的其他构造方法:在子类的构造方法中使用this关键字,后面跟上括号,传入相应的参数。

this关键字表示本类的引用,可以通过它来调用其他构造方法。

例如,有一个父类Person和一个子类Student,我们可以在子类的构造方法中使用this关键字来调用本类的其他构造方法,如下所示:```kotlinopen class Person(val name: String, val age: Int) {constructor(name: String) : this(name, 0) //辅助构造方法}class Student : Person {constructor(name: String, grade: Int) : super(name) {//子类的构造方法}}```在子类的构造方法中,我们先调用本类的辅助构造方法,将name 参数传递给辅助构造方法。

java基础编程 第四章 面向对象(下) 案例

案例4-1 super访问父类成员变量一、案例描述1、考核知识点编号:029004003名称:super关键字2、练习目标➢掌握使用super关键字访问父类成员变量的方法3、需求分析子类可以继承父类的非私有成员变量,如果在子类中修改了继承自父类的成员变量的值,再想要访问父类的该成员变量时,可以通过super.成员变量来实现。

为了让初学者熟悉super关键字的用法,本案例将分别设计Fu类及其子类Zi,并在Zi类的方法中使用super关键字访问Fu类的成员变量。

4、设计思路(实现原理)1)编写一个Fu类,在类中定义无参构造和一个初始值为20的num成员变量。

2)Zi类继承Fu类,在子类中对num值进行了修改,同时在子类中定义无参构造和一个无返回值的method()方法,method()方法中使用super关键字调用了Fu类的num成员变量。

3)定义测试类Example03。

二、案例实现1、编写Fu类及其子类Zi,在Zi类中使用super关键字调用Fu类成员变量,代码如下class Fu {Fu() {}int num = 20;}class Zi extends Fu {Zi() {}int num = 30;// 修改num的值void method() {System.out.println("method");// super关键字调用父类成员变量System.out.println("Fu类中num值为:" + super.num);System.out.println("Zi类中num值为:" + num);}}2、定义测试类Example03,代码如下:class Example03{public static void main(String[] args) {Zi z = new Zi();z.method();}}运行结果如图4-3所示。

odoo的super用法_概述及举例说明

odoo的super用法概述及举例说明1. 引言1.1 概述本文将重点介绍Odoo中的super用法。

在Odoo开发过程中,super关键字是一个非常重要的概念,它可以帮助我们调用父类的方法,并实现代码的重用性和扩展性。

通过深入理解和运用super关键字,开发者可以更加灵活地处理和改进已有功能,并提高代码的可维护性。

1.2 文章结构本文将分为四个主要部分来讨论super的用法。

首先,在“引言”部分进行简要介绍和概述。

接下来,在“Odoo的Super用法”部分详细解释super关键字的含义和作用,并举例说明如何在不同场景下使用super。

然后,在“super 用法举例说明”部分,将具体列举在Odoo模型、视图和业务逻辑中使用super 的实际案例,帮助读者更好地理解其应用场景和效果。

最后,在“结论”部分对super的优点、潜在问题以及给开发者的建议和注意事项进行总结。

1.3 目的本文旨在帮助读者全面了解和掌握Odoo中super关键字的使用方式及其实际应用场景。

通过学习本文,读者将能够更加灵活地利用super来优化和扩展现有的Odoo功能,提高开发效率和代码质量。

无论是初学者还是有一定经验的开发者,都能从本文中获得有益的指导和实用的技巧。

2. Odoo的Super用法2.1 理解super关键字在Odoo中,super是一个重要的关键字,用于调用父类的方法。

它可以让开发者在子类中扩展或修改父类方法的功能,而不需要完全覆写整个方法。

2.2 实例化对象和调用父类方法使用super关键字可以实例化对象并调用父类的方法。

例如,当我们创建一个新的Odoo模型时,通常会继承自Odoo提供的基础模型类。

在子类中定义自己的字段和方法后,我们可以使用super关键字来调用父类已经定义好的方法。

这样做有几个好处。

首先,我们不需要重新编写父类方法中已经包含的逻辑;其次,在调用父类方法之前或之后,我们还可以添加自己独特的逻辑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如果子类中定义的成员变量和父类中成员变量同名时,子类就隐藏了从父类继承的成员变量。

当子类中定义了一个方法,并且这个方法的名字、返回类型、参数个数和类型和父类的某个方法完全相同盟时,子类从父类继承的这个方法将被隐藏。

如果在子类中想使用被隐藏的成员变量或方法就可以使用关键字
super。

1 使用关键字super调用父类的构造方法
子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且super必须是子类构造方法中的关一条语句,如例子4.23所示.
例子4.23
class Student
{
int number;
String name;
public Student()
{
}
public Student(int number,String name)
{
this.number=number;
=name;
System.out.println(" I am "+name+" my number is "+ number);
}
}
class Univer_Student extends Student
{
boolean marry;
public Univer_Student(int number,String name,boolean b)
{
super(number,name);
marry=b;
System.out.println("婚否=" + marry);
}
}
public static void Example4_23
{
public static void main(String args[])
{
Univer_Student zhang=new Univer_Student(9901,"和晓林",false);
}
}
运行结果:
I am 和晓林my number is 9901
婚否=false;
需要注意的是:如果在子类的构造方法中,没有使用关键字super调用父类的某个构造方法,那么默认有
super();
语句,即调用父类的不带参数的构造方法。

如果类时定义了一个或多个构造方法,那么Java不提供默认的构造方法(不带参数的构造方法),因此,当在父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错
误。

相关文档
最新文档