Java:构造函数、static(静态)
构造⽅法
构造⽅法:创建对象,给对象中的成员进⾏初始化
格式:
1.⽅法名与类名相同
2.没有返回值类型,连void都没有
3.没有具体的返回值
public Student(){}
构造⽅法的重载
1.如果我们没有给出构造⽅法,系统将⾃动提供⼀个⽆参构造⽅法。
2.如果我们给出了有参数构造⽅法,系统将不再提供默认的⽆参构造⽅法。
注意:这个时候,如果我们还想使⽤⽆参构造⽅法,就必须⾃⼰给出。建议永远⾃⼰给出⽆参构造⽅法
public Student(String name,int age, String number){
this.name = name;
this.age = age;
this.number = number;
}
/*
因为已经给出了含有三个参数的构造⽅法
public Student(){}这个默认构造⽅法就不存在了
Student s=new Student();这句话将⽆法执⾏,因为⽆法创建⽆参的对象
所以我们要⾃⼰给出⽆参构造⽅法
*/
public Student(){}
public Student(String name,int age, String number)
{
this.name = name;
this.age = age;
this.number = number;
}
static(静态)
如果我们有⼀个共享数据,⽐如国籍,在⼀个国家或者地区的服务器中,国籍都是相同的
如果每⼀个对象中都存⼀份国籍很占内存,所以我们可以将国籍这个属性提取出来,使其只存⼀份,并使其共享,这时就要使⽤static关键字
被static修饰的成员变量或者成员⽅法存放在⽅法区的静态区中
static是⼀个修饰符,⽤于修饰成员(成员变量、成员函数)。
当成员被静态修饰后,就多了⼀种调⽤⽅式,除了可以被对象调⽤外,还可直接被类名调⽤(类名.静态成员)
class Person
{
static String country="CN";
}
class PersonDemo
{
public static void main(String[] args)
{
Person p=new Person();
System.out.untry);//这两句的输出结果都是"CN"
System.out.untry);
}
特有内容随着对象存储,⽽共有的数据可以⽤static修饰
⽅法区(共享区、数据区):存储类中的⽅法和共享数据
static的特点:
1.随着类的加载⽽加载 当类加载到内存中,静态成员以及值也加载到内存中,也就是说,静态成员会随着类的消失⽽消失,他的⽣命周期最长
2.优先于对象存在
3.被所有对象所共享
4.可以被类名所调⽤
被静态修饰的成员变量被称为静态成员变量或者叫类变量
没有被静态修饰的成员变量被称为成员变量或者叫实例变量
实例变量和类变量的区别
static修饰的变量1.存放位置
类变量随着类的加载存在于⽅法区中
实例变量随着对象的建⽴存在于堆内存中
2.⽣命周期
类变量⽣命周期最长,随着类的消失⽽消失
实例变量⽣命周期随着对象的消失⽽消失
静态使⽤的注意事项
1.静态⽅法只能访问静态成员,⾮静态⽅法既可以访问静态也可以访⾮静态
⾮静态成员随着对象的创建⽽存在,静态⽅法优先于⾮静态存在,所以不可以调⽤未存在的⽅法和变量。⽽当⾮静态存在时,静态已经存在2.静态⽅法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态⽅法中不可以出现this关键字
优点:
1.对对象的共享数据进⾏单独空间的存储,节省堆内存空间,没必要每⼀个对象中都存储⼀份数据
2.可以直接被类名调⽤
缺点:
1.⽣命周期过长,占⽤内存
2.访问出现局限性,静态只能访问静态
静态代码块
static
{
要执⾏的代码;
}
//随着类的加载⽽执⾏,只执⾏⼀次,且优先于主函数,⽤于给类进⾏初始化
class StaticCode
{
static
{
System.out.println('a')
}
}
class StaticCodeDemo
{
public static void main(String[] args)
{
new StaticCode();//执⾏该语句打印a
new StaticCode();//因为类已经存在所以该语句不执⾏
}
}
class StaticCode
{
StaticCode()
{
System.out.println('b');//构造函数
}
static
{
System.out.println('a');//静态代码块
}
{
System.out.println('c');//代码块
}
StaticCode(int x)
{
System.out.println('d');//构造函数
}
}
class StaticCodeDemo
{
public static void main(String[] args)
{
new StaticCode(4);
}
}
/*
打印结果:
a
c
d
*/
/*
初始化时,先加载类,静态代码块随着类的加载⽽执⾏,
之后代码块随着对象的建⽴⽽被执⾏,最后执⾏对应的构造函数
*/
对象的初始化过程
Person p=new Person("⼩明",31);
步骤:
1.因为new⽤到了Person类,所以会先到Person.class⽂件并加载到内存中
2.执⾏该类中的静态代码块(如果有的话),给Person类进⾏初始化
3.在堆内存中开辟空间,分配内存地址
4.在堆内存中建⽴对象的特有属性,并进⾏默认初始化
5.对属性进⾏显⽰初始化
6.对对象进⾏构造代码块初始化
7.对对象进⾏对应构造函数的初始化
8.将内存地址赋值给栈内存中的p变量
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论