07 构造函数与this,static
构造函数:
特点:1.函数名与类名相同,
2.不用定义返回值类型,
3.没有具体的返回值.(第2条已经说明了第3条)
作用:对对象进行初始化,构造函数是构建创造对象时调用的函数,创建对象都必须要通过构造函数初始化.
一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数.
如果在该类中定义了指定的构造函数,那么类中的默认构造函数就没有了.
构造函数vs一般函数:
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化.
一般函数:对象创建后,需要函数功能时才调用.
构造函数:对象创建时, 会调用且只调用一次.
一般函数:对象被创建后,可以多次调用.
什么时候定义构造函数呢?
在描述事物时,该事物一存在就具备一些内容,这些内容都定义在构造函数中.
构造函数的重载:
接受参数.
class Person { private String name; private int age; //定义一个Person类的构造函数; Person() { name= "baby"; age = 1; System.out.println("person run"); } Person(String n) { name= n; } Person(String n,int a) { name=n; age = a; }
//一般方法
public void setName(String n)
{
name = n;
}
public void speak() { System.out.println(name+":"+age); } } class Demo { public static void main(String[] args) { Person p = new Person(); p.speak(); Person p1 = new Person("旺财"); p1.speak(); Person p2 = new Person("小强",10); p2.speak(); } }
构造函数可以调用一般函数,一般函数不能调用构造函数,如果需要调用需要创建对象,但不要这么做.
构造函数有return语句,结束函数,一般不写.用于判定参数是否符合规范,不符合return出去.
this关键字:当成员变量和局部变量重名,可以用关键字this来区分.
this:代表对象,代表哪个对象?当前对象.
this就是所在函数所属对象的引用.
简单说:哪个对象调用了this所在的函数,this就代表哪个对象.
构造函数调用构造函数:this(参数)既可.
细节:
1.this也可以用于在构造函数中调用其他构造函数,
但对this的调用必须放在构造函数的第一行.
为什么?
因为初始化动作要先执行.避免覆盖.
2.不要两个构造函数在内部互相调用,会造成程序的停止.
一个类中所有的成员,想要被执行,就必须有对象调用(静态除外);
static关键字:
static的特点:
1.static是一个修饰符,用于修饰成员.(包括成员变量和成员函数).
2.static修饰的成员被所有的对象所共享.
3.static优先于对象存在,因为static的成员随着类的加载就已经存在了.
4.static修饰的成员多了一种调用方式,可以直接被类名所调用,类名.静态成员.
5.static修饰的数据是共享数据,对象中存储的是特有数据.
类中普通的变量称为成员变量,实例变量
类中的static变量称为静态变量,类变量
成员变量和静态变量的区别?
1.两个变量的生命周期不同.
成员变量随着对象的创建而存在,随着对象的被回收而释放.
静态变量随着类的加载而存在,随着类的消失而消失.
2.调用方式不同.
成员变量只能被对象调用.
静态变量可以被对象调用,还可以被类名调用.(建议不要用对象调用,一目了然知道这个变量是静态成员)
3.别名不同.
成员变量也称为实例变量.
静态变量称为类变量.
4.数据的存储位置不同.
成员变量存储在堆内存的对象中,所以也叫对象的特有数据.
(堆里面放的全部是实体,栈用完会立刻释放,生命周期较短)
静态变量数据存储在方法区(数据区,共享区,共享数据区)的静态区中,所以也叫对象的共享数据.
静态使用的注意事项:
1.静态方法只能访问静态成员.访问不了非静态(因为非静态随着对象的产生而产生,此时还没有非静态成员)
非静态既可以访问静态,又可以访问非静态.
2.静态方法中不可以使用this或者super关键字.(没有对象)
3.主函数是静态的.(在主函数中通过new别的对象来调用相应的对象中的方法);
主函数特殊之处:
1.格式是固定的.
2.被jvm所识别和调用.
public:因为权限必须是最大的.
static:虚拟机(jvm)在调用主函数时不需要对象.直接用主函数所属类名调用即可.
void:主函数没有具体的返回值.
main:函数名,不是关键字,只是一个jvm识别的固定的名字.
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串.
打印出来是: [Ljava.lang.String;@1db9742
@后面是哈希值,代表地址.
[数组
实际是 new String[0];
字符串类型的数据才是最通用的数据.
可以在控制台通过java Demo (传值),用空格隔开.
只有非静态区才持有this
static内存图解:
到底什么时候写静态.
1.静态变量
当分析对象中所具备的成员变量的值都是相同的.
这时这个成员就可以被静态修饰.
只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的.
如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中.
2.静态函数
函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据.
简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的.
如果不需要,就可以将该功能定义成静态的.当然也可以定义成非静态,但是非静态需要被对象调用,
而仅创建对象调用非静态的,没有访问特有数据的方法,该对象的创建是没有意义的.
静态代码块:随着类的加载而执行.而且只执行一次.\
作用:用于给类进行初始化.
static
{
System.out.println("hahahh");
}
构造代码块:
可以给所有对象进行初始化
构造函数是给对应的对象进行针对性的初始化,构造代码块是给所有对象进行初始化.
执行顺序:静态代码块>构造代码块>构造函数