this关键字,主要3个作用:
1,this.属性,this.方法,表示当前对象的属性,当前类的方法
2,this,表示当前对象,当前正在操作这个方法的对象就是当前对象
3,使用this(参数若干),可以调用当前类的构造方法,如果,构造方法之间相互调用,则有要求:一:this()必须放在首行,二:至少有一个构造方法是没有调用this(参数若干)的,就是说构造之间不能循环调用。
static关键字
不用static修饰的属性或者方法,每个对象都有各自的属性或方法,比如一个Person类有name,age两个属性,有p1,p2两个对象,p1,p2分别有各自的两个属性,对应在堆内存中开辟空间;———–也就是说static可以用来声明全局属性。
static修饰的作用:
如果希望一个属性被所有对象所通拥有,则可以将其声明为static的,声明为static的属性或方法,也成为类方法,可以直接通过类名称直接调用。
class Person{ // 定义Person类
String name ; // 定义name属性,暂时不封装
int age ; // 定义age属性,暂时不封装
static String country = "A城" ; // 定义城市属性,有默认值,static
public Person(String name,int age){
this.name = name ;
this.age = age;
}
public void info(){ // 得到信息
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
}
};
public class StaticDemo03{
public static void main(String args[]){
Person p1 = new Person("张三",30) ; // 实例化对象
Person p2 = new Person("李四",31) ; // 实例化对象
Person p3 = new Person("王五",32) ; // 实例化对象
System.out.println("--------------- 修改之前 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
p1.country="B cheng";//通过一个对象改变所有对象所拥有的这个static属性内容,不合适,一般是使用 类名称.属性 进行修改的,因为所有的对象都是通过这个类所产生的,所以,修改所有对象所共同拥有的属性内容,就应该使用产生所有对象的这个类名称进行修改,最合适了
Person.country = "B城" ;
System.out.println("--------------- 修改之后 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
}
};
每一个对象都拥有各自的堆栈空间,堆内存空间中保存每个对象的各自的属性,但是所有的static属性是保存在了全局数据区之中,所有的对象指向全局数据区中的一个内容,所以当一个对象修改static的全局数据区中的内容之后,所有对象得到的全局数据区中的内容都改变了。
上一张内存图:
然而,通过一个对象改变所有对象的某个属性,似乎不合适,其实一般来说,是使用类名称.static属性,修改这个static的属性的。
Java中内存区域划分:
1,栈内存:保存对象名称,(保存,访问堆内存的地址)
2,堆内存:保存每个对象的具体属性
3,全局数据区:保存static类型的属性
4,全局代码区:保存所有方法的定义。
如果一个方法使用static修饰了,则这个方法,可以直接用类名称进行调用,
static的方法,不能调用非static的属性或者方法,为什么呢,因为,static的属性或者方法,和非static的属性或者方法,在内存中创建的时间是是不同的,创建的先后顺序是不同的。
static的属性或者方法,在对象声明,创建之前就可以调用,因为它是通过类名称直接调用的,所以,在这个类的对象创建之前调用,必然是OK的。
static 的使用:
1,static属性,在类的对象创建之前就开辟了空间了,而且它是被所有对象所共享的,那就可以在类的构造方法中,通过一个static的属性,用于统计,一个类到底产生了多少个对象。
class Demo{ // 定义Person类
private static int count = 0 ; // 所有对象共享此属性
public Demo(){
count++ ; // 只要有对象产生就应该自增
System.out.println("产生了" + count + "个对象!") ;
}
};
public class StaticDemo06{
public static void main(String args[]){
new Demo() ; // 增加新对象
new Demo() ; // 增加新对象
new Demo() ; // 增加新对象
}
};
2,可以使用static为对象进行自动的编名操作。
class Demo{ // 定义Person类
private String name ; // 保存名字
private static int count = 0 ; // 所有对象共享此属性
public Demo(){
count++ ; // 有对象产生就自增
this.name = "DEMO-" + count ; // 自动进行编名操作
}
public Demo(String name){
this.name = name; // 可以通过构造赋值
}
public String getName(){ // 取得姓名
return this.name ;
}
};
public class StaticDemo07{
public static void main(String args[]){
System.out.println(new Demo().getName()) ;
System.out.println(new Demo("LXH").getName()) ;
System.out.println(new Demo().getName()) ;
System.out.println(new Demo("MLDN").getName()) ;
System.out.println(new Demo().getName()) ;
}
};