首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

为什么这个程序可以运行?解决方法

2012-01-18 
为什么这个程序可以运行?class Person {private String nameprivate int agepublic void setName(String

为什么这个程序可以运行?
class Person {
  private String name;
  private int age;
  public void setName(String name) {
this.name = name;
  }
  public void setAge(int age) {
 this.age = age;
  }
  public int getAge() {
return age;
  }
  public String getName() {

return name;
  }
}

class Student extends Person {
  private String school;
  public String getSchool() {
return school;
  }
  public void setSchool(String school) {
this.school = school;

  }
}
public class TestPerson {
  public static void main(String[] args) {
Student student = new Student();
  student.setName("john");
student.setAge(18);
student.setSchool("SCN");
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getSchool());










  }


}


不是说子类的构造的过程中必须调用基类的构造方法,可是这个程序子类没有构造方法,基类同时也没有构造方法。




















[解决办法]
你是怎么知道基类无构造函数呢??
[解决办法]
"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯,子类构造一定会先执行父类的static代码块,但是从来不是调用什么父类构造方法
所有Java对象在不写extends的情况默认都继承Object对象,而Object对象有public Object(){}的空构造方法,因此上面的类都有默认空的构造方法,“程序子类没有构造方法,基类同时也没有构造方法”这个认识也是错误的
任何Java类都有构造方法
[解决办法]
没有明确指定构造器,系统默认构造器,类似public person(){}如果没有默认你怎么新建对象呢
你在person类加一个public person(String arg){this.name=arg};你就可以看到你想要出现的了,子类会报错
[解决办法]
Java语言中,如果没有显式书写类的构造函数,那么类会自动添加一个默认构造函数。所以,楼主的父类和子类虽然没有明确给出构造函数,但是有默认的构造函数。
《Java编程思想》一书中,作者专门对此作了说明。该书是本好书,我正在啃,也推荐楼主看下。
希望能帮到楼主。:-D
[解决办法]
继承关系,子类有调子类,子类没有就调父类。
[解决办法]

探讨
"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯。。。。。

[解决办法]
子类如果没有写构造方法,会调用父类无参数的构造方法
[解决办法]
没有明确指定构造器,系统默认构造器 如果明确给出就没有默认之说了
[解决办法]
默认继承了无参构造啊!
要不你在Person里写个有写构参,你再Student类里面也写个有参构构,试试!
看能看出问题来不!
[解决办法]
你这种理解是需要条件的,当子类没有覆盖的构造方法的时候会调用继承自父类的构造方法

你子类写个构造方法,父类写个同名构造方法,子类调用难道也自动调用父类构造方法?

你把这个条件给漏掉了,还不是胡扯?

探讨
引用:
"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯。。。。。

这话不是胡扯。。
楼主给的两个类其实是省略了
public Person(){ };
public Student(){super();}
感觉是编译时自动加上的

[解决办法]
探讨
class SuperClass {
private int n;

/*
SuperClass() {
System.out.println("SuperClass()");
}
*/


SuperClass(int n) {
System.out.println("SuperClass(" + n + ")");
thi……

------解决方案--------------------


探讨
你子类写个构造方法,父类写个同名构造方法,子类调用难道也自动调用父类构造方法?

[解决办法]
你们都仔细看看楼主说的自动调用的原文

第一,没有指明条件

第二,没有说明自动调用哪个构造方法

你们这林林总总加上了这么多条件啊,限制啊,那你们怎么说都对喽

一个破子类是否调用父类构造方法的事情,就这么点原理

探讨
引用:
你子类写个构造方法,父类写个同名构造方法,子类调用难道也自动调用父类构造方法?


你还别这么说,如果子类的构造方法第一行没有显示调用任何构造方法的话
还真是自动会调父类的无参构造方法的

[解决办法]
探讨

"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯,子类构造一定会先执行父类的static代码块,但是从来不是调用什么父类构造方法
所有Java对象在不写extends的情况默认都继承Object对象,而Object对象有public Object(){}的空构造方法,因此上面的类都有默认空的构造方法,“程序子类没有构造方法,基类同时也没有构造方法”这个认识也是错误的
任何Java类都……

[解决办法]
如果没有显式书写类的构造函数,那么类会自动添加一个默认构造函数。所以,楼主的父类和子类虽然没有明确给出构造函数,但是有默认的构造函数。
[解决办法]
他这个程序没有static代码块

探讨
引用:

"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯,子类构造一定会先执行父类的static代码块,但是从来不是调用什么父类构造方法
所有Java对象在不写extends的情况默认都继承Object对象,而Object对象有public Object(){}的空构造方法,因此上面的类都有默认空的构造方法,“程序子类没有构造方法,基类同时也……

[解决办法]
0、
1、使用继承,子类的构造方法无需显示地调用父类的构造方法。
注:所有的类都是继承Object对象,而Object对象有public Object(){}的空构造方法。
若一个类没有显示写明自己的constructor,在编译的时候classloader会为导出类执行默认的空参constructor。
2、static函数优先constructor执行。若实例化一个导出类,基类必在先。
给个例子吧
Java code
public class GrandFather {    public GrandFather(){        System.out.println("GrandFather constructor block!");    }    static{        System.out.println("GrandFather static block!");    }}public class Father extends GrandFather{    public Father(){        System.out.println("Father constructor block!");    }    static{        System.out.println("Father static block!");    }}public class Son extends Father{    public Son(){        System.out.println("Son constructor block!");    }    static{        System.out.println("Son static block!");    }    public static void main(String[] args) {        // TODO Auto-generated method stub        Son s = new Son();    }}
[解决办法]
楼主还是多看点书吧。如果你不写构造函数,系统会默认加载一个无参的构造函数,而Student会调用如下构造函数:
Java code
public Student(){ super();}
[解决办法]
探讨

你们都仔细看看楼主说的自动调用的原文

第一,没有指明条件

第二,没有说明自动调用哪个构造方法

你们这林林总总加上了这么多条件啊,限制啊,那你们怎么说都对喽

一个破子类是否调用父类构造方法的事情,就这么点原理


[解决办法]
他自己默认添加有的默认的构造方法!!!系统自己添加
[解决办法]
没有明写构造器的时候,jvm会自动调用默认的构造器的
[解决办法]
还是多看看基础吧
[解决办法]
不些构造时候,其实会添加一个默认的无参构造
[解决办法]
如果在编写一个类时没有编写构造器,系统会提供一个默认无显示参数的构造器。

[解决办法]
没有指定构造器(方法),系统会提供默认无参的构造器(方法)
[解决办法]
不是没有构造方法,是如果自己没有写构造方法的话,系统默认会创建一个不带参数的构造方法,因为你这个程序都是系统默认的构造方法,所以你看不出他们调用的效果


[解决办法]
不过不为类制定构造器,系统会为类提供一个默认的构造器及无参的构造器,这个可以通过class反编译看到。如果你提供了自己的构造器就不会在提供默认的。如果基类只有带参数的构造器,那么子类在构造器重必须显式的调用父类的构造器。
[解决办法]
你把父类Person加一个构造方法
就比如最简单的构造:
public Person(){
System.out.println("子类的构造的过程绝对是调用了基类的构造方法的!");
}
[解决办法]

Java code
public class A {        private A() {    }}public class B extends A {    public B() {       //这里什么也不写 默认调用父类 无参构造方法  什么也不写相当于写了 super()      如果父类无参构造 被私有了当然找不到报错 默认是公有的    }}
[解决办法]
当你不显示构造方法时,系统自动给你构造一个,只是看不见而已. public Person(){} 


子类 Student 也有 默认构造函数, public Student(){} 自动先调用 public Person(){}

热点排行