书接上回,讲到那private封装属性可以让类的属性仅可在类中被访问,又简单的写了setter与getter的方法。那么,对于封装的初步认识到这里就结束了。
5.构造方法
在对对象实例化的过程中想要对对象进行一些初始化操作,如设定属性初始值等。想要实现这些功能,就需要在类中定义构造方法。
构造方法的定义原则是:
- 方法名必须与类名相同
- 可以有 0 个、1 个或多个参数
- 没有任何返回值,包括 void
- 默认返回类型就是对象类型本身
- 只能与 new 运算符结合使用
来源地址
下面这个例子在Cat类中定义了一个构造方法:
package com.test.java;
class Cat
{
public Cat()
{
System.out.println("wwwwwwwwwwwww");
}
}
public class Testb
{
public static void main(String args[])
{
Cat Naicha = new Cat();
}
}
运行结果:
wwwwwwwwwwwww
可以看出,在main方法中实例化了一个对象Naicha,并且同时执行了构造方法中的内容。
如果我们将构造方法像普通方法一样调用会如何?
看下方的例子:
...
public class Testb
{
public static void main(String args[])
{
Cat Naicha = new Cat();
Cat.Cat();
}
}
不出所料,果然无法正常运行
这是因为,构造方法是一类特殊的方法,当Java把这个方法识别为构造方法时,就已经决定了这个方法只会在该类被实例化时执行。
那么在我们之前实现的Dog类(详见上一篇)中也添加一个构造方法,并且利用setter来为属性赋值:
class Dog
{
private String name;
private double age;
public void setName(String n1)//setter部分
{
name = n1;
}
public void setAge(double a1)//setter部分
{
if (a1 > 0)
{
age = a1;
}
}
public String getName()//getter部分
{
return name;
}
public double getAge()//getter部分
{
return age;
}
public void getDogInfo()
{
System.out.println("狗的名称:" + name + ",年龄:" + age);
}
public Dog(String n2,double a2)//构造方法
{
setName(n2);
setAge(a2);
}
}
public class Testa
{
public static void main(String args[])
{
Dog d1 = new Dog("Steve",3.5);//声明以及实例化对象
d1.getDogInfo();//调用方法获取信息
d1.setName("Alex");
d1.setAge(1.5);
d1.getDogInfo();//调用方法获取信息
}
}
运行结果如下:
狗的名称:Steve,年龄:3.5
狗的名称:Alex,年龄:1.5
可以看到,构造方法成功赋值。
不过,也可以不使用setter方法直接对属性操作,这里不做演示。
构造方法也属于方法,可以进行重载:
class Dog
{
...
public Dog(String n2,double a2)
{
setName(n2);
setAge(a2);
System.out.println("两个参数");
}
public Dog(String n2)
{
setName(n2);
System.out.println("一个参数");
}
public Dog()
{
System.out.println("无参数");
}
}
public class Testa
{
public static void main(String args[])
{
Dog d1 = new Dog("Steve",3.5);//声明以及实例化对象
Dog d2 = new Dog("Alex");
Dog d3 = new Dog();
d1.getDogInfo();
d2.getDogInfo();
d3.getDogInfo();
}
}
运行结果如下:
两个参数
一个参数
无参数
狗的名称:Steve,年龄:3.5
狗的名称:Alex,年龄:0.0
狗的名称:null,年龄:0.0
很好,与原定计划一致。
6.匿名对象
7.简单Java类
简单Java类是一种在实际开发中最常用的形式,对于简单Java类有以下基本开发需求:
- 类的名称需要存在意义
- 所有属性必须由private封装并且要求提供setter、getter
- 可以提供任意多个构造方法,但是必须保留一个无参构造方法
- 类中不允许出现输出语句,所有信息输出必须交由调用处输出
- 类中需要提供一个取得对象完整信息的方法,可定为getInfo(),返回String类型数据
为了巩固知识点,我们将构建一个简单java类,运用之前所讲的大部分内容。
既然之前已经多次使用Dog类,那么就构建一个狗的类
包含以下信息:
- 姓名
- 性别
- 年龄
- 编号
- 主人名字
看以下代码:
class Dog
{
private String name;
private String sex;
private String number;
private String masterName;
private String male = "male";//预置性别字符串
private String female = "female";
private double age;
public Dog(){}//明确定义无参构造方法
public Dog(String tname, double tage, String tsex, String tnumber, String tmasterName)//有参构造
{
setName(tname);
setAge(tage);
setSex(tsex);
setNumber(tnumber);
setMasterName(tmasterName);
}
/* setter部分 */
public void setName(String n1)
{
name = n1;
}
public void setAge(double a1)
{
if (a1 > 0)
{
age = a1;
}
}
public void setSex(String s1)
{
if (s1.equals(male)|s1.equals(female))//比较输入内容
{
sex = s1;
}
}
public void setNumber(String nb1)
{
number = nb1;
}
public void setMasterName(String msn1)
{
masterName = msn1;
}
/* getter */
public String getName()
{
return name;
}
public double getAge()
{
return age;
}
public String getSex()
{
return sex;
}
public String getNumber()
{
return number;
}
public String getMasterName()
{
return masterName;
}
public void getDogInfo()
{
System.out.println("狗的名称:" + name + ",年龄:" + age + ",性别:" + sex + ",编号:" + number + ",主人名字:" + masterName);
}
}
public class Testa
{
public static void main(String args[])
{
Dog d1 = new Dog("旺财",1.6,"male","001","张三");
d1.getDogInfo();
}
}
运行结果:
狗的名称:旺财,年龄:1.6,性别:male,编号:001,主人名字:张三
很好,与预期结果相同。
那么这一阶段的Java学习就算是完成了,在这两篇文章中,记录了一些关于类与对象的基本知识,相信无论是预习还是复习,这个笔记都能让读者有所收获。