3.Java值传递与引用传递( 四 )


上图类中name表示传递过来的形参值,this.name代表当前类的属性,super.name表示当前类继承的那个父类的属性name 。所以通过super关键字可以调用父类的属性 。
同理方法也可以这样调用,如下(如果方法用修饰,则无法被子类调用,因为私有的方法无法被调用,只允许所在类使用)
public class Person {public void print(){//题外话,此处如果用private修饰,则无法被Student类调用,因为私有的方法无法被调用,只允许所在类使用System.out.println("父类的方法");}}------------------------------------------------public class Student extends Person {public void print(){System.out.println("子类的方法");}public void test(){print();//子类的方法this.print();//子类的方法super.print();//父类的方法}}------------------------------------------------public class Application {public static void main(String[] args) {Student student = new Student();student.test();}}
此处另一个知识点,称为隐藏的代码,上方的类是使用的是无参的实例化代码,所以与类不需要显式定义无参构造函数,但是这个无参的构造函数实际上也是被调用了的,
本文章知识点2讲了java构造器,new 本质是在调用构造方法,初始化对象的值;所以想知道到底是父类还是子类的构造器先被调用呢?结果是父类的构造器先执行,测试代码如下:
public class Person {public Person(){System.out.println("父类的构造器");}}------------------------------------------public class Student extends Person {public Student(){System.out.println("子类的构造器");}}--------------------------------------------public class Application {public static void main(String[] args) {Student student = new Student();/*此类输出结果:父类的构造器子类的构造器 */}}
可以看到上方只new了一个子类,但是却是先调用了父类的无参构造,所以可以判断出类的无参构造器中肯定隐藏了一个调用父类无参构造器的方法,而且这个方法是在
.out.("子类的构造器");之前执行,这个代码就是super(); 所以调用父类的构造器必须要放在子类构造器的第一行 。
所以类实际上就是
public class Student extends Person {public Student(){super();//隐藏代码,调用了父类的无参构造,此处不写也是默认调用父类的无参构造,也可调用父类的有参构造,比如super("张三");//this();//this()意思是调用本类的无参构造,但是super与this不能同时调用构造方法,因为两者都要求放在第一行,所以不可同时出现System.out.println("子类的构造器");//super();//如果放在这会提示:Call to 'super()' must be first statement in constructor body//意思是对“super()”的调用必须是构造函数体中的第一条语句}}
这个super与this关键字经常出现在各种jar包的源码里,所以必须了解,不至于看到啥也不明白 。
总结:
7.Java方法重写
重写都是针对方法的,是从继承角度来实现的,父类的成员方法只能被它的子类重写,重写与属性无关 。另外重写跟静态方法没有关系,代码如下 。
public class Person {public static void test(){//使用static修饰System.out.println("父类");}}--------------------------------------------------public class Student extends Person {public static void test(){System.out.println("子类");}}---------------------------------------------------public class Application {public static void main(String[] args) {Student student = new Student();student.test();Person person = new Student();//父类的引用指向子类person.test();}}/*输出:子类父类*/