Day7 构造函数 this指针 static修饰符
构造函数
特点 1 函数名与类名一致 2不用写返回类型 3 没有具体返回值
作用 给对象初始化
注意 多个构造函数是以重载的形式存在
调用顺序1 mian入栈 2创建p2对象开辟地址 3person(n,a)构造函数入栈并赋值
4 传给给堆里的数据 初始化完毕 5 把堆里数据的地址给p2 6构造函数弹栈
class Person
{
private String name;
private int age;
Person()
{
System.out.println("构造函数构造中");
}
Person(String n,int a)
{
name =n;
age=a;
}
public void speak()
{
System.out.println(name+"...."+age);
}
}
class demo
{
public static void main(String [] args)
{
Person p2 = new perpson("小强",10);
}
}
构造函数 对象创建时就会调用与之对应的构造函数对对象初始化 只调用一次
一般函数 对象创建时需要调用函数功能时才调用 可以多次调用
重载 参数顺序不同也会重载
this指针(虚基类)
引例:
构造函数: Person (String name) { name=name; }
类的初始化: Person p=new Person("小强");
p.show(); 结果为 null,0
因为person(String name)构造函数在栈里建了一个name的变量,自己赋给自己,不赋给对象
成员变量和局部变量重名
1.当局部变量和成员变量重名时,可以用this来区分
this:代表当前对象(所在函数所属对象的引用)
哪个对象调用了this所在函数,this就代表哪个对象
构造函数: Person (String name) { this.name=name; }
类的初始化: Person p=new Person("小强");
p.show(); 结果为 小强,0
2.用于一个构造函数调用另一个构造函数
[注意]只能定义在构造函数的第一行
this应用
/*判断是否为同龄人*/
public boolean compare(person p)
{
/*
if(this.age!=p.age)
return false;
else
return true;
*/
return this.age==p.age;
}
}
static
static修饰成员函数则该函数不能使用this对象
static不能修饰构造函数、函数参数、局部成员变量
最大特点:不用创建对象就可以调用 多一种调用方式 直接 类名.静态成员 person.country
特点 是一个修饰符,用于修饰成员
static修饰的成员被所有成员共享
优先于对象存在,其随着类的加载而加载
修饰的是共享数据,对象中存储的是特有数据
成员变量(实例变量)和静态变量(类变量)的区别
1.生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而释放
静态变量随着类的加载而存在,随着类的消失而消失
2.调用方式不同
成员变量只能被对象调用
静态变量可以被对象调用,还可以被类名调用
3.数据存储位置不同
成员变量数据存储在堆内存的对象中,所以也叫实例变量
静态变量数据存储在方法区(的静态区),所以也叫对象的共享数据
4.隐藏
静态变量前隐藏的是 类名.
成员变量前隐藏的是 this
静态使用的注意事项
1.静态方法只能访问静态成员(非静态既可以访问静态也可以访问静态)
2.静态方法中不可以使用this或者super关键字
3.主函数是静态的
理解主函数
1.格式是固定的
public static void main(String [] args)
public:权限必须最大
static:不需要对象,直接用主函数所属类名调用即可
main:函数名,不是关键字,只是jvm识别的固定的名字
String [] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型
测试
class maindemo
{
public static void main(String [] args) jvm创建了 new String[0]的String数组
{
System.out.println(args); [Ljava.lang.String;@15db9742
System.out.println(args.length); 0
System.out.println(args[0]); 越界
}
但如果在cmd中 java maindemo后面加字符串 haha lala xixi
结果就会如下
class maindemo
{
public static void main(String [] args) jvm创建了 new String[0]的String数组
{
System.out.println(args); [Ljava.lang.String;@15db9742
System.out.println(args.length); 3
System.out.println(args[0]); haha
}
内存调用
main先入栈
调用method时,method入栈,堆内存无任何产生,直接调用静态变量country,完成后出栈
创建p对象,开辟地址,并在堆内存中创建临时变量,初始化name=null,age=0
构造函数进栈,把name赋给this.name,age赋给this.age,构造函数出栈
show()函数进栈,调用静态变量country,同时调用this.name和this.age
static什么时候用
1.静态变量
相同数据 不需做修改 只需要使用
2.静态函数
是否访问静态变量
如果甚至成员变量静态变量都不访问,直接静态函数(因为不会创建对象,不会浪费堆内存)
静态代码块
class staticode
{
static
{
int num=10;
System.out.println("hahaha"); 随着类的加载而执行,而且只执行一次
}
void show()
{
System.out.println("hiahiahia");
}
}
class staticdemo
{
public static void main(String [] args)
{
new staticcode().show(); 结果
new staticcode().show(); hahaha hiahiahia hiahiahia
}
}
构造代码块
class person
{
private String name;
{ //给所有对象初始化 有几个对象就有几次
System.out.println("构造代码块");
}
person()
{ //给对应的对象进行特定的初始化
this.name="baby";
}
public void show()
{
System.out.println("name:"+name);
}
}
class demo
{
person p1=new person();
p1.show();
person
}
-->默认初始化 显式初始化 构造函数初始化