目录

 

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

编译结果:

静态代码块
构造代码块
构造函数
普通代码块
----------------------------
构造代码块
构造函数
普通代码块

 我们创建了两个匿名对象,但是静态代码块只是调用了一次。