第八章三个修饰符static修饰符final修饰符abstract修饰符·static修饰符static修饰属性的特点①static可以修饰属性,不可以修饰局部变量②static修饰的属性全类公有classMyValue{inta;staticintb;}publicclassTest{publicstaticvoidmain(Stringargs[]){MyValuemv1=newMyValue();MyValuemv2=newMyValue();mv1.a=100;mv1.b=200;mv2.a=300;mv2.b=400;System.out.println(mv1.a);//100System.out.println(mv1.b);//400全类公有System.out.println(mv2.a);//300System.out.println(mv2.b);//400}}③static修饰的属性可以通过类名来访问classMyValue{inta;staticintb;}publicclassTest{publicstaticvoidmain(Stringargs[]){MyValuemv1=newMyValue();MyValuemv2=newMyValue();mv1.a=100;MyValue.b=200;mv2.a=300;MyValue.b=400;System.out.println(mv1.a);//100System.out.println(MyValue.b);//400System.out.println(mv2.a);//300System.out.println(MyValue.b);//400}}④static修饰的属性也可以叫做类变量静态属性:用static修饰的属性,又叫:类变量属性:非静态属性:不用static修饰,又叫:实例变量成员变量⑤static修饰的属性什么时候被初始化?类加载的时候初始化static修饰的变量(类变量)类加载:在创建一个对象之前,需将硬盘中.class文件内容读取到内存(java虚拟机)的过程classMyValue{inta=10;staticintb=20;}static修饰方法static修饰的方法称为静态方法publicclassTest{publicstaticvoidtest(){}}//public和static可以互换位置可以通过类名调用Test.test()非静态方法无论属性和方法是否是静态的都是可以访问的静态方法只能访问静态属性和静态方法publicclassTest{staticinta=10;intb=20;publicvoidtest1(){}publicStaticvoidtest2(){}publicStaticvoidtest3(){System.out.println(a);System.out.println(b);//错误test1();//错误}}静态方法中不能使用this关键字非静态方法只能覆盖非静态方法静态方法只能覆盖静态方法,但是没有多态publicclassTest{publicstaticvoidmain(Stringargs[]){Supers=newSub();s.m();//等效于Super.m}}classSuper{publicstaticvoidm(){System.out.print(thisissuper);}}classSubextendsSuper{publicstaticvoidm(){System.out.print(thisissub);}}静态代码块在类加载时执行静态代码块的内容publicclassTestStaticStatement{publicstaticvoidmain(Stringargs[]){//第一个对象创建是类加载执行静态代码块只执行一次MyClassm1=newMyClass();MyClassm2=newMyClass();}}classMyClass{static{System.out.println(thisisstaticstatement);}//创建对象时直接调用Stringname=suns;publicvoidtest(){}}·final修饰符变量方法类final修饰符变量(属性,局部变量)也称为常量一旦赋值,其值不可改变final修饰局部变量publicclassTest{publicstaticvoidmain(Stringargs[]){finalintA=10;//不变//A++;//错误}}publicclassTest{publicstaticvoidmain(Stringargs[]){finalMyClassM1=newMyClass();//引用首地址不变,但值可以变M1.value=20;M1.value=30;M1=newMyClass();//错误}}classMyClass{intvalue;}final修饰属性时,必须对属性显示赋值或提供构造方法对属性赋值classMyClass{finalinti;//错误}classMyClass{finalinti=10;}classMyClass{finalinti=10;publicMyClass(inti){this.i=i;}}以上两种正确的赋值方法不能同时使用finalstatic一起修饰属性classMyClass{staticfinalinti=20;//减少内存空间的占用}final修饰符修饰的方法不能被子类覆盖classMySuper1{publicfinalvoidtest(){System.out.println(thisissuper);}}classMySub1extendsMySuper1{/*publicvoidtest(){}*/}final修饰符修饰的类不能被继承finalclassMySuper{}/*classMySubextendsMySuper{}*/·abstract修饰符类方法abstract修饰符修饰的类叫做抽象类抽象类可以用于声明,但不允许创建对象MyClassm1;//正确。m1=newMyClass();//错误抽象类可以被子类继承,从而创建子类对象publicclassTestAbstract{publicstaticvoidmain(Stringargs[]){MyClassmc;mc=newMySubClass();//正确}}abstractclassMyClass{intvalue;publicvoidtest(){System.out.println(thisistest());}}classMySubClassextendsMyClass{}抽象方法:一个只有声明,没有实现的方法classMyClass{//半成品intvalue;publicvoidtest(){System.out.println(thisistest());}publicabstractvoidtest1();}拥有抽象方法的类必须是抽象类abstractclassMyClass{//完整intvalue;publicvoidtest(){System.out.println(thisistest());}publicabstractvoidtest1();}抽象方法由子类实现publicclassTestAbstract{publicstaticvoidmain(Stringargs[]){MyClassm=newMySubClass();//抽象方法由子类实现m.test();//按照多态的特点执行子类覆盖的方法}}abstractclassMyClass{//抽象类intvalue;publicabstractvoidtest();//抽象方法}classMySubClassextendsMyClass{//父类:MyClass.子类:MySubClasspublicvoidtest(){System.out.println(thisistest());}}抽象的作用抽象类是更高层次的抽象publicclassTestAbstract{publicstaticvoidmain(Stringargs[]){Shapes=newCircle(3);//抽象方法由子类实现doublegrith=s.girth();//调用Circle子类中的方法girth()System.out.println(grithis+grith);}}abstractclassShape{publicabstractdoublegirth();publicabstractdoublearea();}classCircleextendsShape{privatedoubler;privatestaticfinaldoublePI=3.1415926;publicCircle(doubler){this.r=r;}publicdoublegirth(){return2*PI*r;}publicdoublearea(){returnPI*r*r;}}classRectextendsShape{privatedoublea;privatedoubleb;publicRect(doublea,doubleb){this.a=a;this.b=b;}publicdoublegirth(){return2*(a+b);}publicdoublearea(){returna*b;}}