构造方法的调用并涉及this、super用法

声明:本人用了别人的例子http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html,自己在此基础上做了小修改并且加全了注释,希望初学的朋友们能受益。

Person.java

package Test1;

class Person {
public String name="not know"; //5   
public int age=0; //6
//父类Person的无参构造方法
public Person(){
}
//父类Person的有参数构造方法
public Person(String name,int age){ //4
//注意调用完super后不会立马执行方法体里面的代码,而是转而执行在类定义时进行的变量初始化
this.name=name; //7
this.age=age; //8
}
public void showInfo(){ //13
System.out.println("Name is :"+name+"Age is :"+age);
}
}
class Student extends Person{
//执行完父类的类定义时变量的初始化,会执行父类构造方法的方法体;然后再执行子类的类定义时变量的初始化
public String school="not known"; //9
   //子类Student的无参构造方法
public Student(){
super();
}
//子类Student的有参构造方法
public Student(String name,int age,String school){ //2
//在构造函数里,首先检查是否有this或super,二者只能出现其一,并且只能作为构造函数的第一句
//在子类的构造函数中调用父类的构造函数用super,并且把参数传递给父类的构造函数

super(name,age); //3
//执行完子类的类定义时变量的初始化,再执行子类构造方法的方法体
this.school=school; //10
}
//子类的方法,用它时需要调用。调用时用(对象名.方法名)方式
public void showInfo(){
super.showInfo(); //12
System.out.println("School is :"+school); //14
}

}

Test.java

package Test1;

//这里权限修饰符是缺省的,其范围是同一个包内的类都可以访问。
class Test {
public static void main(String[] args) {
//实例化对象stu,调用类Student的有参构造方法,并传递参数给构造方法
Student stu=new Student("wanghao",21,"qinghuadaxue");//1
//使用(对象名.方法名)调用showInfo()方法
stu.showInfo();//11
}
}

说明:程序中的序号是代码的执行顺序。

程序运行结果如图:


总结:
一:1、成员函数中定义了和成员变量相同的变量时,引用成员变量用this
        2、构造函数中调用同一个类的其他构造函数用this
        3、子类中覆盖了父类的成员变量或成员函数时,在子类中调用父类的变量或函数用super
        4、在子类的构造函数中调用父类的构造函数用super
二:在构造函数里面,首先检查是否有this和super调用,this调用时完成本类内构造函数之间的调用,super
        是对父类构造函数的调用。二者只能出现其一,并且只能作为构造函数的第一句出现。在调用this和super时
        实现程序的跳转,转而执行被调用的构造函数,当调用构造函数后,程序转而去执行在类定义的时候进行的变量的初始化,这个初始化完成后再去执行构造函数里剩下的代码。

三:Student stu=new Student();叫创建对象,不带参数这种执行时会调用默认的无参构造方法。
        Student stu=new Student("wanghao",21,"qinghuadaxue");叫实例化对象,这种
        带参数的会直接调用程序中有参构造方法。

四:1、构造方法就是实例化对象时调用的方法,完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。

        2、类定义中构造方法都不是无参的构造方法时,编译器不会为类设置一个默认的无参构造方法。当无参构造方法实例化一个对象时,编译器会报错。只有当类中没有定义任何的构造方法时,编译器才会自动创建一个无参构造方法。

        3、一个类被实例化的同时,就会运行相应的构造方法,即便你不写系统也会创建一个默认的构造方法。

        4、Student stu=new Student();new一个方法就是实例化一个对象。

五:PS  当想访问一个方法而不是构造方法时,需要将访问的方法设为static,然后直接使用类名.方法名就可以访问;如果在同一个类中,类名都可以省略,直接写方法名即可。

也可以这样写程序:

Test.java

package Test1;
//一个文件里面可以有多个类,但是只能有一个声明为public标识主类,且该主类里面必须有main()主方法,
class Person {
public String name="not know";//5   
public int age=0;//6
//父类Person的无参构造方法
public Person(){
}
//父类Person的有参数构造方法
public Person(String name,int age){//4
//注意调用完super后不会立马执行方法体里面的代码,而是转而执行在类定义时进行的变量初始化
this.name=name;//7
this.age=age;//8
}
public void showInfo(){//13
System.out.println("Name is :"+name+"Age is :"+age);
}
}
class Student extends Person{
//执行完父类的类定义时变量的初始化,会执行父类构造方法的方法体;然后再执行子类的类定义时变量的初始化
public String school="not known";//9
   //子类Student的无参构造方法
public Student(){
super();
}
//子类Student的有参构造方法
public Student(String name,int age,String school){//2
//在构造函数里,首先检查是否有this或super,二者只能出现其一,并且只能作为构造函数的第一句
//在子类的构造函数中调用父类的构造函数用super,并且把参数传递给父类的构造函数

super(name,age);//3
//执行完子类的类定义时变量的初始化,再执行子类构造方法的方法体
this.school=school;//10
}
//子类的方法,用它时需要调用。调用时用(对象名.方法名)方式
public void showInfo(){
super.showInfo();//12
System.out.println("School is :"+school);//14
}
}
public class Test {
public static void main(String[] args) {
//实例化对象stu,调用类Student的有参构造方法,并传递参数给构造方法
Student stu=new Student("wanghao",21,"qinghuadaxue");//1
//使用(对象名.方法名)调用showInfo()方法
stu.showInfo();//11
}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值