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