/* * 代码块(初始化对象的属性等) * 1:代码块只能使用static修饰,要么就不修饰 * 2:分为 :静态代码块 非静态代码块 * 静态代码块用于初始化类的基本信息 * 非静态代码块用于初始化对象的信息 * 二者都可以多个 * */
public class BlockTest {
public static void main(String[] args) {
System.out.println(person.info);//先输出静态代码块
// System.out.println(person.info);//再来一次也只能执行一次静态的代码块
person p1 = new person();//一旦生成对象,直接就能将静态的和非静态的代码块执行出来
p1.eat();
person p2= new person();//并且每生成一个对象实例都会执行一次非静态代码块
}
}
class person{
String name;
int age;
static String info="中国";
public void eat(){//非静态方法
System.out.println("人吃饭");
System.out.println(age);
}
{
System.out.println("我是非静态代码块测试2");
age=1;
}
{//这是非静态代码块
System.out.println("我是非静态代码块测试1");
System.out.println(++age);
}
static{
//static 修饰的代码块,随着类的加载而执行,由于类加载一次,故只能执行一次
System.out.println("我是静态代码块的测试1");
//System.out.println(age);/静态不能调用非静态属性
}
}
----------------------------------------------例子------------------------------------------------------
/* * 结果:如下 * base sub: 100 sub base: 70 * 对于执行过程:先加载父类后子类,先加载代码块(代码块优先于构造器) * 1:new一个Sub后Sub(){ super.methon(70) }后先去加载Sub()进入父类(继承先加载父类),有代码块 打印base * 2:然后加载父类构造器Base(){ 内涵methon()构造器内调用方法 * 于是进入方法体,但此时由于方法也(方法在两个类父与子加载后)继承了 * 故调用的是Sub 中重写的方法体 ——》sub :100 * 3:然后到super.methon(70),直接找到父类原方法体 * 打印 base: 70 * * */
public class shuxing {
public static void main(String[] args) {
Sub s = new Sub();
}
}
class Base {
Base (){
methon(100);//提供空参构造器并调用方法
}
{
System.out.println("base");
}
public void methon(int i){//方法
System.out.println("base: "+i);
}
}
class Sub extends Base{//继承
Sub (){
super.methon(70);
}
{//非静态//代码块
System.out.println("sub");
}
public void methon(int i){//方法重写
System.out.println("sub: "+i);
}
}