请说说你所知道的java中的代码块,java代码块的用处
00-1010 1.基础语法基础入门,快速入门,2。代码块详细信息类的调用序列,2个代码块详细信息示例,2个代码块详细信息示例
00-1010代码块,也叫初始化块,属于一个类的成员(类的一部分)。类似于方法,逻辑语句封装在方法体中,用{}支撑;
但与方法不同的是,没有方法名,没有返回,没有参数,只有方法体,不需要通过对象或类显式调用。
00-1010(修饰符)(可选){ code };
注意:
1.修饰符是可选的。要写,只能写静态。
2.代码块可以分为两类,有静态修改的称为静态代码块,没有静态修改的称为普通代码块。
3.并非不可或缺
利益
1.它相当于另一种形式的构造函数,可以初始化。
2.如果在多个构造函数中有重复的语句,可以将它们提取到代码块中。
目录
包com . demo . code block _;Public class代码块01 { public static void main(string[]args){ movie M01=new movie( Pacific Rim );电影m02=新电影(野飞,66);电影m03=新电影(‘忙得要死’,55,‘老k’);} }类电影{私有字符串名称;私人双倍价格;私弦导演;{System.out.println(电影屏幕打开。);System.out.println(广告开始。);System.out.println(电影开始。);}//三个构造函数重载public movie(string name){//system . out . println(电影画面打开。);//System.out.println(广告开始。);//System.out.println(电影开始。);调用System.out.println(构造函数movie(字符串名))。);this.name=name} public movie (string name,double price){//system . out . println(电影画面打开。);//System.out.println(广告开始。);//System.out.println(电影开始。);调用System.out.println(构造函数movie(字符串名,double price)。);this.name=namethis.price=价格;}公共电影(串名,双价,串导演){//system.out.println(电影画面打开。);//System.out.println(广告开始。);//System.out.println(电影开始。);调用System.out.println(构造函数movie(字符串名,双价格,字符串director)。);this.name=namethis.price=价格;this.director=director}}
00-1010代码块使用说明和详细讨论
1)静态代码块(static code block)也叫静态代码块,用于初始化类,随着类的加载而执行,只会执行一次。如果是普通的代码块,那么每次创建对象时都会执行。
2)班级什么时候加载【重要!]
创建对象实例时(新建)
创建一个子类对象实例,父类也会被加载。
当使用类的静态成员(静态属性、静态方法)时
示例:类a的静态块扩展了类b
3)创建对象实例时会隐式调用普通代码块。一旦创建,它将被调用。
一次。 如果只是使用类的静态成员时,普通代码块并不会执行。
package com.demo.codeblock_;public class codeblock02 { public static void main(String[] args) { //类被加载的情况举例 //1.创建对象时new //AA aa=new AA(); //2.创建子类对象实例,父类也会被加载,而且,父类先被加载,子类后被加载 AA aa01=new AA(); //3.使用类的静态成员时 System.out.println(cat.n); DD d1=new DD(); DD d2=new DD(); }}class DD{ static { System.out.println("DD的静态代码被执行1次"); }}class animal{ static { System.out.println("animal的静态代码被执行"); }}class cat extends animal{ public static int n=888; //静态代码块 static { System.out.println("cat的静态代码块被执行"); }}class BB { static { System.out.println("BB的静态代码被执行"); }}class AA extends BB{ static { System.out.println("AA的静态代码被执行"); }}
类的调用顺序
创建一个对象时,在一个类调用顺序:(重点、难点)
①调用静态代码块和静态属性初始化 ( 注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
②调用普通代码块和普通属性的初始化 ( 注意:普通代码块和普 通属性初始化调用的优先级一样,如果有多个普通代码块和多 不普通属性初始化,则按定义顺序调用)
③调用构造方法。
实例
package com.demo.codeblock_;public class codeblock03 { public static void main(String[] args) { A a=new A(); }}class A{ public A(){ System.out.println("A的无参构造被调用"); } int n2=getn2(); {//普通代码块 System.out.println("A的普通代码块被调用"); } int getn2(){ System.out.println("getn2被调用"); return 99; } private static int n=getn(); static { System.out.println("A的静态代码被调用"); } public static int getn(){ System.out.println("getn被调用"); return 100; }}
代码块细节2
构造器的最前面其实隐含了 super(和调用普通代码块,新写一个类演示静态相关的代码块,属性初始化,在类加载时,就执行完毕
,因此是优先于构造器和普通代码块执行的
class A {public AO{super0://调用普通代码块_System.out.println("ok");}}
实例
package com.demo.codeblock_;public class codeblock04 { public static void main(String[] args) { B b=new B(); }}class AA{ { System.out.println("AA的普通代码块"); } public AA(){ //1.super() //2.调用本类的普通代码块 System.out.println("AA的构造器被调用"); }}class B extends AA{ { System.out.println("B的普通代码块"); } public B(){ //1.super() //2.调用本类的普通代码块 System.out.println("B的构造器被调用"); }}
代码块细节2
我们看一下创建一个子类对象时(继承关系),他们的静态代码块,静态属性初 始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
1.父类的静态代码块和静态属性(优先级一样,按定义顺序热行
2.子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
3.父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
4.父类的构造方法
5.子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
6.子类的构造方法
7.静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调 用任意成员。
实例
package com.demo.codeblock_;public class codeblock05 { public static void main(String[] args) { //老师说明 //(1) 进行类的加载 //1.1 先加载 父类 A02 1.2 再加载 B02 //(2) 创建对象 //2.1 从子类的构造器开始 //new B02();//对象 new C02(); }}class A02 { //父类 private static int n1 = getVal01(); static { System.out.println("A02的一个静态代码块..");//(2) } { System.out.println("A02的第一个普通代码块..");//(5) } public int n3 = getVal02();//普通属性的初始化 public static int getVal01() { System.out.println("getVal01");//(1) return 10; } public int getVal02() { System.out.println("getVal02");//(6) return 10; } public A02() {//构造器 //隐藏 //super() //普通代码和普通属性的初始化...... System.out.println("A02的构造器");//(7) }}class C02 { private int n1 = 100; private static int n2 = 200; private void m1() { } private static void m2() { } static { //静态代码块,只能调用静态成员 //System.out.println(n1);错误 System.out.println(n2);//ok //m1();//错误 m2(); } { //普通代码块,可以使用任意成员 System.out.println(n1); System.out.println(n2);//ok m1(); m2(); }}class B02 extends A02 { // private static int n3 = getVal03(); static { System.out.println("B02的一个静态代码块..");//(4) } public int n5 = getVal04(); { System.out.println("B02的第一个普通代码块..");//(9) } public static int getVal03() { System.out.println("getVal03");//(3) return 10; } public int getVal04() { System.out.println("getVal04");//(8) return 10; } //一定要慢慢的去品.. public B02() {//构造器 //隐藏了 //super() //普通代码块和普通属性的初始化... System.out.println("B02的构造器");//(10) // TODO Auto-generated constructor stub }}
到此这篇关于Java深入理解代码块的使用细节的文章就介绍到这了,更多相关Java代码块内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。