this和Super关键字

  • this和Super关键字的对比
  • Super关键字的用法如下:
    • 1. super关键字代表了父类空间的引用;
    • 2. super关键字的作用:
    • 3. super关键字调用父类构造方法要注意的事项:
  • this关键字的用法如下:
    • 1.了解没有 this 关键字的问题
    • 2. 不需要 this 关键字的程序示例
    • 3. this:调用当前类方法
    • 3. this():调用当前类的构造函数
    • 4. 使用this()构造函数调用
    • 4. this:作为参数传递给方法
    • 5. this:在构造函数调用中作为参数传递
    • 6. this关键字用来返回当前类的实例
    • 7. 验证 this 关键字

this和Super关键字的对比

- this super()
概念 访问本类实列属性和方法 有子类访问父类中的实列属性和方法
查找范围 先找本类,找不到再找父类 找父类
各异功能 单独使用时,表示当前对象 在子类重写父类方法时,访问父类同名方法
相同点 1.都是关键字,起指代作用2.在构造方法中必须出现在第一行

Super关键字的用法如下:

1. super关键字代表了父类空间的引用;

2. super关键字的作用:

(1) 子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员;
(2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
(1) 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法内加上super()语句。
(2) super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
(3) super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。
(1) 代表的事物不一致。
① super关键字代表的是父类空间的引用。(并不能代表对象,只是代表一个对象中的一块内存而已)
② this关键字代表的是所属函数的调用者对象。
(2) 使用前提不一致。
① super关键字必须要有继承关系才能使用。
② this关键字不需要存在继承关系也可使用。
(3) 调用构造函数的区别:
① super关键字是调用父类的构造函数。
② this关键字是调用本类的构造函数。

3. super关键字调用父类构造方法要注意的事项:

注意:是两个关键字不能同时出现在同一个构造函数中去调用其他的构造函数,里面还是可以写this.num = num。并不是说不能出现this。

this关键字的用法如下:

  1. this关键字可用来引用当前类的实例变量。
  2. this关键字可用于调用当前类方法(隐式)。
  3. this()可以用来调用当前类的构造函数。
  4. this关键字可作为调用方法中的参数传递。
  5. this关键字可作为参数在构造函数调用中传递。
  6. this关键字可用于从方法返回当前类的实例。
    建议:如果你是java初学者,只学习 this 关键字的前三个用法就可以了。
  1. this:引用当前类的实例变量 this关键字可以用来引用当前类的实例变量。如果实例变量和参数之间存在歧义,则 this 关键字可用于明确地指定类变量以解决歧义问题。

1.了解没有 this 关键字的问题

下面先来理解一个不使用 this 关键字的示例:

class Student {int rollno;String name;float fee;Student(int rollno, String name, float fee) {rollno = rollno;name = name;fee = fee;}void display() {System.out.println(rollno + " " + name + " " + fee);}
}
class TestThis1 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", 5000f);Student s2 = new Student(112, "sumit", 6000f);s1.display();s2.display();}
}

执行上面代码输出结果如下 -

0 null 0.0
0 null 0.0

在上面的例子中,参数(形式参数)和实例变量(rollno和name)是相同的。 所以要使用this关键字来区分局部变量和实例变量。

使用 this 关键字解决了上面的问题

class Student {int rollno;String name;float fee;Student(int rollno, String name, float fee) {this.rollno = rollno;this.name = name;this.fee = fee;}void display() {System.out.println(rollno + " " + name + " " + fee);}
}
class TestThis2 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", 5000f);Student s2 = new Student(112, "sumit", 6000f);s1.display();s2.display();}
}

执行上面代码输出结果如下 -

111 ankit 5000
112 sumit 6000

如果局部变量(形式参数)和实例变量不同,则不需要像下面的程序一样使用this关键字:

2. 不需要 this 关键字的程序示例

class Student {int rollno;String name;float fee;Student(int r, String n, float f) {rollno = r;name = n;fee = f;}void display() {System.out.println(rollno + " " + name + " " + fee);}
}class TestThis3 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", 5000f);Student s2 = new Student(112, "sumit", 6000f);s1.display();s2.display();}
}

执行上面代码输出结果如下 -

111 ankit 5000
112 sumit 6000

