packagecom.xz.abstract_;publicclass AA extendsTemplate{publicvoidjob(){long count =0;for(long i =1; i <=800000; i++){
count += i;}}}
packagecom.xz.abstract_;publicclass BB extendsTemplate{publicvoidjob(){long count =0;for(long i =1; i <=80000; i++){
count *= i;}}}
packagecom.xz.abstract_;publicabstractclassTemplate{publicabstractvoidjob();publicvoidcalTime(){//得到开始的时间long start =System.currentTimeMillis();job();//动态绑定机制//得到结束的时间long end =System.currentTimeMillis();System.out.println("运行时间为:"+(end - start));}}
packagecom.xz.abstract_;publicclassTestTemplate{publicstaticvoidmain(String[] args){AA aa =newAA();
aa.calTime();BB bb =newBB();
bb.calTime();}}
packagecom.xz.abstract_;publicclassAbstractDetail01{publicstaticvoidmain(String[] args){//抽象类不能被实例化// A a = new A();}}//1)抽象类不能被实例化abstractclassA{}//2)抽象类不一定要包含abstract方法。 也就是说抽象类可以没有abstract方法abstractclassB{}//3)一旦类包含 了abstract方法,则这个类必须声明为abstractabstractclassC{publicabstractvoidsay();}//4) abstract只能修饰类和方法,不能修饰属性和其它的。classD{// public abstract int n1 = 10;}
AbstractDetail
packagecom.xz.abstract_;publicclassAbstractDetail01{publicstaticvoidmain(String[] args){//抽象类不能被实例化// A a = new A();}}//1)抽象类不能被实例化abstractclassA{}//2)抽象类不一定要包含abstract方法。 也就是说抽象类可以没有abstract方法abstractclassB{}//3)一旦类包含 了abstract方法,则这个类必须声明为abstractabstractclassC{publicabstractvoidsay();}//4) abstract只能修饰类和方法,不能修饰属性和其它的。classD{// public abstract int n1 = 10;}
packagecom.xz.codeblock_;publicclassCodeBlockDetail{publicstaticvoidmain(String[] args){//类 被加载的时候 静态代码块会被执行//以下三种情况类会被加载//1.创建对象实例时//A a = new A();//2.创建子类对象实例,父类代码块也会被加载//A a1 = new A();//3.使用类的静态成员时(静态属性、静态方法)// System.out.println(Dog.n1);//静态代码块只会被执行 (类只会加载一次)一次// System.out.println(Dog.n1);//普通代码块 被创建一次 就会就会调用一次// DD dd1 = new DD();// DD dd2 = new DD();//如果只是使用类的静态成员,普通代码块并不会执行System.out.println(DD.num);}}class DD {publicstaticint num =999;static{System.out.println("DD的静态代码块被执行...");System.out.println("=================");}//在new对象时会被调用,每加载一次就会被执行一次//可以这样简单理解:普通代码块是构造器的一种补充机制,构造器没被调用,普通代码块也不会被调用{System.out.println("DD的普通代码块被执行...");}}classDog{publicstaticint n1 =10;static{System.out.println("Dog的代码块被执行...");System.out.println("=================");}}classAextendsB{static{System.out.println("A的代码块被执行...");System.out.println("=================");}}classB{static{System.out.println("B的代码块被执行...");System.out.println("=================");}}
CodeBlockDetail02
packagecom.xz.codeblock_;publicclassCodeBlockDetail02{publicstaticvoidmain(String[] args){AA aa =newAA();}}//静态代码块优先级高于普通代码块//最后执行的才是构造方法class AA {//无参构造器publicAA(){System.out.println("无参构造器被调用...");}//普通属性的初始化privateint n2 =getN2();{System.out.println("普通代码块被执行...");}privateintgetN2(){System.out.println("getN2被调用...");return200;}//属性初始化和静态代码块执行优先级一样//所以系统会按顺序执行//属性初始化privatestaticint n1 =getN1();//静态代码块static{System.out.println("静态代码块被执行....");}publicstaticintgetN1(){System.out.println("getN1被调用...");return100;}}
Final关键字学习
fianl关键字入门
packagecom.xz.final_;publicclassFinal01{publicstaticvoidmain(String[] args){E e =newE();// e.TAX_RATE=0.09;}}//1.不希望被继承,可加finalfinalclassA{}//class B extends A{//}//2.不希望父类某个方法被子类覆盖/重写classC{publicfinalvoidsay(){System.out.println("say()...");}}//class D extends C {// @Override// public void say() {// super.say();// }//}//3.不希望某个属性的值被修改classE{publicfinaldouble TAX_RATE =0.08;}//4.不希望某个局部变量被修改classF{publicvoidhi(){finaldouble TAX_RATE =0.08;// TAX_rate = 0.09;System.out.println(TAX_RATE);}}