Java Static 详解

static 属性可以被static和非static类型的方法使用

非static属性不能够被static方法所使用

 

 类中的属性用static声明,则表示该属性为公有的属性,既所以的

 属性都可以访问它

 

 对于static类型的变量,最好是通过类名称修改,意味着使用static

 类型的声明属性的方法或者属性都可以通过类名直接调用

 

 静态方法不能够调用非静态的方法或者属性

 非静态的方法可以调用静态的属性和方法

 

class Person{

static String code;

String name;

int age;

//非静态的方法可以调用静态的属性

String shout(){

return "地区编码:"+code+",姓名:"+name+",年龄:"+age ;

}

// 如果需要的话,对于code的内容设置应该通过一个方法进行检查

// 方法怎么写?

// 静态方法,由类名称直接调用

static void setCode(String c){

//this.code=c;

//不能过用this,静态的方法不能够调用非静态的属性

code = c;

}

// 能不能通过静态方法为类中的属性赋值,不能

// static void setName(String n){

// name= n;

// }

}

public class OODemo {

 

public static void main(String[] args) {

Person p1 = new Person() ;

Person p2 = new Person() ;

//p1.code = "110" ;

p1.name = "魔乐" ;

p1.age = 3 ;

//p2.code = "120" ;

p2.name = "李" ;

p2.age = 30 ;

 

Person p3 = new Person() ;

p3.code = "130" ;

 

// 应该由对象所属的类进行统一的修改

 

System.out.println(p1.shout()) ;

System.out.println(p2.shout()) ;

}

 

}

 

 

内存分配:

 --|栈内存:保存对象的名字

 --|堆内存:保存具体的内容(属性)

 --|全局代码块:所以方法

 --|全局数据区:存放static类型的属性

 

 

 

四种代码块:

 --|普通代码块:是写在一个方法之中的语句块

 --|构造块:是直接写在类中的一个语句块,构造块优先于构造方法执行

并且执行多次

 --|静态块:是直接写在类中的,通过static声明的语句块,优先于

构造块和构造方法的执行,为静态初始化,只执行一次

 --|同步代码块:(多线程)

 

class Person1

{

// 静态代码块

static

{

System.out.println("static code() ...") ;

}

// 构造块

{

System.out.println("Hello World!!!") ;

}

// 声明一个构造方法

Person1()

{

System.out.println("Person1()构造方法") ;

}

};

public class OODemo16

{

public static void main(String args[])

{

new Person1() ;

new Person1() ;

}

};

//static code() ...

//Hello World!!!

//Person1()构造方法

//Hello World!!!

//Person1()构造方法

 

/*

由运行参数输入Person类中的姓名和年龄,并打印输出

*/

class Person2 

{

String name ;

int age ;

String shout()

{

return "姓名:"+name+",年龄:"+age ;

}

};

public class OODemo19

{

public static void main(String args[])

{

// 如果发现没有参数,则表示程序出错,退出程序

if(args.length!=2)

{

// 没有两个参数

// 程序退出

System.out.println("参数输入有错误,可按以下格式输入:") ;

System.out.println("java 类名称 名字 年龄") ;

System.exit(1) ;

}

// 输入参数第一个是名字,第二个是年龄

String name1 = args[0] ;

int age1 = Integer.parseInt(args[1]) ;

Person2 p = new Person2() ;

p.name = name1 ;

p.age = age1 ;

System.out.println(p.shout()) ;

}

};

 

/*JAVA初始化顺序

1、调用顺序: 

JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。 

先初始化父类的静态代码--->初始化子类的静态代码--> 

(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数 

2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入 

3、创建类实例时,首先按照父子继承关系进行初始化 

4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法 

5、类消除时候,首先消除子类部分,再消除父类部分 

 

1.  父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行 

2.  子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行 

3.  父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行 

4.  父类构造方法 

5.  子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行 

6.  子类构造方法 

*/

 

//InitializeOrder.java

abstract class Base {

// 5、初始化父类的非静态代码

public int age = getNumber(100);

// 静态成员变量和静态初始化块级别相同 所以按照在代码中的顺序依次执行

// 1、初始化父 静态成员变量 static int sage

static int sage = getNumber(50);

// 2、初始化父 静态初始化块 static

static {

System.out.println("base static block");

}

{

System.out.println("base nonstatic block");

}

 

// 6、初始化父类构造函数

Base()

 

{

System.out.println(age);

System.out.println("base start");

draw();// 会调用子类覆盖后的方法

System.out.println("base end");

 

}

 

static int getNumber(int base) {

System.out.println("base.getNumber int" + base);

return base;

}

 

public void draw() {

System.out.println("base.draw");

}

 

}

 

public class InitializeOrder extends Base {

// 7、初始化子类的非静态代码

public int age = getNumber(1001);

// 8、初始化子类的非静态代码

private int _radius = getNumber(10);

// 3、初始化子 静态成员变量 static int sage

static int sage = getNumber(250);

// 4、初始化子 静态初始化块 static

static {

System.out.println("subclass static block");

}

{

System.out.println("subclass nonstatic block");

}

 

// 9、初始化子类构造函数

InitializeOrder(int radius) {

_radius = radius;

System.out.println(age);

System.out.println("initializeOrder initialized");

}

 

public void draw() {

System.out.println("initializeOrder.draw " + _radius);

}

 

/** */

/**

* @param args

*/

public static void main(String[] args) {

 

new InitializeOrder(1000);

}

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值