使用构造函数执行初始化
构造函数是一个特殊的方法,它的作用是创建实例时初始化,构造器是床将对象的重要途径。当系统创建一个对象时,会默认初始化,将基本类型设置为0或false,引用类型设置为null。如果想改变默认初始化,想让系统创建对象时就为对象进行显示初始化,就可以使用构造函数实现。构造函数的格式如下
权限修饰符 类名{
}
构造函数特点:
- 函数名与类名相同
- 不能定义返回值类型
- 不能写return语句
下面我们看一段代码
public class Demo1 {
public static void main(String[] args) {
Person p1=new Person();
Person p2=new Person("李四");
Person p3=new Person("王五",10);
p3.cry();
}
}
class Person{
private String name;
private int age;
public Person(){
System.out.println("name="+name+" age="+age);
cry();
}
public Person(String n){
name=n;
System.out.println("name="+name+" age="+age);
cry();
}
public Person(String n,int a){
name=n;
age=a;
System.out.println("name="+name+" age="+age);
cry();
}
public void cry(){
System.out.println("cry--");
}
}
总结:
- ==对象一建立,就会调用与之对应的构造函数,可以给对象进行初始化
- 当一个类中没有定义构造函数时,西永就为该类加入一个空参数的构造函数,挡在勒种自定义了构造函数后,默认构造函数就没有了
构造函数和一般函数的区别
- 构造函数赫尔一般函数在写法上不同,在执行上也有不同,构造函数是在对象一建立就运行,给对象初始化,而一般函数是对象调用才执行,是给对象添加对象的共功能,
- 一个对象建立,构造函数执行一次,而一般方法执行多次
**什么时候定义构造函数?**分析事物中,该事物存在一些特性或者行为,就把它们定义在构造函数中
构造代码块
格式:
{
System.out.println("构造代码块");
}
作用:给对象进行初始化,可以将对象共同的属性定义在构造代码块中
public class Demo1 {
public static void main(String[] args) {
Person p1=new Person();
Person p3=new Person("王五",10);
p3.cry();
}
}
class Person{
private String name;
private int age;
{
cry();
}
public Person(){
System.out.println("name="+name+" age="+age);
}
public Person(String n){
name=n;
System.out.println("name="+name+" age="+age);
}
public Person(String n,int a){
name=n;
age=a;
System.out.println("name="+name+" age="+age);
}
public void cry(){
System.out.println("cry--");
}
}
对象一建立就运行,而且优先于构造函数执行
构造代码块和构造函数的区别
构造代码块是给所有对象进行统一初始化的,而构造函数是给对应的函数初始化
this关键字
如果局部变量和成员变量同名,就要使用this关键字进行区分,this代表它所在函数所属对象的引用,简单说,哪个对象在调用this所在的函数,this就代表哪个对象
this的应用:
当定义类类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象,但凡本来功能内部使用到了本类对象,就使用this。
this还可以用于构造函数之间的相互调用
public class Demo1 {
public static void main(String[] args) {
Person p=new Person("llisi",30);
Person p1=new Person("llisi2",30);
}
}
class Person{
private String name;
private int age;
public Person(String name){
this.name=name;
}
public Person(String name,int age){
this(name);
this.age=age;
}
}
static关键字
static是一个修饰符,用于修饰成员变量和成员函数,来看一个例子
public class Demo1 {
public static void main(String[] args) {
Person p=new Person();
p.name="zhangsan";
p.show();
Person p1=new Person();
p1.name="lisi";
p1.show();
}
}
class Person{
String name;
String country="CN";
public void show(){
System.out.println(name+country);
}
}
上面的例子创建了两个对象p和p1,两个对象都有国籍这个相同的数据,在内存中是这样的
如果对象建立的越多,内存中的country就越多,但是这部分的内容方式一样的,这就很浪费内存空间,我们就可以将共同的属性拿出来,放在单独的一个地方,这时候就用到了static。
public class Demo1 {
public static void main(String[] args) {
Person p=new Person();
p.name="zhangsan";
p.show();
Person p1=new Person();
p1.name="lisi";
p1.show();
}
}
class Person{
String name;
static String country="CN";
public void show(){
System.out.println(name+" "+country);
}
}
被静态修饰的属性,被对象所共享,代码上并看不出什么大的区别,我们看内存图
被静态修饰的属性,只占了一次内存,即使创建了多个对象,他们都可以共享到这个用static修饰的属性。
当成员被静态修饰后,就多了一种访问方式,除了可以被对象调用外,还可以直接被类名调用,
static特点:
-
静态随着类的加载而加载
-
被所有对象所共享
-
优先于对象存在
-
可以直接被类名所调用
成员变量和类变量的区别: -
存放位置不同:类变量随着类的加载而存在于方法区中,实例变量随着对象的建立而存在月堆内存中。
-
生命周期不同:类变量生命周期最长,随着类的消失而消失,成员变量的声明周期随着对象的消失而消失。
静态的使用注意事项: -
静态方法只能访问静态成员,
-
非静态方法既可以访问静态,也可以访问非静态
-
静态方法中,不可以定义this,super关键字,因为静态优先于对象存在,