super关键字的用法有三种:
1. 在子类的成员方法中,访问父类的成员变量。
2. 在子类的成员方法中,访问父类的成员方法。
3. 在子类的构造方法中,访问父类的构造方法。
注:子类构造方法没有显示地调用父类的构造方法,那么编译器会自动为它加上一个默认的super()方法调用。如果父类由没有默认的无参构造方法,编译器就会报错,super()语句必须是构造方法的第一个子句。
public class Demo02Fu {
int num = 20;
public Demo02Fu(){
System.out.println("执行父类无参构造器");
}
public Demo02Fu(int num){
System.out.println("执行父类有参构造器");
}
public void nomalmethod(){
System.out.println("父类成员方法");
}
}
public class Demo02Zi extends Demo02Fu {
int num = 30;
public Demo02Zi(){
super();//调用父类无参构造器
System.out.println("子类无参构造器");
}
public Demo02Zi(int num){
super(20); //调用父类有参构造器
System.out.println("子类有参构造器");
}
public void nomalmethod(){
super.nomalmethod();
System.out.println("子类普通方法");
System.out.println(super.num);
}
}
public class Demo02Extends {
public static void main(String[] args) {
Demo02Zi z = new Demo02Zi(); //这里创建对象会使用构造器进行初试化,这里创建的是子类
//对象,调用子类无参构造方法。但是无参构造方法第一行默
//认带有super(),就去调用父类构造方法;
z.nomalmethod();
Demo02Zi zi = new Demo02Zi(4);//创建子类对象,构造器带有参数。其余的同上
}
}
执行父类无参构造器
子类无参构造器
父类成员方法
子类普通方法
20
执行父类有参构造器
子类有参构造器
this的用法:
1. 在本类的成员方法中,访问本类的成员变量。(this.属性名称 表示访问类中的成员变量,用来区分成员变量和局部变量
在封装中的this.name = name 中的意思就是将方法传递过来的参数(局部变量)name赋值给类中的成员变量name)
2. 在本类的成员方法中,访问本类的另一个成员方法。(this.方法名称 表示访问本类的成员方法)
3. 在本类的构造方法中,访问本类的另一个构造方法。 跳转到这里去
package cn.lpp.yj;
public class Demo05This {
private String name = "Gallagher";
private int age = 24;
//System.out.println(Demo05This.name);//这里的sout中的out是静态方法哦!
public static void main(String[] args) {
String name = "lpp";
System.out.println(name);//当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。输出刘佩佩
/*this.name = "范冰冰"; //这里也是错的,因为你现在在一个静态方法中,静态方法不能调用非静态方法中的成员。除非自己创建对象
使用对象名来调用*/
int age = 25;
System.out.println(new Demo05This().age);//这里使用对象调用静态方法中的成员变量;输出24
new Demo05This().run();
}
public void run() {
String name = "jack马";
System.out.println(name);//这里还是jack马,如上就近原则
System.out.println(this.name);//这里就输出GAllagher了;
}
}
package cn.lpp.yj;
/* 例:this关键字的作用:让类中的一个方法访问该类的另一个方法或者实例变量;----> Dog类
但是在这个例子中是在run方法中创建一个对象然后去调用jump方法。因为没用static修饰的方法要用对象来调用;
下一步我们直接创建一个Dogtest类,在这个类中直接创建对象,然后调用这个方法;*/
public class Dog {
public void jump(){
System.out.println("执行jump方法");
}
public void run(){
Dog d = new Dog();
//这里就是tong
d.jump();
System.out.println("执行run方法");
}
/*看这段话:问题一:在run()方法中调用jump方法,是否一定需要创建一个Dog对象;问题二:是否需要在run方法中重新创建一个Dog对象;
解答:问题一:在这里肯定是需要创建一个Dog对象的,因为jump方法不是static修饰,调用该方法肯定是要用对象去调用;
问题二:这里是不需要的,因为这里再调用run()方法的时候肯定会使用对象来调用,这里的对象就是Dog对象,所以这里已经存在了一个对象
,这样调用jump()方法时就可以使用这个已经存在的对象。这样就可以使用this------>表示调用这个方法的对象;*/
//这样就可以使用下面的方法了:
/* public void run(){
this.jump();
System.out.println("直接通过this来调用方法");
}*/
}
/*生活中一个方法依赖另一个方法是比较常见的:
比如吃饭方法依赖拿筷子方法,写代码方法依赖敲键盘的方法。这些个方法中调用他们的对象都是一个,都是我这个对象;
这样对象中一个成员直接调用另一个成员就可以使用this,也可以省略this直接调用;
引申:在类中的static修饰的成员(方法或者变量)也可以省略前面的类名。类似与不用static修饰的非静态成员而用到的this*/
如有不足的,请一定指出。感恩!!!