面向对象之:this和super关键字
2014-10-27 23:35
239 查看
在面向对象学习的时候,this与super关键字很容易让人感觉到迷惑,当然了,我也不可避免的躺枪,为此,我对两个关键字进行分析总结,在这跟大家分享一下.
this,表示本类对象的引用,哪个对象调用,this就代表了哪个对象.
比如:class Person{
private String name;
private int age;
public Person(String name,int age){//通过构造赋值
this.name = name; //明确表示为本类中的name赋值
this.age = age;
}
public void getInfo(){ //取得信息
System.out.println("姓名:"+name+",年龄 :"+age);
}
}
public class Demo{
public static void main(String[]ags){
Person p = new Person("张大锤",16);
p.getInfo();
}
}
如果上面的一段小例子没有使用this 关键字的话,运行出来的结果,将会是默认值,也就是说,没有this 关键字赋值时候,属性就不能明确的被指出.
this的另一种用法,就是this()语句,在构造方法之间进行调用.
class Person{
private String name;
private int age;
public Person(){
System.out.println("无参构造函数");
}
public Person(String name,int age){//通过构造赋值
this();
this.name = name; //明确表示为本类中的name赋值
this.age = age;
}
public void getInfo(){ //取得信息
System.out.println("姓名:"+name+",年龄 :"+age);
}
}
public class Demo2{
public static void main(String[]ags){
Person p = new Person("张大锤",16);//调用有参构造方法
p.getInfo();
}
}
此时输出结果与Demo不同的是,多出了一行:无参构造函数.
值得注意的是,构造方法是在实例化对象时候,被自动调用的,也就是说在类中的所有方法中,只有构造方法是被有线调用的,所以使用this调用构造方法必须也只能放在构造方法的第一行.
super关键字指向父类的存储空间,这句话与我听到的好多,指向父类的对象有冲突,但是可以肯定,super就是指向了父类的存储空间.这个可以通过一些个小代码短就可以检测出来.比如:Student s = new Student(); s是在栈内存中分配存储空间的,存的是一个地址,这个地址指向了堆内存中的new Student();那么,如果Student此时继承Person的话,他们的实质就是在堆内存中分配空间的new Student()里面继续划分出一个小的空间,取名叫super,而super也存有一个地址,这个地址指向父类Person的.
那么,知道了这些以后,super实用价值就体现出来了.
(1)引用父类的成员:super.变量 或 super.方法([参数列]),当然了,这个需要相应的访问权限.
(2)在子类构造方法中调用父类的构造方法:super([…]);//与this用法类似,应放在子类构造方法的第一行位置上
请注意:父类变量的初始化只能通过调用super([…])方法,由父类来完成,子类不可能“代劳”。只有父类变量的初始化完成之后,子类才开始其新增变量的初始化工作。
另一个问题是,都知道,this()和super()都需要放在构造函数第一行,那么,两个在一起的时候,到底谁在第一行呢?其实,两个是不能在一起的.哈哈,其实写了this(),默认的super()没有了.然而,无论第一行是this还是super,保证每个子类构造方法,直接还是间接都会访问到父类构造方法,就可以了.
this,表示本类对象的引用,哪个对象调用,this就代表了哪个对象.
比如:class Person{
private String name;
private int age;
public Person(String name,int age){//通过构造赋值
this.name = name; //明确表示为本类中的name赋值
this.age = age;
}
public void getInfo(){ //取得信息
System.out.println("姓名:"+name+",年龄 :"+age);
}
}
public class Demo{
public static void main(String[]ags){
Person p = new Person("张大锤",16);
p.getInfo();
}
}
如果上面的一段小例子没有使用this 关键字的话,运行出来的结果,将会是默认值,也就是说,没有this 关键字赋值时候,属性就不能明确的被指出.
this的另一种用法,就是this()语句,在构造方法之间进行调用.
class Person{
private String name;
private int age;
public Person(){
System.out.println("无参构造函数");
}
public Person(String name,int age){//通过构造赋值
this();
this.name = name; //明确表示为本类中的name赋值
this.age = age;
}
public void getInfo(){ //取得信息
System.out.println("姓名:"+name+",年龄 :"+age);
}
}
public class Demo2{
public static void main(String[]ags){
Person p = new Person("张大锤",16);//调用有参构造方法
p.getInfo();
}
}
此时输出结果与Demo不同的是,多出了一行:无参构造函数.
值得注意的是,构造方法是在实例化对象时候,被自动调用的,也就是说在类中的所有方法中,只有构造方法是被有线调用的,所以使用this调用构造方法必须也只能放在构造方法的第一行.
super关键字指向父类的存储空间,这句话与我听到的好多,指向父类的对象有冲突,但是可以肯定,super就是指向了父类的存储空间.这个可以通过一些个小代码短就可以检测出来.比如:Student s = new Student(); s是在栈内存中分配存储空间的,存的是一个地址,这个地址指向了堆内存中的new Student();那么,如果Student此时继承Person的话,他们的实质就是在堆内存中分配空间的new Student()里面继续划分出一个小的空间,取名叫super,而super也存有一个地址,这个地址指向父类Person的.
那么,知道了这些以后,super实用价值就体现出来了.
(1)引用父类的成员:super.变量 或 super.方法([参数列]),当然了,这个需要相应的访问权限.
(2)在子类构造方法中调用父类的构造方法:super([…]);//与this用法类似,应放在子类构造方法的第一行位置上
请注意:父类变量的初始化只能通过调用super([…])方法,由父类来完成,子类不可能“代劳”。只有父类变量的初始化完成之后,子类才开始其新增变量的初始化工作。
另一个问题是,都知道,this()和super()都需要放在构造函数第一行,那么,两个在一起的时候,到底谁在第一行呢?其实,两个是不能在一起的.哈哈,其实写了this(),默认的super()没有了.然而,无论第一行是this还是super,保证每个子类构造方法,直接还是间接都会访问到父类构造方法,就可以了.
相关文章推荐
- 黑马程序员-JAVASE入门( 面向对象、单例设计模式、this、static关键字)
- 面向对象之this关键字,static关键字 main
- java学习日记_34:面向对象之super关键词、this与super的区别和继承中构造方法的关系。08.16~17
- 面向对象一______之继承、super和this的比较
- Java面向对象-8.super()、super.和this()、this.
- JAVA面向对象基础:继承、变量隐藏、方法重写、包、修饰符、this、super
- 面向对象(继承,重写,this,super,抽象类)
- 黑马程序员_学习笔记:4) 面向对象2:继承、this、super、finally、Abstract、模板设计模式、接口
- Java第二课 Java面向对象编程,面向对象编程和面向过程编程的区别,我们如何才能掌握面向对象的编程,类和对象的关系;讲解了Java中的构造、重载、this和super变量、静态变量、Java中的常
- java学习日记_21:面向对象之this关键字的内存示意图。07.09
- [java学习笔记]java语言核心----面向对象之this关键字
- 面向对象(二)——操作符重载 & 关键字this & 静态成员static
- 黑马程序员——Java基础---面向对象代码块和继承和this和super和重写和重载和final
- php 面向对象 this 关键字
- 面向对象_this和super的区别和应用
- JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍
- java面向对象【重写、this、super,抽象类】
- 黑马程序员--03.面向对象--04.子类构造必须访问父类构造的原因 this_super语句的含义【个人总结】
- JAVA面向对象-----super关键字
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】