观察之前的代码:
Student s = new Student() ;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
s.setStuno("s001") ;
s.setName("张三") ;
s.setMath(<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />90.0f) ;
s.setEnglish(89.0f) ;
s.setComputer(99.0f) ; |
先实例化一个对象,之后通过此对象分别调用setter方法,此时,所有的属性内容是在对象实例化之后才进行设置的,很麻烦,特别希望能否在对象被实例化的同时就把属性的内容赋上,如果要完成此操作就必须通过构造方法完成。
对象的产生格式:Student s = new Student() ;
只要在代码中出现了“()”,就表示调用方法。实际上此方法,就是一个构造方法。
一实例化对象,则构造方法会被自动调用。
在之前的所有代码之中,可以发现并没有构造方法的声明,在JAVA程序中,如果一个类没有明确的声明一个构造方法,则会自动生成一个无参的,什么都不做的构造方法。
Person(){
} |
通过构造方法,为类中的属性初始化
Person(){
name = "noname" ;
age = 0 ;
} |
现在外面对于Person的时候需要设置两个属性,一个是name另外一个是age。
如果在一个类中已经明确的存在了一个构造方法,则不会再自动生成无参的什么都不做的构造方法。
class Person{
// 属性
private String name ;
private int age ;
// 定义一个构造方法
Person(String n,int a){
name = n ;
age = a ;
}
public void setName(String str){
name = str ;
}
public void setAge(int a){
if(a>0&&a<150)
age = a ;
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void talk(){
System.out.println("姓名:"+name+",年龄:"+age) ;
}
};
public class OODemo09{
public static void main(String args[]){
Person p = null ;
p = new Person("张三",30) ;
p.talk() ;
}
}; |
要求:
在person类中最好存在两个构造方法,一个是有参的,一个是无参的。那么此时就需要使用方法重载的概念。
Person(){
name = "noname" ;
age = 0 ;
}
Person(String n,int a){
name = n ;
age = a ;
} |
现在在以下的代码之中又存在了新的问题:
对于一个类而言,所有的属性的设置,最终都要经过setter方法。
class Person{
// 属性
private String name ;
private int age ;
// 定义一个构造方法
// 此构造方法被重载了
Person(){
name = "noname" ;
age = 0 ;
}
Person(String n,int a){
// 在此处调用setter方法,完成设置
this.setName(n) ;
this.setAge(a) ;
}
public void setName(String str){
name = str ;
}
public void setAge(int a){
if(a>0&&a<150)
age = a ;
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void talk(){
System.out.println("姓名:"+name+",年龄:"+age) ;
}
};
public class OODemo09{
public static void main(String args[]){
Person p = null ;
p = new Person("张三",-30) ;
p.talk() ;
}
}; |
练习:
写一个公司员工类
数据成员:
员工号、姓名、薪水、部门
方法:
利用构造方法完成设置信息:
A、单参,只传递员工号,则员工姓名:无名氏,薪水:0,部门:未定
B、双参,传递员工号,姓名,则员工薪水为1000,部门:后勤
C、四参,传递员工号,姓名,部门,薪水
D、无参,则均为空值
显示信息
main方法中:
创建两个对象,分别进行验证。
private String empno ;
private String name ;
private float sal ;
private String dept ;
Employee(){
empno = "" ;
name = "" ;
sal = 0.0f ;
dept = "" ;
}
Employee(String eno){
setEmpno(eno) ;
setName("无名氏") ;
setSal(0.0f) ;
setDept("未定") ;
}
Employee(String eno,String name){
setEmpno(eno) ;
setName(name) ;
setSal(1000.0f) ;
setDept("后勤") ;
}
Employee(String eno,String name,float s,String d){
setEmpno(eno) ;
setName(name) ;
setSal(s) ;
setDept(d) ;
}
public String getInfo(){
return "雇员编号:"+empno+",姓名:"+name+",薪水:"+sal+",部门名称:"+dept ;
}
public void setEmpno(String eno){
empno = eno ;
}
public void setName(String n){
name = n ;
}
public void setSal(float s){
sal = s ;
}
public void setDept(String d){
dept = d;
}
public String getEmpno(){
return empno ;
}
public String getName(){
return name ;
}
public float getSal(){
return sal ;
}
public String getDept(){
return dept ;
}
};
public class Demo10{
public static void main(String args[]){
Employee e = new Employee("e001","张三") ;
System.out.println(e.getInfo()) ;
}
}; |
匿名对象:
匿名:没有名字,无名的对象。
而且此对象只使用一次。
class Person{
// 属性
private String name ;
private int age ;
// 定义一个构造方法
// 此构造方法被重载了
Person(){
name = "noname" ;
age = 0 ;
}
Person(String n,int a){
// 在此处调用setter方法,完成设置
this.setName(n) ;
this.setAge(a) ;
}
public void setName(String str){
name = str ;
}
public void setAge(int a){
if(a>0&&a<150)
age = a ;
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void talk(){
System.out.println("姓名:"+name+",年龄:"+age) ;
}
};
public class OODemo11{
public static void main(String args[]){
new Person("张三",-30).talk() ;
}
}; |
转载于:https://blog.51cto.com/lixinghua/91234