构造函数:
创建对象时调用,所有类都有构造函数,目的是为了给对象进行初始化,可以有多个构造函数,以重载的形式定义;
类中不定义构造函数的话,该类会产生一个默认的空参数构造函数;如果定义的话默认的构造函数就消失了;
构造函数---对象创建会调用相应的构造函数进行初始化,有且仅调用一次,
一般函数---对象创建后,需要函数功能才调用,可以无限调用;
一般函数不可直接调用构造函数,构造函数内有return语句。
static:
特点{
1.修饰类成员
2.修饰的成员被所有对象共享
3.优先于对象存在,加载类的时候,static成员便存在了
4.调用的时候有两种方式,一种是对象调用,另一种是类名调用
5.修饰的为共享数据,对象中存储的是特有对象
6.只要变量是对象所共有的就可用static修饰
7.如果方法不需要调用非静态成员就可定义为静态
8.类不封装特有数据,可以把方法设为static,该类称工具类,不需要创建对象就能调用。为了阻止其他程序创建该对象,可将该构造函数私有化}
成员变量与静态变量的区别{
1.生命周期不同,成员变量跟着对象存在,消失;静态变量跟着类
2.调用方式,成员变量只能通过对象调用
3.存储位置不同,成员变量时在堆中的对象里面;静态变量在方法区的静态区中}
注意{
由于静态成员跟随着类,还没有对象的时候就可以操作静态成员
1.静态方法只能访问静态成员,非静态方法可以访问静态和非静态
2.静态方法中不可有this和super
}
成员变量与局部变量重名时,用this来调用成员变量
this可用来在构造函数中调用其他构造函数,但必须为构造函数的第一条语句
静态代码块只在加载类的时候执行一次,构造代码块创建一次对象执行一次
public static void main(String【】 args)
1.格式是固定的,只有args可更换,为了让jvm识别;
2.访问权限必须最大
3.static 为了不创建对象直接地执行main方法
4.主函数没有具体返回值
5.main一个被jvm识别的固定名字
6.String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型
分析下面程序在内存中完成的动作
class Person{
private String name = null;
private int age = 0;
public static String country = "CN"
Person(String name){
this.name = name
}
Person(String name,int age){
this(name);
this.age = age;
}
public void print(){
System.out.println(this.name + " " + this.age);
}
}
class Demo{
public static void main(String[] args){
Person p1 = new Person("aa", 20);
Person p2 = new Person("bb", 21);
}}
1.main函数进栈,存储变量p1 2.在方法区加载Person类,在静态区存储country的值 3.new Person("aa", 20)堆中分配空间给第一个new 4.调用Person(String name,int age),构造函数进栈 5.this(name)再次调用另一个构造函数,Person(String name)进栈 6.将参数aa赋值给堆中对象的变量name 7.第5步的构造函数出栈 8.将参数20赋值给堆中对象的变量age
9.第4步的构造函数出栈 10.把该对象地址赋值给p1.11.重复3到10步骤 12.main函数出栈
该程序p1和p2共享country的值,构造函数使用this是由于能在局部变量找到就不会去寻找成员变量