在Java中用没有没关键字 static修饰的属性叫对象属性,否则就叫类属性。
1-对象属性的初始化方式有三种
- 声明该属性的时候初始化
- 在构造方法中初始化
- 在初始化块中初始化
如下:
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-类属性初始化方法有两种
- 声明该属性的时候初始化
- 静态初始化块中初始化
如下:
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-类属性的访问
访问类属性有两种方式
- 对象.类属性
teem.copyright
- 类.类属性
Hero.copyright
这两种方式都可以访问类属性,访问即修改和获取,但是建议使用第二种 类.类属性 的方式进行,这样更符合语义上的理解
在一个类里被关键字static修饰的方法叫类方法,又叫静态方法,否者叫实例方法 或 成员方法,非静态方法
对类方法的访问也有两种,同访问类属性一致,只是多了括
-
对象.类方法
-
类.类方法
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整理。