package com.block.test01;
class Main{
public static void main(String[] args) {
Block block = new Block("你好,李焕英");
new Block("你好",12,24);
}
}
public class Block {
String name;
int begin_time;
int end_time;
//如果在调用构造器时都需要打印那几句话,那么每个构造器都需要加入这几句代码
//这样实在冗余,这个时候可以使用代码块
{
System.out.println("电影正在加载----");
System.out.println("电影加载成功");
System.out.println("电影开始播放");
}
public Block(String name) {
System.out.println("第一个构造器");
// System.out.println("电影正在加载----");
// System.out.println("电影加载成功");
// System.out.println("电影开始播放");
this.name = name;
}
public Block(String name, int begin_time) {
// System.out.println("电影正在加载----");
// System.out.println("电影加载成功");
// System.out.println("电影开始播放");
this.name = name;
this.begin_time = begin_time;
}
public Block(String name, int begin_time, int end_time) {
System.out.println("最后一个构造器");
// System.out.println("电影正在加载----");
// System.out.println("电影加载成功");
// System.out.println("电影开始播放");
this.name = name;
this.begin_time = begin_time;
this.end_time = end_time;
}
}
运行结果:
使用代码块,他会先运行代码块,再运行构造器内代码,并且跟代码块的位置美关系,放在后面也会先运行代码块内容
多了个父类时,会先加载父类
但是普通代码块,创建一次对象就执行一次
用类名直接调用静态属性时没有创建新对象这个动作,所以只会调运静态代码块,普通代码块就不会执行
package com.block.test02;
class Main{
public static void main(String[] args) {
Block_ block = new Block_();
}
}
public class Block_ {
int a=getA();
static int b=getB();
public Block_() {
System.out.println("构造器被调用");
}
{
System.out.println("普通代码块被执行");
}
static {
System.out.println("静态代码块被执行");
}
int getA()
{
System.out.println("普通属性被执行");
return 100;
}
static int getB()
{
System.out.println("静态属性被执行");
return 100;
}
}
运行结果:
静态先运行,有两种或多种静态的代码语句就按顺序依次执行,然后再执行普通代码语句,有两种或多种普通的代码语句就按顺序依次执行。最后再执行构造器
package com.block.test03;
public class Block_ {
public static void main(String[] args) {
B b = new B();
}
}
class A{
{
System.out.println("a类代码块");
}
public A() {
System.out.println("a类构造器");
}
}
class B extends A{
{
System.out.println("b类代码块");
}
public B() {
System.out.println("b类构造器");
}
}
运行结果:
解析:
在创建对象B时会调用B的无参构造器(前会进行加载类的动作,在加载类的时候会开始执行static类型的数据,本段代码没有则直接忽略),于是乎进入B的无参构造器,但是在构造其中隐藏着两个动作,1.是会默认调用父类的无参构造器,2.是会默认调运(初始化)本类的代码块,普通参数.....
所以他会先到父类A中的默认构造器中,而A的默认构造器也会1.默认调用父类的无参构造器,2.是会默认调运(初始化)本类的代码块,普通参数.....但A类的父类时Object,所以调运其默认构造器是无事发生的,但A类是有代码块的,所以,会最执行代码块的内容再执行a的无参构造器内容再回到B类,B类调运完父类无参构造器就会开始调运本类的代码块了,所以再执行本类代码块内容,最后再执行构造器内容
package com.block.test04;
public class Black__ {
public static void main(String[] args) {
C c = new C();
}
}
//加载类时A静态属性 A静态代码块 B静态属性 B静态代码块 C静态属性 C静态代码块
//创建对象时然后进入构造器,构造器默认执行两个动作,先是调用父类无参构造器再初始化代码块和属性等。。。
//于是再创建C对象时进入了C的无参构造器然后调用了他的父类B的无参构造器,而进入B也默认执行两个动作,先是调用父类无参构造器再初始化代码块和属性等。。。
//于是又调用了A类无参构造器,A类父类为objec所以调用其构造器无事发生,于是进入a类代码块属性的初始化,先后顺序由其位置决定的
//该类中属性在前所以先运行属性代码,所以此时打印出A普通属性,再就是A普通代码块最后A类构造器被执行
//然后回到了B类b类调用完A后开始初始化自己的属性代码块等,顺序按写的先后,于是打印出B普通属性B普通代码块最后B类构造器被执行
//最后再是C类同上C普通属性 C普通代码块 C类构造器被执行
class A{
static int a=getA();
int b=getB();
static {
System.out.println("A静态代码块");
}
{
System.out.println("A普通代码块");
}
static int getA()
{
System.out.println("A静态属性");
return 100;
}
int getB()
{
System.out.println("A普通属性");
return 100;
}
public A() {
System.out.println("A类构造器被执行");
}
}
class B extends A{
static int c=getC();
int d=getD();
static {
System.out.println("B静态代码块");
}
{
System.out.println("B普通代码块");
}
static int getC()
{
System.out.println("B静态属性");
return 100;
}
int getD()
{
System.out.println("B普通属性");
return 100;
}
public B() {
System.out.println("B类构造器被执行");
}
}
class C extends B{
static int E=getE();
int F=getF();
static {
System.out.println("C静态代码块");
}
{
System.out.println("C普通代码块");
}
static int getE()
{
System.out.println("C静态属性");
return 100;
}
int getF()
{
System.out.println("C普通属性");
return 100;
}
public C() {
System.out.println("C类构造器被执行");
}
}
//A
解析:
在创建对象时会进行加载类的动作,加载类时会开始执行静态属性的代码,并按前后顺序进行于是就先输出了A静态属性 A静态代码块 B静态属性 B静态代码块 C静态属性 C静态代码块 再然后创建对象时进入构造器,构造器默认执行两个动作,先是调用父类无参构造器再初始化代码块和属性等。。。(谁在前谁先被执行) 于是再创建C对象时进入了C的无参构造器然后调用了他的父类B的无参构造器,而进入B也默认执行两个动作,先是调用父类无参构造器再初始化代码块和属性等。。。 于是又调用了A类无参构造器,A类父类为objec所以调用其构造器无事发生,于是进入a类代码块属性的初始化,先后顺序由其位置决定的,该类中属性在前所以先运行属性代码,所以此时打印出A普通属性,再就是A普通代码块最后A类构造器被执行 然后回到了B类b类调用完A后开始初始化自己的属性代码块等,顺序按写的先后,于是打印出B普通属性B普通代码块最后B类构造器被执行 最后再是C类同上C普通属性 C普通代码块 C类构造器被执行
例题: