Java之final、super详解

作者:金良([email protected]) csdn博客:http://blog.csdn.net/u012176591

Java之final、super详解_第1张图片

1.super

1.1调用父类的构造方法

Java中父类和子类属性的初始化过程是各自独立完成的,虽然构造方法不能够继承,但通过super关键字,在子类构造方法中可以调用父类的构造方法,以便完成父类的初始化。
代码举例:
package bupt.xujinliang.supersample;

public class SuperSample {
	public static void main(String[] args) {
		Teacher john = new Teacher("john",34,"male",3000);
	}

}
class Person {
	private String name;
	private int age;
	private String gender;
	public Person() {
		System.out.println("无参的构造方法");
	}
	public Person (String name,int age,String gender) {
		System.out.println("有参数的构造方法");
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
}
class Teacher extends Person {
	private float salary;
	public Teacher() {
	}
	public Teacher(String name,int age,String gender,float salary) {
		super(name,age,gender);//没有这一行,将调用父类无参构造函数
		this.salary = salary;
	}
}
Teacher类的全参构造方法中,使用super(name,age,gender)调用父类的构造方法Person (String name,int age,String gender),将传递过来的
若在子类的构造方法没有明确指明调用父类构造方法,则系统会自动调用父类无参构造函数方法,即执行super()。
顺便说一句,如果父类已有全参构造方法,但是没有再次写明无参构造函数,则此时父类的无参构造函数将不再存在,不能使用。
当子类的构造方法中没有明确指定调用父类的构造函数时,就会默认调用父类的无参构造函数时,就会出错。
为防止出错,当类中有全参构造函数时,一定要将无参构造函数重写一遍,如上述代码中的Person类。

1.2访问父类的属性和方法

代码:
package bupt.xujinliang.supersample;

public class SuperSample {
	public static void main(String[] args) {
		Teacher john = new Teacher("john",34,"male",3000);
		john.print();
	}

}
class Person {
	private String name;
	private int age;
	private String gender;
	public Person() {
		System.out.println("无参的构造方法");
	}
	public Person (String name,int age,String gender) {
		System.out.println("有参数的构造方法");
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	public void print() {
		System.out.println("name:"+name);
		System.out.println("age:"+age);
		System.out.println("gender:"+gender);
	}
}
class Teacher extends Person {
	private float salary;
	public Teacher() {
	}
	public Teacher(String name,int age,String gender,float salary) {
		super(name,age,gender);
		this.salary = salary;
	}
	public void print() {
		super.print();
		System.out.println("salary:"+salary);
	}
}
通过在子类中使用super做前缀可以引用父类中被子类隐藏(即子类中有与父类同名的属性或方法)的属性或被子类覆盖的方法。
运行截图:
Java之final、super详解_第2张图片

2.final

2.1修饰变量(对象)

使用final修饰的变量,其值不能更改。
使用final修饰的对象(包括数组),表示对象的引用时恒定不变的,但是对象本身的属性是可以改变的。
package bupt.xujinliang.finalsample;

public class FinalSample {
	public static void main(String[] args) {
		final TestClass obj = new TestClass();
		obj.setNum(10);//对象的属性是可以修改的
		obj = new TestClass();//错误,final变量obj不能指向新的对象
	}

}
class TestClass {
	private int num;
	public void setNum(int num) {
		this.num = num;
	}
	public int getNum() {
		return this.num;
	}
}

2.2修饰方法

使用final修饰的方法不能被子类重写。
代码:
class Base {
	public final void method() {
		
	}
}
class Son extends Base {
	public void method () {//错误,无法重写父类的final方法
		
	}
}

2.3修饰类

public final class Base {}
class Son extends Base {} //错误,无法继承final类


你可能感兴趣的:(java,super,final)