编程语言
首页 > 编程语言> > java全栈系列之JavaSE-面向对象(super详解)036

java全栈系列之JavaSE-面向对象(super详解)036

作者:互联网

super和this之间的关系

super代表父类的属性,this代表当前类的属性

子类调用父类时this和super的区别

package Test_Demo4;
import Test_Demo1.Demo13;
public class Demo1 {
    public static void main(String[] args) {
        Demo3 D= new Demo3();	//实例化对象
        D.Print("李四");		//调用Print方法时传参
    }
}
class  Demo2{				//创建Demo2父类,并创建父类属性name
    String name="张三";

    public Demo2(){			//显式构造方法,名字与类名一致且没有返回值

    }
}
class Demo3 extends Demo2{	//创建Demo3并继承Demo2的属性和方法
    String name="王二";		//定义类变量
    public void Print(String name){	//创建输出方法,定义形式参数name
        System.out.println(this.name);	//this.name是当前类下的name
        System.out.println(super.name);	//super是父类的name属性
        System.out.println(name);		//形式参数name
    }
}

执行结果:

王二
张三
李四

子类调用父类的方法时this和super的区别

package Demo1;
public class Demo001 {
    public static void main(String[] args) {
        Demo003 D3=new Demo003();		//实例化对象
        D3.test();						//调用Demo003下的test()方法

    }
}
class Demo002{		//定义Demo002方法用作父类
    String name="张三";	//定义实例变量赋予初始值
    public void demo(){	//定义公共方法
        System.out.println(this.name);	//输出当前类中的name属性
    }
}
class Demo003 extends Demo002{		//定义Demo003用于继承Demo002的属性和方法
    String name="李四";		//定义实例变量赋予初始值
    public void demo(){		//定义公共方法
        System.out.println(this.name);	输出当前类中的name属性
    }
    public void test(){	//创建测试方法用于实现方法的调用
        this.demo();	//调用当前类的demo()方法
        super.demo();	//调用父类的demo()方法
        demo();			//调用公共类的demo()方法
    }
}

执行结果:

李四
张三
李四

父类方法的调用

使用继承的时候如果要继承父类的方法需要在前面的修饰符加上public(公共的)才能够使子类继承父类的方法
在这里插入图片描述
如果子类在继承父类的方法或者属性时,前面的修饰符为private(私有的)时则子类无法直接进行调用或者操作
在这里插入图片描述
父类属性前加修饰符private子类无法直接调用
在这里插入图片描述
使用get/set方法进行私有属性方法调用

虽然无法直接调用父类的private属性,但是可以通过get/set方法进行调用和修改

public class Demo004 {
    public static void main(String[] args) {
            Demo007 D7=new Demo007();		//实例化对象
            String s1=D7.getName();			//将D7.getName()方法赋值于s1属性
        	System.out.println(s1);			//输出s1
    }
}
class Demo006{				//定义Demo006类
    private String name="许志滨2";	//定义私有属性
    private void demo006(){			//定义私有方法
        System.out.println(this.name);
    }

    public String getName() {		//定义getName()方法
        return name;
    }

    public void setName(String name) {	//定义setName()方法
        this.name = name;
    }
}
class Demo007 extends Demo006{		//定义Demo007类用于集成Demo006
    public Demo007(){
								//构造方法,不写默认也会有
    }
}

执行结果:许志滨2

为什么没有输出两次许志滨2,因为只是调用了name属性,并未调用demo006的方法

使用set方法对私有属性进行修改

Demo007 通过继承Demo006类使用set()方法将私有属性进行修改

package Demo1;
public class Demo004 {
    public static void main(String[] args) {
            Demo007 D7=new Demo007();
            D7.setName("许志滨666");		//调用时传实际参数
            D7.demo006();				//调用demo006公共方法

    }
}
class Demo006{
    private String name="许志滨2";		//定义私有属性
    public void demo006(){				//定义公共方法
        System.out.println(this.name);	//输出当前类name的值
    }
    public void setName(String name) {		//创建set方法
        this.name = name;
    }
}
class Demo007 extends Demo006{		//继承
    public Demo007(){

    }
}

注意:父类的私有方法无法被继承

无参构造器的调用

package Demo1;
public class Demo008 {
    public static void main(String[] args) {
        new demo010();		//调用无参构造
    }
}
class demo009{
    public demo009(){		//定义无参构造
        System.out.println("demo009");
    }
}
class demo010 extends demo009{	//继承demo009
    public demo010(){		//定义无参构造
        System.out.println("demo010");
    }
}

执行结果:

demo009
demo010

在demo010构造方法中隐形的在首部调用了父类的构造方法

class demo010 extends demo009{
    public demo010(){
        super();	//隐形在首部调用了父类的构造方法
        System.out.println("demo010");
    }
}

且super();会默认的被隐形添加,只能写在构造方法的首部
在这里插入图片描述

小结

super调用父类的构造方法,必须在构造方法的首部
super必须只能出现在子类的方法或者构造方法中
super和this不能同时调用构造方法
this没有继承关系也可以进行调用,super只能在有继承条件下才能使用
this本类构造,super父类构造

标签:调用,java,name,class,全栈,父类,036,public,String
来源: https://blog.csdn.net/xuzhibin666/article/details/119464891