Java中this、super用法
java中this()的用法

java中this()的用法this()是Java中的特殊语法,用于在一个类的构造函数中调用另一个构造函数。
在一个类中可以定义多个构造函数,每个构造函数可以接受不同数量或不同类型的参数。
如果我们希望在构造函数中使用另一个构造函数中的代码,则可以使用this()来调用。
举个例子:```public class Person {private String name;private int age;public Person() {this("unknown", 0);}public Person(String name) {this(name, 0);}public Person(int age) {this("unknown", age);}public Person(String name, int age) { = name;this.age = age;}}```这里我们定义了一个Person类,有4个构造函数,分别接受0个、1个或2个参数。
我们希望在任何情况下,最终都能调用一个拥有两个参数的构造函数来完成对象初始化。
这时就可以使用this(),比如在Person()构造函数中调用this("unknown", 0)来完成对象初始化。
这意味着,如果使用不带参数的构造函数创建Person对象时,实际上会在该构造函数中调用this("unknown", 0),从而调用两个参数的构造函数来完成对象初始化。
使用this()注意要点:1. this()必须在构造函数的第一行调用,因为初始化必须先完成。
2. 只能在构造函数中使用this(),其他方法不能使用。
3. this()只能调用同一个类的其他构造函数,不能调用父类或子类的构造函数。
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的用法

java中super的用法super关键字在Java中用于访问父类的成员变量和方法。
它可以用来调用父类构造方法,访问父类中被子类覆盖的方法和变量,以及在子类中显式地调用父类中的方法。
super关键字的一些常见用法包括:1. 调用父类的构造方法在子类中使用super关键字可以调用父类的构造方法。
这种方式通常用于子类构造函数中需要调用父类构造函数的场景。
例如:```public class Animal {int age;public Animal(int age) {this.age = age;}}public class Dog extends Animal {String name;public Dog(int age, String name) {super(age); = name;}}```在Dog类的构造函数中使用了super关键字来调用Animal类的构造函数。
2. 访问父类中被子类覆盖的方法和变量当子类覆盖了父类中的方法或者变量时,可以使用super关键字来访问父类中被覆盖的方法或者变量。
例如:```public class Animal {public void sayHello() {System.out.println('Animal says hello!');}}public class Dog extends Animal {@Overridepublic void sayHello() {super.sayHello();System.out.println('Dog says hello!');}}```在Dog类的sayHello方法中使用了super关键字来访问父类中的sayHello方法,从而实现了在子类方法中调用父类方法的效果。
3. 在子类中显式地调用父类中的方法子类中可以使用super关键字来显式地调用父类中的方法。
这种方式通常在需要在子类中扩展父类方法的同时,保留父类方法的实现逻辑时使用。
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();⽬的是在初始化当前对象时,先保证了⽗类对象先初始化。
java中this的用法

java中this的用法This,英语单词,发音:[英][ðɪs][美][ðɪs]。
常翻译为:这,这么。
java中this的用法有哪些呢?本文是店铺整理java中this的用法的资料,仅供参考。
java中this的用法11. this指当前对象。
当在一个类中要明确指出使用对象变量或函数时加上this引用。
如下面例子中:public class Hello {String s = "Hello";public Hello(String s){System.out.println("s = " + s);System.out.println("1 -> this.s = " + this.s);this.s = s;System.out.println("2 -> this.s = " + this.s);}public static void main(String[] args) {Hello x=new Hello("HelloWorld!");}}运行结果:s = HelloWorld!1 -> this.s = Hello2 -> this.s = HelloWorld!在这个例子中,构造函数Hello中,参数s与类Hello的变量s同名,这时直接对s进行操作则是对参数s进行操作。
对类Hello的成员变量s进行操作就应该用this进行引用。
运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果;第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!2. this作为参数传递当你要把自己作为参数传递给别的对象时如:public class A {public A() {new B(this).print();}public void print() {System.out.println("Hello from A!");}}public class B {A a;public B(A a) {this.a = a;}public void print() {a.print();System.out.println("Hello from B!");}}运行结果:Hello from A!Hello from B!在这个例子中,对象A的构造函数中,newB(this)把对象A作为参数传递给了对象B的构造函数。
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基础之方法重写详解

