第九讲 构造方法
1 关于Set方法的补充
public class SetTest {
private int age;
public int num;
public void setAge ( int ageT) {
if ( ageT > 100 || ageT < 0 ) {
System. out. println ( "年龄不合法!!" ) ;
return ;
}
age = ageT;
}
public int getAge ( ) {
return age;
}
}
public class TestSet
{
public static void main ( String[ ] args)
{
SetTest st = new SetTest ( ) ;
st. num = 1000 ;
st. setAge ( 20 ) ;
st. setAge ( 1000 ) ;
st. setAge ( - 1000 ) ;
System. out. println ( st. getAge ( ) ) ;
}
}
关于private
在同一个类中,private修饰的方法是可以被其他方法调用的。但是如果要在其他类中调用另一个类中的private修饰的成员方法,则编译不通过。这也说明,private是私有的,只属于定义该方法的类的对象所有。
public class PrivateTest
{
private int id;
private void test ( ) {
System. out. println ( "0.00.0.0.0.0.0.00" ) ;
}
public static void main ( String[ ] args) {
PrivateTest pt = new PrivateTest ( ) ;
pt. test ( ) ;
System. out. println ( pt. id) ;
}
}
public class Test01
{
public static void main ( String[ ] args)
{
PrivateTest pt = new PrivateTest ( ) ;
pt. test ( ) ;
}
}
2 构造方法
类是一个抽象的概念,类中有成员方法和成员属性。成员属性是该类共有的属性描述,成员方法是该类共有的行为描述。类需要我们抽象出来,抽象的依据就是这一类事物的共性。比如说:人类,那么就应该抽象人类的共性,不能把动物的一些特有的属性放进来。成员也一样。
对象,是类的实例,我们定义好类以后,就需要产生对象,否则类没有意义。
如何生成对象?
类名 引用变量名 = new 类名();
比如人类:Person person = new Person();
标识符();这种方式一般都是方法。我说的是一般情况下,有特殊情况,这个以后再说。
那么:Person(),这就是一个方法。
上节课我们说过:new Person();只要这个语句被执行,就会在堆内存中产生对象。
new是一个关键字,也是一个运算符。
要生成对象,就要有一个可以生产对象的地方,在java中只存在两个部分的内容,一个是成员属性,一个是成员方法。那么生成对象,产生对象,是一个动作,是一个业务逻辑,是一种行为。那么对象肯定是在方法中产生。
产生对象的方法叫做构造方法,也叫作构造器。"Constructor"
public class Constructor01
{
private int id;
private String name;
public int getId ( ) {
return id;
}
public void setId ( int cid) {
id = cid;
}
public String getName ( ) {
return name;
}
public void setName ( String cName) {
name = cName;
}
}
public class Test01
{
public static void main ( String[ ] args)
{
Constructor01 c01 = new Constructor01 ( ) ;
c01. setId ( 100 ) ;
System. out. println ( c01. getId ( ) ) ;
}
}
如果我们没有写任何的构造方法,系统会默认提供一个无参的构造器。
我们来看看当前我们知道的构造器是系统默认的无参数的:
Constructor01( ) ;
这个方法名,与类名一样。-------- ( 1)
这个方法有返回值吗?
有 / 没有
这个方法有什么用?
1) new Constructor01( ) 这个被执行的时候,会在堆内存中开辟一块空间,用来存放具体的对象,给对象的成员属性赋初值,赋默认值。
2) 如果,我们写了有参数的构造器,那么执行完构造方法后,对象的成员属性就会被赋值。
public Constructor01 ( ) {
}
public Constructor01 ( int cid, String cName) {
id = cid;
name = cName;
}
以上是构造方法的写法,分析一下该方法的定义:
1. 方法名和类名一致
2. 方法没有返回值类型
3. 它可以有参数,也可以没有参数,是一个重载了的方法
4. 它的参数个数最少0 个,最多只能是成员属性的个数。如果超出了成员属性参数个数的范围,编译报错。
5. 它的参数列表中的形参类型一定要和成员属性的参数类型匹配。否则编译报错。
构造方法的作用:
1. 在堆内存中生成对象
2. 给对象的成员属性赋初始值
3. 如果是无参的构造,那么成员属性被赋默认值( 基础数据类型的默认值是什么样的?( 课后自己去测) 。引用数据类型的初始值是什么样的?-- - null)
4. 只有构造器被执行以后,才会生成对象。所它极其重要。
一个神奇的现象:
代码如下:我们定义了一个有参的构造器,没有写无参的构造器。
public class Constructor01
{
private int id;
private String name;
public Constructor01 ( int cid, String cName) {
id = cid;
name = cName;
}
public Constructor01 ( int cid) {
id = cid;
}
public int getId ( ) {
return id;
}
public void setId ( int cid) {
id = cid;
}
public String getName ( ) {
return name;
}
public void setName ( String cName) {
name = cName;
}
public String toString ( ) {
return "{" + id + ", " + name + "}" ;
}
}
public class Test01
{
public static void main ( String[ ] args)
{
Constructor01 c01 = new Constructor01 ( ) ;
Constructor01 c02 = new Constructor01 ( 1 , "zhangsan" ) ;
Constructor01 c03 = new Constructor01 ( 122 ) ;
System. out. println ( c01) ;
System. out. println ( c02) ;
System. out. println ( c03) ;
}
}
E:\java基础\day05-1>javac Test01.java
Test01.java:5: 错误: 对于Constructor01(没有参数), 找不到合适的构造器
Constructor01 c01 = new Constructor01();
^
构造器 Constructor01.Constructor01(int,String)不适用
(实际参数列表和形式参数列表长度不同)
构造器 Constructor01.Constructor01(int)不适用
(实际参数列表和形式参数列表长度不同)
1 个错误
构造方法是一个重载的方法,如果我们在类中没有定义构造方法,系统会默认有一个没有参数也叫作无参构造。
如果,我们定义了一个有参的构造方法,没有定义无参的构造方法,那么系统不再给默认的无参构造。编译的时候,系统会屏蔽掉无参的默认构造,只会去找我们定义的有参构造。
记住:如果我们没有手动定义无参构造,而又定义了其他有参构造,系统将不会再给出默认的无参构造。无参就不会存在,我们也不能在代码中使用该无参构造。
记住:正常情况下,我们都需要定义无参构造,然后再定义自己想要的有参构造。(Overload)
只要满足构造方法的定义条件(参数列表中参数的个数最多不能超过成员属性的个数,而且类型要匹配),无论你定义多少个构造,都是可以的,只要满足方法的重载机制。
在java中要构造对象,必须满足两个条件:
1. 要有构造器
2. 要使用 new 运算符
注意:
我们在定义构造方法的时候,不需要全部定义所有的可能的构造方法,我们定义的时候,根据我们的需求来进行。
public class Constructor02
{
private int id;
private Constructor02 ( int cid) {
id = cid;
}
}
public class Constructor02
{
private int id;
private Constructor02 ( int cid) {
id = cid;
}
public Constructor02 instance ( ) {
return new Construcotr02 ( ) ;
}
}
补充的内容:
public class Test03
{
private int id;
public Test03 ( int id) {
this . id = id;
}
public static void main ( String[ ] args) {
Test03 t = new Test03 ( 10 ) ;
System. out. println ( t. id) ;
}
}
补充内容:单例singleton
public class Constructor02
{
private int id;
private Constructor02 ( int cid) {
id = cid;
}
private static Constructor02 cc = new Constructor02 ( 100 ) ;
public static Constructor02 instance ( ) {
return cc;
}
public int getId ( ) {
return id;
}
}
涉及到static 关键字
public class Test01
{
public static void main ( String[ ] args)
{
Constructor02 cc = Constructor02. instance ( ) ;
System. out. println ( cc) ;
Constructor02 cc1 = Constructor02. instance ( ) ;
System. out. println ( cc1) ;
Constructor02 cc2 = Constructor02. instance ( ) ;
System. out. println ( cc2) ;
Constructor02 cc3 = Constructor02. instance ( ) ;
System. out. println ( cc3) ;
}
}
构造方法的重载
public class Constructor01
{
private int id;
private String name;
public Constructor01 ( ) {
}
public Constructor01 ( int cid, String cName) {
id = cid;
name = cName;
}
public Constructor01 ( String cName, int cid) {
id = cid;
name = cName;
}
public Constructor01 ( String cName) {
name = cName;
}
public Constructor01 ( int cid) {
id = cid;
}
public int getId ( ) {
return id;
}
public void setId ( int cid) {
id = cid;
}
public String getName ( ) {
return name;
}
public void setName ( String cName) {
name = cName;
}
public String toString ( ) {
return "{" + id + ", " + name + "}" ;
}
}
public class Test01
{
public static void main ( String[ ] args)
{
Constructor01 c01 = new Constructor01 ( ) ;
Constructor01 c02 = new Constructor01 ( 1 , "zhangsan" ) ;
Constructor01 c03 = new Constructor01 ( 122 ) ;
Constructor01 c04 = new Constructor01 ( "lisi" ) ;
Constructor01 c05 = new Constructor01 ( "wus" , 200 ) ;
System. out. println ( c01) ;
System. out. println ( c02) ;
System. out. println ( c03) ;
System. out. println ( c04) ;
System. out. println ( c05) ;
}
}