需求:使用java类描述一个婴儿
在现实生活中有两种婴儿,一种婴儿一出生就具备了名字,还有一种婴儿就是出生之后才有名字的(黑户)
构造函数:
构造函数的作用:给对应的对象进行初始化。
构造函数的定义格式:
修饰符 函数名(形式参数){
函数体...
}
构造函数要注意的细节:
1.构造函数是没有返回值类型的
2.构造函数的函数名必须要与类一致
3.构造函数并不是由我们手动调用的,而且在创建对应的对象时,jvm就会主动调用到对应的构造函数。
4.如果一个类没有显式的写上一个构造方法时,那么java编译器会为该类添加一个无参的构造函数的
5.
疑问:创建对象时,jvm就会调用到对应的构造方法,那么我们以前没有学构造方法,那么以前创造对象时,
jvm是否也会调用构造方法?如果有?构造从何而来呢?
会调用,java编译器在编译的时候给加上去的
jdk提供了一个java开发环境(javap.exe)给我们进行反编译的
Javap 反编译的使用格式:
javap -c -l -private 类名
疑问:java编译器添加的无参 构造方法的权限修饰符是什么?
与类的权限修饰符是一致的。
*/
class Baby
{
int id;//身份证
String name;//名字
//构造函数
public Baby(int i,String n){
id = i;
name = n;
System.out.println("Baby的属性初始化完毕!!!");
}
//无参的构造函数
public Baby(){
System.out.println("无参的构造函数被调用..");
}
//哭
public void cry(){
System.out.println(name+"哇哇哭...");
}
}
class Demo2
{
public static void main(String[] args)
{
//创建一个baby对象
//Baby b=new Baby();//婴儿出生
Baby b1 = new Baby(110,"狗娃");//婴儿诞生 白户
System.out.println("编号:"+b1.id+"姓名:"+b1.name);
//黑户
Baby b2 = new Baby();
b2.id=110;
b2.name="狗娃";
System.out.println("编号:"+b2.id+"姓名:"+b2.name);
/*
//赋予属性
b.id =110;
b.name = "狗娃";
b.cry();
*/
}
/*
描述一个员工类,员工具备的属性:id\name\age
具备的公共行为:工作
要求:一旦创建一个员工对象的时候,那么该员工对象就要对应的属性值
*/
class Employee
{
int id;//编号
String name;//名字
int age;//年龄
//构造函数
public Employee(int i,String n,int a){
id = i;
name = n;
age = a;
}
public void work(){
System.out.println(name+"好好工作,努力挣钱!!");
}
}
class Demo3
{
public static void main(String[] args)
{
//创建一个员工对象
Employee e=new Employee(110,"狗娃",20);
System.out.println("编号:"+e.id+"名字:"+e.name+"年龄:"+e.age);
}
}
/*
构造代码块:
构造代码块的作用:给对象进行统一的初始化
构造函数的作用:给对应的对象进行初始化。
构造代码块的格式:
{
构造代码块
}
注意:构造代码块的大括号必须位于成员位置上。
代码块的类别:
1.构造代码块
2.局部代码块
3.静态代码块
*/
class Baby
{
int id;//身份证
String name;//名字
//构造代码块....
{
//System.out.println("构造代码块的代码执行了。。。");
cry();
}
//带参的构造函数
public Baby(int i,String n){
id = i;
name = n;
}
//无参的构造函数
public Baby(){
}
//哭
public void cry(){
System.out.println(name+"哇哇哭...");
}
}
class Demo4
{
public static void main(String[] args)
{
new Baby(110,"狗娃");
new Baby(112,"狗娃");
new Baby();
/*
new Baby(112,"狗娃");
Baby b2 = new Baby();
*/
}
}
/*
构造代码块要注意的事项:
1.java编译器编译一个Java源文件的时候,会把成员变量的声明语句提前至一个类的最前端
2.成员变量的初始化工作其实都在构造函数中执行的。
3.一旦经过java编译器编译后,那么构造代码块的代码就会被移动到构造函数中执行,是在构造函数之前执行的,构造函数中的代码是最后执行的
4.成员变量的显示初始化与构造代码块的代码是按照当前代码块的顺序执行的 。
*/
class Demo5
{
int i = 1000000;//成员变量的显初始化
//构造代码块
{
i=20000000;//构造代码块的初始化
}
//构造函数
public Demo5(){//构造函数
i = 3000000;
}
public static void main(String[] args)
{
Demo5 d = new Demo5();
System.out.println("i = " + d.i);
}
}