Java中super关键字

//父类Animal
public class Animal {
	/* private :只允许在本类中进行访问
	 * public: 允许在任意位置访问
	 * protected:允许在当前类、同包子类/非子类、跨包子类调用;跨包非子类不允许
	 * 默认:允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用
	 */
    private String name;     //昵称(实例变量)
	protected int month;        //月份(实例变量)
	String species;  //品种       //实例变量(默认级别)
	public int temp=15;         //成员变量
	private static int st1=22;  //静态变量
	public static int st2=23;   //静态变量
	
	
	static {
		System.out.println("我是父类的静态代码块");
	}
	{
		System.out.println("我是父类的构造代码块");
	}
	
	//无参构造方法
	//父类的构造不允许被继承、不允许被重写,但是会影响子类对象的实例化过程
	  public Animal(){
		month=2;
		System.out.println("我是父类的无参构造方法");
		}
	
	//带参构造方法
	public Animal(String name,int month) {
		System.out.println("我是父类的带参构造方法");
	}

	public String getName() { 
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		this.month = month;
	}

	public String getSpecies() {
		return species;
	}

	public void setSpecies(String species) {
		this.species = species;
	}
	
	//吃东西
	public void eat() {
		System.out.println(this.getName()+"在吃东西");
	}
	
	public void eat(String name) {
		System.out.println(name+"在吃东西");
	}
	public Animal jump() {
		System.out.println("运动跳跃是一种本能");
		return new Animal();
	}
	

}





//子类Cat
public class Cat extends Animal{
	private double weight;      //体重
	public static int st3=44;
	
	
	static {
		System.out.println("我是子类的静态代码块");
	}
	{
		System.out.println("我是子类的构造代码块");
	}
	
	//无参构造方法
	public Cat() {
		System.out.println("我是子类的无参构造方法");
	}
	
	//带参构造方法
	public Cat(String name,int month) {
		/* 子类构造默认调用父类无参构造方法
		 * 可以通过 super() 调用父类允许被访问的其他构造方法
		 * super() 必须放在子类构造方法有效代码 第一行
		 */
		System.out.println("我是子类的带参构造方法");
	}
	
	public void setWeight(double weight) {
		this.weight=weight;
	}
	public double getWeight() {
		return weight;
	}
	
	//跑动的方法
	public void run() {
		System.out.println(this.getName()+"是一只"+this.getSpecies()+",它在快乐地奔跑");
	}

}





//测试
public class TestTwo {
	public static void main(String[] args) {
     	Cat one=new Cat("花花",2);
	    System.out.println(one.temp);
	}
	
}


测试结果:
我是父类的静态代码块
我是子类的静态代码块
我是父类的构造代码块
我是父类的无参构造方法
我是子类的构造代码块
我是子类的带参构造方法
15

 也就是说,子类构造默认调用父类无参构造方法,若希望调用父类带参构造方法时,需要用到super关键字,并将它放在子类带参构造方法有效代码的第一行。

//父类Animal
public class Animal {
	/* private :只允许在本类中进行访问
	 * public: 允许在任意位置访问
	 * protected:允许在当前类、同包子类/非子类、跨包子类调用;跨包非子类不允许
	 * 默认:允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用
	 */
    private String name;     //昵称(实例变量)
	protected int month;        //月份(实例变量)
	String species;  //品种       //实例变量(默认级别)
	public int temp=15;         //成员变量
	private static int st1=22;  //静态变量
	public static int st2=23;   //静态变量
	
	static {
		System.out.println("我是父类的静态代码块");
	}
	{
		System.out.println("我是父类的构造代码块");
	}
	
	//无参构造方法
	//父类的构造不允许被继承、不允许被重写,但是会影响子类对象的实例化过程
	  public Animal(){
		month=2;
		System.out.println("我是父类的无参构造方法");
		}
	
	//带参构造方法
	public Animal(String name,int month) {
		System.out.println("我是父类的带参构造方法");
	}

	public String getName() { 
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		this.month = month;
	}

	public String getSpecies() {
		return species;
	}

	public void setSpecies(String species) {
		this.species = species;
	}
	
	//吃东西
	public void eat() {
		System.out.println(this.getName()+"在吃东西");
	}
	
	public void eat(String name) {
		System.out.println(name+"在吃东西");
	}
	public Animal jump() {
		System.out.println("运动跳跃是一种本能");
		return new Animal();
	}
	

}





//子类Cat
public class Cat extends Animal{
	private double weight;      //体重
	public static int st3=44;
	
	
	static {
		System.out.println("我是子类的静态代码块");
	}
	{
		System.out.println("我是子类的构造代码块");
	}
	
	//无参构造方法
	public Cat() {
		System.out.println("我是子类的无参构造方法");
	}
	
	//带参构造方法
	public Cat(String name,int month) {
		/* 子类构造默认调用父类无参构造方法
		 * 可以通过 super() 调用父类允许被访问的其他构造方法
		 * super() 必须放在子类构造方法有效代码 第一行
		 */
        super(name,month);
		System.out.println("我是子类的带参构造方法");
	}
	
	public void setWeight(double weight) {
		this.weight=weight;
	}
	public double getWeight() {
		return weight;
	}
	
	//跑动的方法
	public void run() {
		System.out.println(this.getName()+"是一只"+this.getSpecies()+",它在快乐地奔跑");
	}

}





//测试
public class TestTwo {
	public static void main(String[] args) {
     	Cat one=new Cat("花花",2);
	    System.out.println(one.temp);
	}
	
}


测试结果:
我是父类的静态代码块
我是子类的静态代码块
我是父类的构造代码块
我是父类的带参构造方法
我是子类的构造代码块
我是子类的带参构造方法
15

上一篇:每日总结16


下一篇:Java面向对象之什么是继承?