构造函数
特点:函数名与类名相同,不用定义返回值类型,没有具体的返回值,任何用class定义的类中,都有一个默认的空参数的构造函数
作用:给对象进行初始化
注意:默认构造函数的特点,多个构造函数是以重载的形式存在的
创建的每一个对象都是一个实体,每个实体必须要进行初始化后才可以使用,实体的初始化是需要通过动作来完成的,这个动作就是构造函数,构造函数的作用:就是给对象进行初始化。
1 package com_package2; 2 3 public class Person { 4 private int age; 5 private String name; 6 Person() 7 { 8 System.out.println("person run"); 9 10 11 } 12 Person(String n) 13 { 14 name =n; 15 16 } 17 Person(String n,int a) 18 { 19 name =n; 20 age =a; 21 22 } 23 public void speak()//1这里为什么没有static而有的地方有呢? 24 { 25 System.out.println("name="+name+" "+"age="+age); 26 27 } 28 }
1 package com_package2; 2 3 public class PersonDemo { 4 public static void main(String[]args) 5 { 6 Person p = new Person(); 7 //p.speak(); 8 9 } 10 11 }
person run
也许会发现为什么直接就能出结果?
构造函数的作用:给对象进行初始化。
构造函数的特点:任何用class定义的类中,都有一个默认的空参数的构造函数用于给该类的对象进行初始化用,但是如果该类中制定了具体的构造函数,那么默认的构造函数就没有作用了。
构造函数和一般函数的不同:书写格式的不同,运行的不同,构造函数实在对象以创建就被调用了,而且只执行一次。一般函数实在需要时在被调用。这也就解决了上面问的那个问题。
例如:
1 package com_package2; 2 3 public class PersonDemo { 4 public static void main(String[]args) 5 { 6 Person p = new Person();//对象一杯创建就被调用 7 p.speak();//一般方法需要时才被调用 8 Person p1 = new Person("hejinjin");//对象只能创建一次,再用需要重新命名 9 p1.speak(); 10 Person p2 = new Person("hejinjin",23);//多个构造方法在一起用重载的方法在一起 11 p2.speak(); 12 } 13 14 }
name=null age=0
name=hejinjin age=0
name=hejinjin age=23
会根据创建对象后面的参数来自动选择前面定义的构造函数。另外:
1 Person() 2 { 3 System.out.println("Person person"); 4 //return;构造函数里面是有返回语句的,用于结束构造函数的初始化动作。 5 6 }
关于的函数带static有的不带static的解释:
有的带,只因为它可以直接备注函数调用,就如这个样子:
1 package com_package2; 2 3 public class PersonDemo { 4 public static void main(String[]args) 5 { 6 Person p = new Person();//对象一杯创建就被调用 7 p.speak();//一般方法需要时才被调用 8 Person p1 = new Person("hejinjin");//对象只能创建一次,再用需要重新命名 9 p1.speak(); 10 Person p2 = new Person("hejinjin",23);//多个构造方法在一起用重载的方法在一起 11 p2.speak(); 12 show(); 13 } 14 public static void show() 15 { 16 17 18 } 19 20 }
而有的不是直接被主函数调用:
public void speak() { System.out.println("name="+name+" "+"age="+age); }
p2.speak();
构造函数什么时候用:当描述事物是,该事物一存在就具备某种属性和行为,那么就将这些内容定义在构造函数中。
语句解释
Person p = new Person("lisi");
new:用于在堆内存中开辟空间的关键字,用于创建对象
Person:明确要创建Person类的对象
(“lisi”):创建Person类的对象,需要哪个构造函数进行初始化,这里需要一个字符串参数的构造函数。
关于改变属性的值:
首先,构造函数存在的类里面创建其私有属性的get set方法,然后在主方法存在的类里面改动
package com_package2; public class Person { private int age; private String name; Person() { System.out.println("Person person"); //return;构造函数里面是有返回语句的,用于结束构造函数的初始化动作。 } Person(String n,int a) { name =n; age = a; } Person(String n) { name =n; } public int getAge() { return age; } public void setAge(int age) {//Age的get方法,注意get方法的书写形式get属性(),属性的第一个字母大写 this.age = age; } public String getName() {//同上 return name; } public void setName(String name) {//同上 this.name = name; } public void speak() { System.out.println("name="+name+" "+"age="+age); } }
package com_package2; public class PersonDemo { public static void main(String[]args) { Person p = new Person();//对象一杯创建就被调用 p.speak();//一般方法需要时才被调用 Person p1 = new Person("hejinjin");//对象只能创建一次,再用需要重新命名 p1.setName("lisi"); p1.speak(); Person p2 = new Person("hejinjin",23);//多个构造方法在一起用重载的方法在一起 p2.setName("lisi");//改名改多少次都没问题,不断的覆盖 p2.setName("weige");//同上 p2.setAge(80); p2.speak(); // show(); } ///public static void show() //{ //} }
Person person
name=null age=0
name=lisi age=0
name=weige age=80