Java this关键字,static关键字

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()) ;
    }
};

static声明的属性或方法,可以直接由类名称调用。

static方法,只能访问static的属性或者方法,而非static的属性或者方法它是不能访问的,因为static可以直接在对象还没有实例化的时候就直接调用,而其他的属性或者方法,必须在对象实例化之后才可以调用。

当然,非static的方法,当然可以畅通无阻的访问static的属性或者方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值