A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周一川 中级黑马   /  2013-4-15 12:26  /  1520 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有这样三个类,Person,Student.GoodStudent。其中Student继承了Person,GoodStudent继承了Student,三个类中只有默认的构造函数,用什么样的方法证明在创建Student类的对象的时候是否调用了Person的构造函数,在创建GoodStudent类的对象的时候是否调用了Student构造函数?如果在创建Student对象的时候没有调用Person的构造函数,那么采用什么样的手段可以调用父类的构造函数?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

5 个回复

倒序浏览
在加载子类的时候java底层会自动加载父类的无参构造函数,只要在无参构造函数里面打印就好了,
  1. public class Test
  2. {
  3.      public static void main(String []args)
  4.      {
  5.              GoodStudent GS = new GoodStudent();
  6.      }
  7. }   

  8. class Student extends Person
  9. {
  10.         Student(){
  11.                 System.out.println("Student");
  12.                 }
  13. }
  14. class  Person
  15. {
  16.         Person(){
  17.                 System.out.println("Person");
  18.                 }
  19. }
  20. class GoodStudent extends Student
  21. {
  22.         GoodStudent(){
  23.                 System.out.println("GoodStudent");
  24.                 }
  25. }
复制代码
这是类的加载问题,自己动手试一下就知道了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
证明有没有调用,直接在构造函数里整个输出语句就行,如果没有调用,使用super.Student()和super.Person(),super就是父类的意思
回复 使用道具 举报
默认的构造函数就是无参的构造函数,例子
  1. public class Test2 {
  2.         public static void main(String[] args) {
  3.                 new Student();
  4.                 System.out.println("**********************");//分隔条
  5.                 new GoodStudent();
  6.         }
  7. }


  8. class Person{
  9.         Person(){
  10.                 System.out.println("person的构造函数");
  11.         }
  12. }


  13. class Student extends Person{
  14.         Student(){
  15.                 System.out.println("Student的构造函数");
  16.         }
  17. }

  18. class GoodStudent extends Student{
  19.         GoodStudent(){
  20.                 System.out.println("GoodStudent的构造函数");
  21.         }
复制代码
结果
  1. person的构造函数
  2. Student的构造函数
  3. **********************
  4. person的构造函数
  5. Student的构造函数
  6. GoodStudent的构造函数
复制代码
就是说当你new Student();它会调用父类Person的构造函数;new GoogStudent()时,它会调用Student父类构造函数,当调用student构造函数时会调用person的构造函数,也就是说GoogStudent会调用它所用父类的构造函数;不存在不会调用父类构造函数的情况

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 乘鱼飞 于 2013-4-15 12:55 编辑

class Person
{
        protected Person()
        {
                System.out.println("我是Person类,这是我的无参构造器");
        }
        
}
class Student extends Person
{
        protected Student() {
                System.out.println("我是Student类,这是我的无参构造器");
        }

}
class GoodStudents extends Student
{
        protected GoodStudents()
        {
                System.out.println("我是GoodStudents类,这是我的无参构造器");
        }

}
public class Test_Stu {
        public static void function(Object obj)
        {
                if(obj instanceof Student )
                {
                        Student sc1=new Student();
                        
                }
                else if(obj instanceof GoodStudents )
                {
                        GoodStudents sc2=new GoodStudents();
                        
                }
                else if(obj instanceof Person )
                {
                        Person sc3=new Person();
                        
                }
        }
        
        public static void main(String[] args) {
                       
                function(new Student());//调用Person构造器和Student构造器
                //function(new GoodStudents());//调用Student构造器和GoodStudents构造器
        }
}
输出结果:
我是Person类,这是我的无参构造器
我是Student类,这是我的无参构造器
我是Person类,这是我的无参构造器
我是Student类,这是我的无参构造器



评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  1. class Person{
  2.         public Person(){
  3.          System.out.println("Person");
  4.         }
  5.        }
  6.        class Student extends Person{
  7.         public Student(){
  8.          System.out.println("Student");
  9.         }
  10.        }
  11. class GoodStudent extends Student{
  12.         public GoodStudent(){
  13.          System.out.println("GoodStudent");
  14.         }
  15.        }
  16.        public class Test6{
  17.         public static void main(String args[]){
  18.         Student s = new Student();
  19.         System.out.println("===================");
  20.          GoodStudent gs=new GoodStudent();
  21.         }
  22. }
复制代码
运行结果:
Person
Student
===================
Person
Student
GoodStudent


这也就说明继承以后都是默认调用的

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马