this关键字、访问修饰符、super关键字
Java关键字this只能用于方法方法体内,而且只能用在非静态方法内。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。
This关键字表示当前对象。
什么是当前对象呢?
谁在调用存在this关键字的方法那么谁就是当前对象。
什么时候使用和什么时候不能使用this呢?
在一个方法内,方法的局部变量与成员变量同名的时候就要使用this关键字,
比如 this . 成员变量,在一个类中也可以通过this关键字调用其它的构造方法,切记只能是在同类中。
如果这个方法用static修饰的话那么这个方法内不能存在this关键字
1 package xiao.li; 2 3 public class this关键字 4 { 5 String name; 6 /* 7 * 无参构造函数 8 */ 9 this关键字() 10 { 11 this("小明"); 12 /* 13 * 通过this调用构造方法, this(参数列表) 14 * 那么 this("小明")==this关键字(String name) 15 * this()==this关键字(); 需要注意的是:在构造方法里面使用this 那么必须是第一句语句.....
16 */ 17 System.out.println("无参构造函数"); 18 } 19 /* 20 * 给成员变量赋值的构造方法 21 * 像这种情况就应该用this关键字来表明那个是成员变量 22 */ 23 this关键字(String name) 24 { 25 this.name=name; 26 } 27 public static void show() 28 { 29 //this.name="小明"; //这样是错误的,因为在静态方法内不能使用this关键字,调用构造方法也不行 30 System.out.println("表演"); 31 } 32 public void eat() 33 { 34 this.name="小明"; 35 System.out.println(this.name+"正在吃饭"); 36 } 37 public static void main(String[] args) 38 { 39 this关键字 t = new this关键字(); 40 t.eat(); //t 这个对象在调用eat方法,那么eat方法内存在this关键字,那么这个this就代表t这个对象。 41 } 42 }
访问修饰符
修饰符 |
类内部 |
同一个包 |
子类 |
任何地方 |
private |
√ |
|||
default |
√ |
√ |
||
protected |
√ |
√ |
√ |
|
public |
√ |
√ |
√ |
√ |
Private:类访问权限,本类内部可以访问,不能继承到子类。
Default:什么都不写,包访问权限:本类内部可以访问,同包其它类也可以访问,同包可继承
Protected:子类访问权限,本类内部可以访问,不同包的子类也可以访问,同包其它类也可以访问,能继承到子类
Public:公共访问权限,任何地方都可以访问,能继承到子类
这些访问修饰符可以修饰类、修饰方法、修饰成员变量
super
■ 表示当前对象的父类对象的一个引用
■ 可以调用当前对象的父类对象的方法/变量
■ 可以调用当前对象的父类对象的构造函数
■ 把当前对象的父类对象的引用作为参数传递给其他方法、
注意:只能在子类的构造方法内使用,而且必须是第一句
关键字super和继承一起建立类和它的父类的紧密联系。继承隐含地指出子类对父类所拥有的访问权限
关键字Super在构造方法的使用中是非常重要的,和方法不同,构造方法是不能继承的;因此super是访问父类中构造方法的惟一途径。在子类的构造方法中用 Super(参数列表);就可以访问父类中的构造方法了
1 package xiao.li; 2 /* 3 * 人类 4 */ 5 class Person 6 { 7 String name; 8 public Person() 9 { 10 System.out.println("我是父类无参构造方法"); 11 } 12 public Person(String name) 13 { 14 this.name=name;//赋值给成员变量 15 System.out.println("我是父类有参构造方法,给成员变量赋值"); 16 } 17 } 18 /* 19 * 学生类继承了人类 20 */ 21 class Student extends Person 22 { 23 public Student() 24 { 25 /* 26 * 这里没有表用调用父类的无参构造方法,其实父类的构造方法是隐式存在的...... 27 * 当子类不指明要调用其它构造方法时则默认执行无参构造方法 28 */ 29 System.out.println("我是子类无参构造方法"); 30 } 31 public Student(String name) 32 { 33 super("小明"); //这句必须在任何一个子类中的构造方法都必须是第一句,不能在非构造方法内使用super关键字 34 super.name=name;// 35 /* 36 * 这里的意思就是调用父类的有参构造方法.... 37 * 这里指明了调用父类有参构造方法 38 */ 39 System.out.println("我是子类有参构造方法,正在给父类成员变量赋值"); 40 } 41 } 42 public class super关键字 { 43 public static void main(String[] args) { 44 45 Student stu1 = new Student();//创建子类stu1对象 46 /* 47 * 创建子类stu1对象的输出结果为: 48 * 我是父类无参构造方法 49 * 我是子类无参构造方法 50 * 为什么呢?又没有在子类的无参构造方法内指明调用父类构造方法, 51 * 因为在创建子类对象的时候就会默认先执行父类的无参构造方法再执行子类的无参构造方法 52 */ 53 Student stu2 = new Student("小明");//创建子类stu2对象 54 /* 55 * 创建子类stu2对象的输出结果为: 56 * 我是父类有参构造方法,给成员变量赋值 57 * 我是子类有参构造方法,正在给父类成员变量赋值 58 */ 59 } 60 }
this和super的区别
区别 |
This |
Super |
使用 |
调用本类中的字段或方法 |
从子类中调用父类的字段或方法 |
构造 |
可以调用本类构造方法且有一个构造方法要作为出口 |
从子类调用父类的构造方法,不管子类如何安排最终一定会调用,默认调用的是父类无参构造方法 |
要求 |
调用自身构造方法时需要放在首行 |
调用父类构造方法时,放在子类构造方法首行 |
特殊 |
表示当前对象 |
表示当前对象的父类 |