目录
java类的引用
静态属性和非静态属性的区别:
Java中静态代码块、构造代码块、普通代码块
java类的引用
java是面向对象的编程语言,我首先用C语言来模拟面向对象,如下所示,只是一个简单的打印功能。
#include <stdio.h>
typedef struct Person_{
char *name;
void (*printName)(struct Person_ *per);
}Person;
void PrintName(Person *per)
{
printf("%s\n", per->name);
}
int main(void)
{
Person person_1 = {"xiaowu", PrintName };
Person person_2 = {"xiaoliu", PrintName };
person_1.printName(&person_1);
person_2.printName(&person_2);
return 0;
}
编译结果:
xiaowu
xiaoliu
下面我用java实现上面的功能
class Per {
String name;
String getName() {
return name;
}
};
public class Person {
public static void main(String args[]) {
Per p1 = null;
p1 = new Per();
p1.name = "xaiowu";
Per p2 = null;
p2 = new Per();
p2.name = "xiaoliu";
System.out.println(p1.getName());
System.out.println(p2.getName());
}
}
编译结果:
xaiowu
xiaoliu
通过构造方法对上面的程进行改进,如下所示:
class Per {
String name;
String getName() {
return name;
}
public Per(String n) {
name = n;
}
};
public class Person {
public static void main(String args[]) {
Per p1 = new Per("xaiowu");
Per p2 = new Per("xiaoliu");
System.out.println(p1.getName());
System.out.println(p2.getName());
}
}
创建类方法
class Per {
String name;
String getName() {
return name;
}
public Per(String n) {
name = n;
}
static void printPer() {
System.out.println("this is a Per");
}
};
public class Person {
public static void main(String args[]) {
Per p1 = new Per("xaiowu");
Per p2 = new Per("xiaoliu");
System.out.println(p1.getName());
System.out.println(p2.getName());
Per.printPer();
}
}
编译结果:
xaiowu
xiaoliu
this is a Per
上面的程序中用到静态方法(static void printPer()),下面对静态方法和静态变量分析下:
class Per {
String name;
static int cnt = 0;
public Per(String n) {
name = n;
}
static void printPer() {
System.out.println("cnt = "+cnt);
}
};
public class Person {
public static void main(String args[]) {
Per p1 = new Per("xaiowu");
Per p2 = new Per("xiaoliu");
p1.cnt++;
p2.cnt++;
Per.printPer();
}
}
静态属性和方法必须用static修饰符
static 可以修饰属性、方法、代码块、内部类
静态属性和非静态属性的区别:
1、在内存中存放位置不同 所有带static修饰符的属性或者方法都存放在内存中的方法区 而非静态属性存放在内存中的堆区;
2、出现时机不同 静态属性或方法在没创建对象之前就已经存在 而非静态属性在创建对象之后才存在;
3、静态属性是在某个类中的所有对象是共享的;
4、生命周期不同 静态属性在类消失之后才销毁 而非晶态属性在对象销毁之后才销毁;
这就是为什么.静态方法可以直接调用同类中的静态成员,但是不能直接调用非静态成员。
Java中静态代码块、构造代码块、普通代码块
1、静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。后面在比较的时候会通过具体实例来证明;
2、构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于造函数执行。需要注意的是,听名字我们就知道,构造代码块不是优先于构造函数执行,而是依托于构造函数,也就是说,如果你不实例化对象,构造代码块是不会执行的;
3、普通代码块和构造代码块的区别是,构造代码块是在类中定义的,而普通代码块是在方法体中定义的。且普通代码块的执行顺序和书写顺序一致。
静态代码块>构造代码块>构造函数>普通代码块
class Per {
static {
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public Per() {
System.out.println("构造函数");
}
void printPer() {
System.out.println("普通代码块");
}
};
public class Person {
public static void main(String args[]) {
new Per().printPer();
System.out.println("----------------------------");
new Per().printPer();
}
}
编译结果:
静态代码块
构造代码块
构造函数
普通代码块
----------------------------
构造代码块
构造函数
普通代码块
我们创建了两个匿名对象,但是静态代码块只是调用了一次。