Java中this和super的区别

        this和super是Java中的两个比较特殊的关键字。this表示当前对象,而super表示父类对象,严格来说应该是子类从父类继承过来的部分,包括继承过来的成员变量和成员方法。这两个关键字用于Java类中自己的方法来访问自己的成员变量和自己的成员方法。本次内容介绍如何使用this和super,主要内容如下:

 

1 正常情况下如何访问成员变量和成员方法

       正常情况下,访问某个对象的方法和属性,通过“对象名.属性名”或者“对象名.方法名”访问成员变量和成员方法。

String name;
System.out.println(name.length());

        如果是类自己的方法访问成员变量和成员方法,可以采用如下的方式(setName方法中的代码):

package thisAndSuper;
 
public class Animal {
    protected String id;
    protected String name;
    public void setName(String newname){
       // 正常情况下,应该这样访问成员变量和成员方法
       name = newname;
       print("初始化名字");
    }
    public void print(String message){
      System.out.println("Animal--------"+message);
    }
}

       这里再访问name属性和print方法的时候为什么没有给出对象名呢?因为在编写类的时候不知道对象的名字,因为对象在运行之后才会产生。

       Name属性和print方法应该属于哪个对象呢?应该是当前方法(setName)所属的对象,为了表示这个对象,Java中提供了this关键字用来表示当前对象。可以通过this访问所有的成员变量和成员方法。

2 什么时候需要使用this访问成员和成员方法

       上面的代码中没有使用this访问name属性和print方法,实际上可以通过this访问,上面的setName方法可以写成下面的形式:

public void setName(String newname){
       this.name = newname;
       this.print("初始化名字");
     }

   

        什么时候必须用this呢?

       当局部变量与成员变量重名的时候必须使用this。例如,类中有成员变量id,而方法的参数中也有变量id。看下面的代码:


public Animal(String id){
                  this.id = id;
        }

     如果直接写成id=id,赋值过程无效。

3 什么时候需要使用super访问变量和成员方法

       super表示从父类继承来的成员变量和成员方法,this可以用来访问所有的成员变量和成员方法,包括从父类继承过来的成员变量和成员方法。什么时候必须使用super呢?

      如果父类和子类有同名成员变量或成员方法,默认情况下访问的是子类的,如果希望访问从父类继承的成员,则必须通过super这种方式访问从父类继承过来的成员变量:   

  

public void setParentName(String name){
                  // 调用从父类继承过来的成员变量,如果父类和子类有同名成员变量,则必须通过这种方式访问从父类继承过来的成员变量
                  // super.name = name;
                  // 调用从父类继承过来的成员变量,父类中定义的私有的成员变量和方法是不能访问的
                  super.setName(name);
                 
                  this.print("设置从父类继承过来的成员!");
        }

4 如何使用this访问其他的构造方法

       this还可以用来访问自己的构造方法。用法与调用其它方法不同。下面的代码展示了用法:

 

  public Animal(String id,String name){
                  // 调用自己的构造方法,必须放在方法中的第一行
                  this(id);
                  this.name = name;
        }

      注意:使用this调用自己的构造方法,必须放在构造方法中,并且必须是构造方法的第一行有效代码。

5 如何使用super访问父类的构造方法

要访问父类的构造方法需要使用super,用法与使用this访问自己的构造方法相似:

        

public class Animal{
   protected String id;
   public Animal(Stirngid){
     this.id = id;
   }
}
 
public class Dogextends Animal{
   protectedString name;
   publicDog(String name){
     this.name = name;
   }
}

注意:必须放在构造方法中,并且必须是构造方法中的第一行有效代码。

另外需要注意:必须调用父类构造方法,如果不写,系统会自动调用父类的无参数构造方法。如果父类没有参数构造方法,就会出错。

看看下面的代码会报什么错?

public class Animal{
   protected String id;
   public Animal(Stirngid){
     this.id = id;
   }
}
 
public class Dogextends Animal{
   protectedString name;
   publicDog(String name){
     this.name = name;
   }
}


     下面的例子展示了this和super的用法:

package thisAndSuper;
public class Animal {
        protected String id;
        protected String name;
        public void setName(String newname){
                  // 正常情况下,应该这样访问成员变量和成员方法
                  name = newname;
                  print("初始化名字");
        }
        public Animal(String id){
                  this.id = id;
        }
        public Animal(String id,String name){
                  // 调用自己的构造方法,必须放在方法中的第一行
                  this(id);
                  this.name = name;
        }
        public void print(String message){
                  System.out.println("Animal--------"+message);
        }
}
 
package thisAndSuper;
public class Dog extends Animal{
        public String name;
        public String x;
        public void setName(String name){
                  // 调用自己的成员变量,或者从父类继承过来的成员变量
                  this.name = name;
                  // 调用从父类继承过来的成员方法,也可以使用this.print("设置子类成员");
                  super.print("设置子类成员"); //this.print("设置子类成员");
        }
        public void setParentName(String name){
                  // 调用从父类继承过来的成员变量,如果父类和子类有同名成员变量,则必须通过这种方式访问从父类继承过来的成员变量
                  // super.name = name;
                  // 调用从父类继承过来的成员变量,父类中定义的私有的成员变量和方法是不能访问的
                  super.setName(name);
                  
                  this.print("设置从父类继承过来的成员!");
        }
        public Dog(String id){
                  // 调用父类的构造方法
                  super(id);
        }
        public Dog(String id,String name){
                  // 调用父类的构造方法,必须放在方法中的第一行
                  super(id);
                  this.name = name;
        }
        public void print(String message){
                  System.out.println("Dog--------"+message);
        }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Javathis与super区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。 当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员, 你便可以利用this来实现这个目的。要注意的是this只能在类的非静态方法使用, 静态方法和静态的代码块绝对不能出现this。this也可作为构造函数来使用。在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针, 而这个超类指的是离自己最近的一个父类。super的作用同样是可以作为构造函数使用, 或者是获取被局部变量屏蔽掉的父类对象的某个同名变量的值。 super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见, 或者说用来引用被屏蔽的成员变量和成员成员方法。 作为构造函数使用 super(参数):调用父类的某一个构造函数(应该为构造函数的第一条语句)。 this(参数):调用本类另一种形式的构造函数(应该为构造函数的第一条语句)。 要记住的几个关键点是: 在构造方法this与super不能共存;其次有this或super出现的地方必须是构造方法的第1句; 静态方法,也就是类方法不能有this和super关键字 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. 复制代码 class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();// 调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static void main(String argv[]) { Checket c = new Checket(); } } 复制代码 结果: Base Checket 如果想用super继承父类构造的方法,但是没有放在第一行的话,那么在super之前的语句, 肯定是为了满足自己想要完成某些行为的语句,但是又用了super继承父类的构造方法。 那么以前所做的修改就都回到以前了,就是说又成了父类的构造方法了。 2. 在Java,有时还会遇到子类的成员变量或方法与超类(有时也称父类) 的成员变量或方法同名。因为子类的成员变量或方法名优先级高, 所以子类的同名成员变量或方法就隐藏了超类的成员变量或方法, 但是我们如果想要使用超类的这个成员变量或方法,就需要用到super. 。。。。。。。。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值