对变量使用有意义的名称是一种好的编程习惯。所以使用相同名称的实例变量和参数,并且总是使用this关键字。

3. this:调用当前类方法

可以使用this关键字调用当前类的方法。如果不使用this关键字,编译器会在调用方法时自动添加此 this 关键字。我们来看看这个例子。

执行上面代码输出结果如下 -

hello n
hello m

3. this():调用当前类的构造函数

this()构造函数调用可以用来调用当前类的构造函数。 它用于重用构造函数。 换句话说,它用于构造函数链接。

从参数化构造函数调用默认构造函数:

class A {A() {System.out.println("hello a");}A(int x) {this();System.out.println(x);}
}class TestThis5 {public static void main(String args[]) {A a = new A(10);}
}

执行上面代码输出结果如下 -

hello a
10

从默认构造函数调用参数化构造函数:

class A {A() {this(5);System.out.println("hello a");}A(int x) {System.out.println(x);}
}class TestThis6 {public static void main(String args[]) {A a = new A();}
}

执行上面代码输出结果如下 -

5
hello a

4. 使用this()构造函数调用

this()构造函数调用用于从构造函数重用构造函数。 它维护构造函数之间的链,即它用于构造函数链接。看看下面给出的示例,显示this关键字的实际使用。

class Student {int rollno;String name, course;float fee;Student(int rollno, String name, String course) {this.rollno = rollno;this.name = name;this.course = course;}Student(int rollno, String name, String course, float fee) {this(rollno, name, course);// reusing constructorthis.fee = fee;}void display() {System.out.println(rollno + " " + name + " " + course + " " + fee);}
}class TestThis7 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", "java");Student s2 = new Student(112, "sumit", "java", 6000f);s1.display();s2.display();}
}

执行上面代码输出结果如下 -

111 ankit java null
112 sumit java 6000

注意:调用this()必须是构造函数中的第一个语句。

下面示例为不把 this() 语句放在第一行,因此编译不通过。

class Student {int rollno;String name, course;float fee;Student(int rollno, String name, String course) {this.rollno = rollno;this.name = name;this.course = course;}Student(int rollno, String name, String course, float fee) {this.fee = fee;this(rollno, name, course);// C.T.Error}void display() {System.out.println(rollno + " " + name + " " + course + " " + fee);}
}class TestThis8 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", "java");Student s2 = new Student(112, "sumit", "java", 6000f);s1.display();s2.display();}
}

执行上面代码输出结果如下 -

Compile Time Error: Call to this must be first statement in constructor

4. this:作为参数传递给方法

this关键字也可以作为方法中的参数传递。 它主要用于事件处理。 看看下面的一个例子:

class S2 {void m(S2 obj) {System.out.println("method is invoked");}void p() {m(this);}public static void main(String args[]) {S2 s1 = new S2();s1.p();}}

执行上面代码输出结果如下 -

method is invoked

这个应用程序可以作为参数传递:

在事件处理(或)的情况下,必须提供一个类的引用到另一个。 它用于在多个方法中重用一个对象。

5. this:在构造函数调用中作为参数传递

也可以在构造函数中传递this关键字。 如果必须在多个类中使用一个对象,可以使用这种方式。 看看下面的一个例子:

class B {A4 obj;B(A4 obj) {this.obj = obj;}void display() {System.out.println(obj.data);// using data member of A4 class}
}
class A4 {int data = 10;A4() {B b = new B(this);b.display();}public static void main(String args[]) {A4 a = new A4();}
}

执行上面代码输出结果如下 -

10

6. this关键字用来返回当前类的实例

可以从方法中 this 关键字作为语句返回。 在这种情况下,方法的返回类型必须是类类型(非原始)。 看看下面的一个例子:

作为语句返回的语法

return_type method_name(){  return this;
}

从方法中返回为语句的 this 关键字的示例

class A {A getA() {return this;}void msg() {System.out.println("Hello java");}
}class Test1 {public static void main(String args[]) {new A().getA().msg();}
}

执行上面代码输出结果如下 -

Hello java

7. 验证 this 关键字

现在来验证 this 关键字引用当前类的实例变量。 在这个程序中将打印参考变量,这两个变量的输出是相同的。

class A5 {void m() {System.out.println(this);// prints same reference ID}public static void main(String args[]) {A5 obj = new A5();System.out.println(obj);// prints the reference IDobj.m();}
}

执行上面代码输出结果如下 -

A5@22b3ea59
A5@22b3ea59

This和Super关键字的对比相关推荐

