Java中对象属性的初始化顺序


在Java中用没有没关键字 static修饰的属性叫对象属性,否则就叫类属性。

1-对象属性的初始化方式有三种

  1. 声明该属性的时候初始化
  2. 在构造方法中初始化
  3. 在初始化块中初始化

如下:

public class Hero {
    public String name = "some hero"; //声明该属性的时候初始化
    protected float hp;
    float maxHP;
     
    {
        maxHP = 200; //初始化块
    }  
     
    public Hero(){
        hp = 100; //构造方法中初始化  
    }   
}

2-对象属性初始化的顺序

这三种方法中在构造方法中初始化是最晚的, 该属性声明的时候初始化在初始化块中初始化的先后顺序看语句的先后顺序,谁在前谁就先执行。如下:

public class Hero {
	
	public String name =Hero.getName("属性声明") ;
	
    public Hero(){
        name = Hero.getName("构造方法");
    }
    
    {
        name = Hero.getName("初始化块");
    }
   
    
    public static String getName(String pos){
        String result= "name "+pos;
        System.out.println(result);
        return result;
    }
     
    public static void main(String[] args) {
        new Hero();
    }
}

运行结果:
在这里插入图片描述
是因为声明语句在初始化块语句之前。现在调一下属性声明语句和初始化块声明语句的顺序:

public class Hero {
	
	{
        name = Hero.getName("初始化块");
    }
	
	public String name =Hero.getName("属性声明") ;
	
    public Hero(){
        name = Hero.getName("构造方法");
    }
    
    public static String getName(String pos){
        String result= "name "+pos;
        System.out.println(result);
        return result;
    }
     
    public static void main(String[] args) {
       new Hero();
    }
}

这里没有报错啊!尽管在未声明name变量之前就初始化了,看运行结果:
在这里插入图片描述

3-类属性初始化方法有两种

  1. 声明该属性的时候初始化
  2. 静态初始化块中初始化

如下:

public class Hero {
    public String name; //实例属性,对象属性,非静态属性
    protected float hp;
    static String copyright;//类属性,静态属性
     
    public static void main(String[] args) {
           Hero garen =  new Hero();
           garen.name = "盖伦";
            
           Hero.copyright = "版权由Riot Games公司所有";
            
           System.out.println(garen.name);
           System.out.println(garen.copyright);
            
           Hero teemo =  new Hero();
           teemo.name = "提莫";
           System.out.println(teemo.name);    
           System.out.println(teemo.copyright);  
    } 
}

4-类属性的访问

访问类属性有两种方式

  1. 对象.类属性
teem.copyright
  1. 类.类属性
Hero.copyright

这两种方式都可以访问类属性,访问即修改和获取,但是建议使用第二种 类.类属性 的方式进行,这样更符合语义上的理解

在一个类里被关键字static修饰的方法叫类方法又叫静态方法,否者叫实例方法成员方法,非静态方法
对类方法的访问也有两种,同访问类属性一致,只是多了括

  1. 对象.类方法

  2. 类.类方法

public class Hero {
    public String name;
    protected float hp;
 
    //实例方法,对象方法,非静态方法
    //必须有对象才能够调用
    public void die(){
        hp = 0;
    }
     
    //类方法,静态方法
    //通过类就可以直接调用
    public static void battleWin(){
        System.out.println("battle win");
    }
     
    public static void main(String[] args) {
           Hero garen =  new Hero();
           garen.name = "盖伦";
           //必须有一个对象才能调用
           garen.die();
            
           Hero teemo =  new Hero();
           teemo.name = "提莫";
            
           //无需对象,直接通过类调用
           Hero.battleWin();   
    }
}

访问一个对象方法,必须建立在有一个对象的前提的基础上访问类方法,不需要对象的存在,直接就访问

以上内容来自how2j.cn整理。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天选打工仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值