面向对象(构造函数+构造代码块)
1、面向对象(构造函数)
构造函数特点:
函数名和类名称相同
不用定义返回值,也就没有return。
对象一建立就会调用与之对应的构造函数。
构造函数的作用:可以用于给对象进行初始化。
多个构造函数是以重载的形式存在的。
class Person
{
Person()
{
system.out.println("person run");
}
}
class PersonDemo
{
public static void main(string[] args)
{
Person p=new Person();//打印person run。注意没有调用也可以打印。。可以看出对象一建立就会调用与之对应的构造函数。
new Person();//打印person run
}
}
构造函数的小细节:
1,当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
2,当在类中自定义了构造函数后,默认的构造函数就没有了。
class Person
{
//Person(){}。系统会自动添加一个空参数的构造函数Person(){}。
}
class PersonDemo
{
public static void main(string[] args)
{
Person p=new Person();
new Person();
}
}
class Person
{
private String name;//封装名字
private int age;//封装年龄
Person()//构造函数
{
system.out.println("A:name="+name+",,age="+age);
}
Person(String n)//利用函数重载,函数的参数不一样,功能却相似。
{
name=n;
system.out.println("B:name="+name+",,age="+age);
}
Person(String n,int a)//继续函数重载
{
name=n;
age=a;
system.out.println("C:name="+name+",,age="+age);
}
}
class PersonDemo
{
public static void main(string[] args)
{
Person p1=new Person(); //打印name=null,,age=0。调用构造函数Person(),由于name和age已经被封装起来,故调用时,初始化默认值,字符串””为null,int型为0.
Person p2=new Person("lisi"); //打印name=lisi,,age=0
Person p3=new Person("wangwu",10);//打印name=wangwu,,age=10
}
}
当定义了构造函数的函数重载,而没有手动定义说明构造函数时:
class Person
{
private String name;
private int age;
//系统不会自动定义空参数构造函数
Person(String n)//构造函数的重载
{
name=n;
system.out.println("B:name="+name+",,age="+age);
}
Person(String n,int a)
{
name=n;
age=a;
system.out.println("C:name="+name+",,age="+age);
}
}
class PersonDemo
{
public static void main(string[] args)
{
Person p1=new Person(); //打印错误。因为Person是已经自定义过的函数,系统则不会定义这个空参数的值。p1找不到值。
}
}
添加一个cry函数
class Person
{
private String name;
private int age;
Person()//构造函数
{
system.out.println("A:name="+name+",,age="+age);
cry();
}
Person(String n)
{
name=n;
system.out.println("B:name="+name+",,age="+age);
cry();
}
Person(String n,int a)
{
name=n;
age=a;
system.out.println("C:name="+name+",,age="+age);
cry();
}
public void cry()
{
system.out.println("cry......");
}
}
class PersonDemo
{
public static void main(string[] args)
{
Person p1=new Person(); //打印name=null,,age=0 cry......
Person p2=new Person("lisi"); //打印name=lisi,,age=0 cry......参考下图3。
}
}
构造函数和一般函数在写法上有不同。
在运行上也有不同。
构造函数是在对象一建立就运行。给对象初始化。
而一般方法是对象调用才执行,是给对象添加对象具备的功能。
一个对象的建立,构造函数只运行一次。!!!
而一般方法可以被该对象调用多次。
class Person
{
private String name;
private int age;
Person()//构造函数
{
system.out.println("A:name="+name+",,age="+age);
cry();
}
Person(String n)//构造函数
{
name=n;
system.out.println("B:name="+name+",,age="+age);
cry();
}
public voidsetName(String n)//p2.setName调用的是这段程序。
{
name=n;
}
public String getName()
{
return name;
}
Person(String n,int a)
{
name=n;
age=a;
system.out.println("C:name="+name+",,age="+age);
cry();
}
public void cry()
{
system.out.println("cry......");
}
}
class PersonDemo
{
public static void main(string[] args)
{
//构造函数只能执行一次
Person p2=new Person("lisi"); //打印B:name=lisi,,age=0。Person("lisi")重载也是构造函数!!!
//一般函数可以执行多次
p2.setName("libusi");
system.out.println("p2.setName()");//打印libusi
p2.setName("HAISHILISI");
system.out.println("p2.setName()");//打印HAISHILISI
}
}
什么时候定义构造函数呢?
当分析事物时,该事物存在具备一些特征或者行为,那么将这些内容定义在构造函数中。
2、面向对象(构造代码块)
作用:给对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。
区别:
构造代码是给所以对象进行统一初始化。
而构造函数是给对应不同的对象分别进行初始化。
class Person
{
private String name;
private int age;
//下面这个括号里面的我们称之为构造代码块。
{
system.out.println("Person code run");
}
Person()//构造函数
{
system.out.println("A:name="+name+",,age="+age);
cry();
}
Person(String n)
{
name=n;
system.out.println("B:name="+name+",,age="+age);
cry();
}
Person(String n,int a)
{
name=n;
age=a;
system.out.println("C:name="+name+",,age="+age);
cry();
}
public void cry()
{
system.out.println("cry......");
}
}
class PersonDemo
{
public static void main(string[] args)
{
Person p1=new Person(); //打印Person code runA:name=null,,age=0
Person p1=new Person("lisi"); //打印Person code runA:name=lisi,,age=0。
}
}
于是cry可以放进构造代码块中,这是它们的共性,。
程序转变如下:
class Person
{
private String name;
private int age;
//构造代码块
{
system.out.println("Person code run");
cry();
}
Person()
{
system.out.println("A:name="+name+",,age="+age);
//cry();
}
Person(String n)
{
name=n;
system.out.println("B:name="+name+",,age="+age);
//cry();
}
Person(String n,int a)
{
name=n;
age=a;
system.out.println("C:name="+name+",,age="+age);
//cry();
}
public void cry()
{
system.out.println("cry......");
}
}
class PersonDemo
{
public static void main(string[] args)
{
Person p1=new Person(); //打印Person code run A:name=null,,age=0
Person p1=new Person("lisi"); //打印Person code run A:name=lisi,,age=0
}
}
构造代码块中定义的是不同对象共性的初始化内容。