  1. Java类的继承关键字_Java的第八天(类的继承、super关键字的使用、方法的重写)...

    39.类的继承java 描述类的时候,咱们若是发现有几个类有重复的属性和方法,咱们就能够采用继承的方法来设计ide 使用extends关键字来继承this 语法:设计 class 子类 extends ...

  2. JAVA入门级教学之(super关键字)

    目录 JAVA入门级教学之(super关键字) 1.super关键字用在构造方法中: 2.语法规则: 3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样 4.通过 ...

  3. JAVA知识基础(九):this、super 关键字总结

    1.this关键字 this有三种常见用法 1.this调用本类中的属性,也就是类中的成员变量 2.this调用本类中的其他方法 3.this调用本类中的其他构造方法,调用时要放在构造方法的首行. 2 ...

  4. 第八章第一节:Java继承之继承概念、语法、成员访问和super关键字

    文章目录 一:继承的概念及语法 (1)什么是继承 (2)Java继承语法 二:成员访问 (1)子类访问父类的成员变量 (2)子类访问父类的成员方法 三:super关键字 (1)super关键字 A:作 ...

  5. Java中super关键字及super()的使用

    Java中super关键字及super()的使用: 1.super的使用: (1)super是一个关键字. (2)super和this很类似,我们对比着学习. 2.先复习一下this关键字的使用. ( ...

  6. Java——super关键字

    1.super是关键字,全部小写. 2.super和this对比: this: this能出现在实例方法和构造方法中. this的语法: "this." . "this ...

  7. Java super关键字(超详细!)

    1.什么是super? super是一个关键字,全部小写. 2.怎么学?super和this对比着学习. this: this能出现在实例方法和构造方法中. this的语法是:"this.& ...

  8. super关键字的使用

    super关键字的三种用法 1.super可以用来引用直接父类成员变量.       super.父类成员变量; 2.super可以用来调用直接父类成员方法.       super.父类成员方法(参 ...

  9. java语言之super关键字详解

    文章目录 前言 一.super介绍 二.super的语法 三.super内存图 四.super小结 前言 你第一次遇到super关键字是什么时候呢?是不是使用IDEA或者eclipse快捷键生成类构造 ...

最新文章

  1. 程序猿才感同身受的10个图!
  2. 树莓内核驱动io框架
  3. jq:jQuery库文件jquery.scrollLoading.js使用方法
  4. 入门写博客之markdown语法
  5. 【机器学习】算法大全
  6. OO实现ALV TABLE 二:ALV显示的三种形式
  7. C++ 数值的整数次方 (最小int取反,递归实现乘方)
  8. animation of android (1)
  9. 如何快速学会java编程?
  10. 《Hadoop MapReduce实战手册》一1.10 使用MapReduce监控UI
  11. Java_String_01_由转义字符串得到其原本字符串
  12. 【Linux】Linux修改openfiles后不生效问题?
  13. 阿里云服务器需要备案吗?
  14. FIT2CLOUD混合云管理平台实现可扩展架构升级
  15. Solr与MongoDB集成,实时增量索引[转]
  16. 精仿交易猫手游1:1源码可运营 支持二维码收款
  17. 印度加强网络管理或部署网猫软件屏蔽Facebook
  18. Docker基础讲解狂神笔记(1/2)
  19. 性格内向的人,是否适合做产品经理 ?
  20. MIT教授: 世界就是《黑客帝国》,人类在模拟游戏中扮演角色

热门文章

  1. g-gdb工具使用图谱(持续更新)
  2. DRF序列化和反序列化
  3. Java 集合框架(二)—— ArrayList
  4. jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误
  5. [sinatra] Just Do It: Learn Sinatra, Part One Darren Jones
  6. session_id
  7. WPF关闭应用程序,释放Window窗口资源方法
  8. 从iso镜像升级ubuntu
  9. 基于Google Reader的个人知识管理方案
  10. 【C++】【五】循环链表