1.this
this:本类对象的引用---其实this无处不在
1)在类内部调用属性与方法
调用属性与方法有两种模式:
1.用该类的对象从外部调用。
2.使用this从类内部调用。
在类中直接调用的方法默认都是由this调用。
public class Test {
public String name;
public int age;
public Test() {
}
public Test(String name, int age) {
//直接调用方法,相当于this.set()
set();
this.name = name;
this.age = age;
}
public void set() {}
public static void main(String[] args) {
Test t=new Test();
}
}
在类中直接调用的属性默认都是由this调用。
public class Test {
public String name;
public int age;
public Test() {
//此处相当于this.age
age=2;
}
public Test(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是有参");
}
public void set() {}
public static void main(String[] args) {
Test t=new Test();
System.out.println(t.age);
}
}
输出结果age=2;
2)this用来区分实例变量与局部变量
public class Test {
//声明实例变量
public String name;
//创建方法
public void set(String name) {
this.name=name;
}
public static void main(String[] args) {
//创建对象
Test a=new Test();
//调用方法
a.set("we");
System.out.println(a.name);
}
}
按照以上代码,输出为“we”。
this.name=name;this代表对象,this.调用属性也就是实例变量,传进来的name的值赋值给实例变量,此时用a调用该变量,输出name的值。
假设我们没有写this,输出结果为null;
java中有就近原则,方法体中所有的变量会优先在方法内寻找是否有同名的,在此代码中,不写this时,所有的name都代表参数列表中的name,而不会具体改变实例变量的值,参数列表中的值会是“we”。
3)调用构造器
this可以用来在构造方法中调用其他的构造方法,格式:this()规定:必须放在方法体的第一条语句中。
public class Test {
public String name;
public int age;
public Test() {
System.out.println("我是无参");
}
public Test(String name, int age) {
//调用无参构造
this();
this.name = name;
this.age = age;
System.out.println("我是有参");
}
public static void main(String[] args) {
Test t=new Test("王二",20);
}
}
public class Test {
public String name;
public int age;
//调用有参构造
public Test() {
this("",0);
System.out.println("我是无参");
}
public Test(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是有参");
}
public static void main(String[] args) {
Test t=new Test();
}
}
2.super
super:父类对象的引用---其实super无处不在
1)super调用父类的属性与方法
调用父类方法:
public class Test {
public String name;
//父类无参构造
public Test() {}
//父类方法
public void get() {
System.out.println("我是父类");
}
//父类有参构造
public Test(String name) {
super();
this.name = name;
}
public static void main(String[] args) {
//创建子类对象
Test1 t=new Test1();
//调用子类方法
t.set();
}
}
class Test1 extends Test{
//子类无参构造
public Test1(){}
//子类有参构造
public Test1(String name) {
super(name);
// TODO Auto-generated constructor stub
}
//子类方法---在方法中调用父类方法
public void set() {
get();//相当于super.get()
}
}
调用父类属性:
public class Test {
public String name;
//父类无参构造
public Test() {}
//父类有参构造
public Test(String name) {
super();
this.name = name;
}
public static void main(String[] args) {
//创建子类对象
Test1 t=new Test1();
t.set();
System.out.println(t.name);
}
}
class Test1 extends Test{
//子类无参构造
public Test1(){}
//子类有参构造
public Test1(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public void set() {
//此时相当于super.name
name="alex";
}
}
2)在子类构造器中调用父类构造器
super可以用来在子类构造方法中调用父类的构造方法,格式:super()规定:必须放在方法体的第一条语句中。
注意:(一)
在前面提到过,this()只可以放在方法体中第一句,所以,this()与super()不可以同时使用。
public class Test {
public String name;
//父类无参构造
public Test() {
System.out.println("我是父类无参");
}
//父类有参构造
public Test(String name) {
super();
this.name = name;
System.out.println("我是父类有参");
}
public static void main(String[] args) {
//创建子类对象
Test1 t=new Test1();
}
}
class Test1 extends Test{
//子类无参构造
public Test1() {
super("");
}
//子类有参构造
public Test1(String name) {
super(name);
// TODO Auto-generated constructor stub
}
}
输出结果为:我是父类有参
注意:(二)
this 与 super 都是分别是本类对象与父类对象的引用,简而言之,都是对象的引用,都是非静态的。由于加载与执行顺序等一些列问题,(有关静态的问题过段时间总结)this与super不能在静态成员中使用。
注意:(三)
this关键字不能在super之前使用,代码如下
public class Teacher extends Worker{
public int a=0;
public Teacher() {}
//从子类继承的属性
public Teacher(int salary, String id, String name,int a) {
//此处使用this关键字将会报错,
//this.a=a;
super(salary, id, name);
// TODO Auto-generated constructor stub
}
public void count(int salary) {
System.out.println("教师的工资为:"+(salary+280));
}
}
原因:this在这时是子类对象的引用,super是父类对象的引用,初始化的时候,父类进行初始化之后子类才可以进行初始化,super之前。子类没有初始化,所以不可以使用this关键字。
注意:(四)
this可以直接输出,而super不可以直接输出。
public class Test {
public Test() {}
public void shuchu() {
System.out.println(this);
}
public static void main(String[] args) {
Test t=new Test();
t.shuchu();
}
}
输出结果:com.briup.Test@15db9742
public class Test {
public Test() {}
public void shuchu() {
System.out.println(this);
//这样写会报错
System.out.println(super);
}
public static void main(String[] args) {
Test t=new Test();
t.shuchu();
}
}
class Test1 extends Test{
}
小白笔记--不足请指正。。。。