Java基础之⽅法重写详解⼀、java⽅法重写⽅法的重写是⼦类根据需求对⽗类继承的⽅法进⾏重新的编写,在重写时,可以使⽤super⽅法的⽅式来保留⽗类中的⽅法,注意:构造⽅法不可以被重写。
创建⼀个⼈类,属性包括姓名性别年龄⾏为⽅法是输出信息⼆、super关键字⽅法重写时要在⼦类中定义⼀个和⽗类相同名称的⽅法,并采⽤super关键字super.⽅法名();,这样就实现了⽅法的重写package cn.zhz.Kind.dh;public class Person1 {public String sex;public String name;public int age;public void showInfo() {System.out.println("姓名:" + name + "年龄:" + age + "性别:" + sex);}}创建⼀个学⽣类,属性包括学号学科,⾏为⽅法是输出信息package cn.zhz.Kind.dh;public class Student1 extends Person1{public int stuId;public String stuSubject;public void showInfo(){super.showInfo();System.out.println("学号:"+ stuId+ "学科:"+ stuSubject);}}创建学⽣类的⼀个实例,进⾏赋值操作,赋值后输出package cn.zhz.Case.dh;import cn.zhz.Kind.dh.Student1;public class Student1Test {public static void main(String[] args) {Student1 student1 = new Student1();student1.stuId = 1; = "张三";student1.age = 18;student1.sex = "男";student1.stuSubject = "物理";student1.showInfo();}}2.1 super关键字的介绍super可以应⽤在⼦类访问⽗类成员中,⽐如说:访问⽗类的属性super.print();注意是⾮private的⽅法访问⽗类的⽅法;访问⽗类的构造⽅法super();package cn.zhz.Inherit.dh;public class Pet {private String name = "⽆名⽒";private int health = 100;private int love = 0;public int age = 1;public Pet() {System.out.println("⽗类⽆参构造⽅法");}public Pet(String name) { = name;}public Pet(String name, int health, int love) {//this可以调⽤本类的构造⽅法,且在第⼀⾏//this(name); = name;this.health = health;this.love = love;System.out.println("⽗类带参构造⽅法");}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public void setHealth(int health) {if (health < 0 || health > 100) {System.out.println("宠物的健康值在0-100之间");this.health = 60;return;}this.health = health;}public int getHealth() {return this.health;}public void setName(String name) { = name;}public String getName() {return ;}public void setLove(int love) {if (love < 0 || love > 100) {System.out.println("宠物的亲密度只能在0-100之间");this.love = 60;return;}this.love = love;}public int getLove() {return this.love;}//输出宠物的信息public void print() {System.out.println("宠物的⾃⽩:\n我的名字叫" + + "健康值是" + this.health + "和主⼈的亲密度是:" + this.love); }}package cn.zhz.Inherit.dh;public class Dog extends Pet {private String strain = "聪明的拉布拉多⽝";public Dog() {System.out.println("⼦类狗狗的⽆参构造⽅法");}public Dog(String name, int health, int love, String strain) {//通过super调⽤⽗类的构造⽅法,必须是第⼀句//super();super(name, health, love);this.strain = strain;System.out.println("狗狗的带参构造⽅法");}public void setStrain(String strain) {this.strain = strain;}public String getStrain() {return this.strain;}public void print() {//调⽤⽗类的⾮private的print()⽅法super.print();System.out.println("我是⼀只" + this.strain);}public void m1() {//super不可以调⽤⽗类的private属性// System.out.println();System.out.println(super.age);}}在使⽤super关键字来访问⽗类的成员时,使⽤super关键字,super代表的是⽗类的对象,super只可以出现在⼦类的⽅法和构造⽅法中,使⽤super调⽤构造⽅法时,只可以是第⼀句,super不可以访问⽗类的private成员。
This和Super的区别

This和Super的区别
⼀:this
java中this关键字的作⽤和词义很接近:
它在⽅法内部使⽤,即这个⽅法所属对象的引⽤
它在构造器内部使⽤,表⽰该构造器正在初始化的对象。
this表⽰当前对象,可以调⽤类的属性、⽅法和构造器。
注意
使⽤this()必须放在构造器的⾸⾏!
使⽤this()调⽤本类中其他的构造器,保证⾄少有⼀个构造器不是⽤this的。
⼆:super
java类中使⽤super来调⽤⽗类中的指定操作:
super可⽤于访问⽗类中定义的属性
super可⽤于调⽤⽗类中定义的成员⽅法
super可⽤于在⼦类构造⽅法中调⽤⽗类的构造器
注意
尤其当⼦⽗类出现同名成员是,可以⽤super进⾏区分。
super的追溯不仅限于直接⽗类。
super和this的⽤法相像,this代表本类对象的引⽤,super代表⽗类的内存空间的标识。
三:this和super区别
No.区别点this super
1访问属性访问本类中的属性,如果本类没有此属性则从⽗类中继续查找访问⽗类中的属性
2调⽤⽅法访问本类中的⽅法直接访问⽗类中的⽅法
3调⽤构造器调⽤本类构造器,必须放在构造器⾸⾏调⽤⽗类构造器,必须放在⼦类构造器的⾸⾏4特殊表⽰当前对象⽆。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量。
但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的。
好了,现在开始讨论this&super这两个关键字的意义和用法。
在Java中,this通常指当前对象,super则指父类的。
当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。
如果你想引用父类的某种东西,则非super莫属。
由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。
在一般方法中
最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。
另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。
下面的代码演示了上面的用法:
public class DemoThis{
private String name;
private int age;
DemoThis(String name,int age){
setName(name);
//你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的
setAge(age);
this.print(); br> }
public void setName(String name){
=name;//此处必须指明你要引用成员变量
}
public void etAge(int age){
this.age=age;
}
public void print(){
System.out.println("Name="+name+" ge="+age);
//在此行中并不需要用this,因为没有会导致混淆的东西
}
public static void main(String[] args){
DemoThis dt=new DemoThis("Kevin","22");
这段代码很简单,不用解释你也应该能看明白。
在构造函数中你看到用this.print(),
你完全可以用print()来代替它,两者效果一样。
下面我们修改这个程序,来演示super 的用法。
class Person{
public int c;
private String name;
private int age;
protected void setName(String name){
=name;
}
protected void setAge(int age){
this.age=age;
}
protected void print(){
System.out.println("Name="+name+" Age="+age);
}
}
public class DemoSuper extends Person{
public void print(){
System.out.println("DemoSuper:");
super.print();
}
public static void main(String[] args){
DemoSuper ds=new DemoSuper();
ds.setName("kevin");
ds.setAge(22);
ds.print();
}
}
在DemoSuper中,重新定义的print方法覆写了父类的print方法,它首先做一些自己的事情,然后调用父类的那个被覆写了的方法。
输出结果说明了这一点:DemoSuper:
Name=kevin Age=22
这样的使用方法是比较常用的。
另外如果父类的成员可以被子类访问,那你可以像使用this一样使用它,用“super.父类中的成员名”的方式,但常常你并不是这样来访问父类中的成员名的。
在构造函数中构造函数是一种特殊的方法,在对象初始化的时候自动调用。
在构造函数中,this和super也有上面说的种种使用方式,并且它还有特殊的地方,请看下面的例子:
class Person{
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("A Person.");
}
Person(String name){
prt("A person name is:"+name);
}
}
public class Chinese extends Person{
Chinese(){
super(); //调用父类构造函数(1)
prt("A chinese.");//(4)
}
Chinese(String name){
super(name);//调用父类具有相同形参的构造函数(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name);//调用当前具有相同形参的构造函数(3)
prt("his age is:"+age);
}
public static void main(String[] args){
Chinese cn=new Chinese();
cn=new Chinese("kevin");
cn=new Chinese("kevin",22);
}
}
在这段程序中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟
上适当的参数,因此它的意义也就有了变化。
super后加参数的是用来调用父类中具有相同形式的
构造函数,如1和2处。
this后加参数则调用的是当前具有相同参数的构造函数,如3处。
当然,在
Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你
可以将它替换为“this.prt”(因为它继承了父类中的那个方法)或者是“super.prt”(因为它
是父类中的方法且可被子类访问),它照样可以正确运行。
但这样似乎就有点画蛇添足的味道
了。
最后,写了这么多,如果你能对“this通常指代当前对象,super通常指代父类”这句话牢记在
心,那么本篇便达到了目的,其它的你自会在以后的编程实践当中慢慢体会、掌握。
另外关于本
篇中提到的继承,请参阅相关Java教程。