黑马程序员技术交流社区

标题: 这是什么情况啊。 [打印本页]

作者: 黄昆    时间: 2012-6-23 10:46
标题: 这是什么情况啊。
本帖最后由 hkylp 于 2012-7-1 09:09 编辑

定义了一个类User
  1. package com.do;

  2. import java.io.Serializable;
  3. import java.util.Date;


  4. public class User implements Serializable {
  5.         private String username;
  6.         private String passWord;
  7.         private String id;
  8.         private String email;
  9.         private Date borthday;
  10.         User(){}
  11.         public String getUsername() {
  12.                 return username;
  13.         }
  14.         public void setUsername(String username) {
  15.                 this.username = username;
  16.         }
  17.         public String getPassWord() {
  18.                 return passWord;
  19.         }
  20.         public void setPassWord(String passWord) {
  21.                 this.passWord = passWord;
  22.         }
  23.         public String getId() {
  24.                 return id;
  25.         }
  26.         public void setId(String id) {
  27.                 this.id = id;
  28.         }
  29.         public String getEmail() {
  30.                 return email;
  31.         }
  32.         public void setEmail(String email) {
  33.                 this.email = email;
  34.         }
  35.         public Date getBorthday() {
  36.                 return borthday;
  37.         }
  38.         public void setBorthday(Date borthday) {
  39.                 this.borthday = borthday;
  40.         }
  41.         
  42. }
复制代码
然后在另外一个包中要创建一个User 对象为什么不能编译通过呢。。。提示要给User的构造方法加Public 附上代码。。  求解啊。
  1. package com.use
  2. import com.do.*;
  3. public class Demo{
  4. public  static void main(String[] args){
  5.      User user = new User();//为什么编译不能通过??
  6. }
  7. }
复制代码
然后我把 User 的构造方法给删除了 让系统给他加一个构造方法 竟然能编译通过。 这是什么原因啊??求解释。。
作者: 黄连兵    时间: 2012-6-23 11:21
你自定义的User(){};构造函数里面什么都没有写,没有给对象进行相应的初始化。也就是说创建这个User类对象的时候,什么东西都没有拿到。
你删除后User(){};系统对新创建的对象进行各个参数默认初始化。
作者: 薄炳鑫    时间: 2012-6-23 12:00
java中构造器的执行过程是这样的:
1.分配对象空间,并将对象中的成员初始化为空或者0。
2.执行属性值显示初始化。
3.执行构造器。
4.将变量关联到堆中的对象上。

而你这个空的构造器,将会是构造器执行的第一步都不能满足,所以会报错。
当你删除这个构造器后,系统将会调用他的默认构造器对对象进行初始化,所以能够编译通过。
作者: qq3356441    时间: 2012-6-23 12:07
`访问权限的问题,在这里面只能访问比自己高或平级的权限,主方法的权限是public class Demo{}//最大权限。
而你给出的是User(){},默认就是default权限所以会失败。
作者: 黄昆    时间: 2012-6-23 15:40
qq3356441 发表于 2012-6-23 12:07
`访问权限的问题,在这里面只能访问比自己高或平级的权限,主方法的权限是public class Demo{}//最大权限。 ...

额,看了这么多久这个有道理。
作者: oracleserver    时间: 2012-6-24 22:34
本帖最后由 oracleserver 于 2012-6-24 22:35 编辑

java与C#相似,在没有定义构造方法的时候都有个默认的构造方法即:class A{},如果在javaBean中定义了构造方法,在使用javaBean创建对象的时候就必须要把构造方法的参数带进去。一般写的时候我们会写两个构造方法,一个无参数的,即:calss A{},另外一个就看你的需求来定了。class A(String heima){this.heima=heima}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2