java修饰符:abstract、static与final

    技术2026-06-18  9

    abstract

    adj. 纯理论的;抽象的;抽象派的

    需求:需要你设计一个bikeFactory类,用来createBike。假设生产自行车的过程如此:采购零件,组装零件,喷漆上色。 demo1:

    public class BikeFactory { public void caiGou() {//采购不是菜狗 System.out.println("1.采购车架,轮胎。。。"); } public void zuZhuang() {//组装 System.out.println("2.组装各部件。。。"); } public void penQi() {//喷漆 System.out.println("3.喷漆上色。。。"); } public void create() { System.out.println("工厂开始生产:"); caiGou();zuZhuang();penQi(); System.out.println("一辆自行车生产完成"); } public static void main(String[] args) { new BikeFactory().create(); } }

    工厂开始生产: 1.采购车架,轮胎。。。 2.组装各部件。。。 3.喷漆上色。。。 一辆自行车生产完成

    需求2:设计一个ofoBikeFactory类,生产ofoBike. 这时候显而易见:继承。 demo2:

    public class OfoBikeFactory extends BikeFactory { @Override public void caiGou() { super.caiGou(); } @Override public void zuZhuang() { super.zuZhuang(); } @Override public void penQi() { //super.penQi(); System.out.println("3.喷黄色漆,增加二维码、GPS"); } @Override public void create() { // TODO Auto-generated method stub super.create(); } public static void main(String[] args) { new OfoBikeFactory().create(); } }

    工厂开始生产: 工厂开始生产: 1.采购车架,轮胎。。。 2.组装各部件。。。 3.喷黄色漆,增加二维码、GPS 一辆自行车生产完成

    需求3假如这时候又有了第三个需求,生产哈罗单车。 写一个类似上例的HaloBikeFactory即可;

    工厂开始生产: 工厂开始生产: 1.采购车架,轮胎。。。 2.组装各部件。。。 3.喷蓝色漆,增加二维码、GPS 一辆自行车生产完成

    我们发现每个子类都重写了父类的方法,如果我们仅需要使用子类去实现具体的业务,这时候父类的三个生产步骤方法就没有必要去做具体实现,因此可以修改为抽象方法。 于是给父类和抽象方法加上修饰符:abstract。 abstrat方法无方法体,因此删除方法体,main方法中调用报错,说明abstract类无法被实例化。 思索一下父类三个方法到底有什么用? 总结:

    抽象类abstract抽象类仅规定了生产流程和标准,并不关心具体实现(模板方法 )抽象类不能被实例化,当然也就不能调用其方法抽象方法没有方法体

    static

    adj. 静态的;静电的;静力的

    demo1:

    public staticTest(){ System.out.println("构造方法"); } static { System.out.println("静态代码块"); } { System.out.println("非静态代码块"); } public static void main(String[] args) { staticTest st1=new staticTest(); staticTest st2=new staticTest(); }

    静态代码块 非静态代码块 构造方法 非静态代码块 构造方法

    静态代码块 只执行一次 非静态代码块 构造方法 每次创建对象都会执行 原因:

    静态代码块static静态代码块在类第一次加载的时候就会执行,以后不会在执行非静态代码块和构造方法会在每次使用这个类时执行因此常用于初始化工作static修饰的成员变量属于类 而非对象(验证如下demo2)

    demo2:

    public class TestStatic { public static String str="oldStr"; public String name="周星驰"; public static void main(String[] args) { TestStatic t1=new TestStatic(); TestStatic t2=new TestStatic(); System.out.println("t1:"+t1.str+"\t"+"t2:"+t2.str);//t1:oldStr t2:oldStr t1.str="newStr"; System.out.println("t1:"+t1.str+"\t"+"t2:"+t2.str);///t1:newStr t2:newStr System.out.println("t1:"+t1.name+"\t"+"t2:"+t2.name);//t1:周星驰 t2:周星驰 t1.name="李小龙"; System.out.println("t1:"+t1.name+"\t"+"t2:"+t2.name);//t1:李小龙 t2:周星驰 } }

    修改t1.name,t2.name并未改变; 修改t1.str ,t2.str随之改变。

    staticstatic修饰的成员变量属于类 而非对象、成员方法亦是(验证略)static修饰的成员变量 常用类名.成员变量来调用static修饰的类 理论上可以被继承(验证如下)

    demo3:

    public class Father { public static void showName() { System.out.println("fatherName"); } } public class Son extends Father{ } public class Test { public static void main(String[] args) { Son.showName(); } }

    子类继承了父类的静态方法?试下能否重写。

    public class Son extends Father{ public static void showName() { System.out.println("sonName"); } } public class Test { public static void main(String[] args) { Son.showName();//类名调用 打印sonName new Son().showName();//对象调用 打印sonName Father f=new Son();//子类赋给父类的引用,此处应该体现子类的特征(多态) f.showName();//打印fatherName } } static静态类可以被继承但使用Father f=new Son();f的引用时仍调用了父类的方法 所以是不能被覆盖的正确调用应该用类名.方法名 用哪个类的方法 就执行哪个方法写到这里去看了下别人的博客: 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?静态引用无法调用非静态引用 方法(验证如下)

    demo4:

    public class Test { private String name="name"; public void method() { } static { System.out.println(name); System.out.println(this.name); method(); } public static void staticMethod() { System.out.println(name); System.out.println(this.name); method(); } }

    因此:静态引用无法调用非静态引用变量 方法 this等关键字亦无法使用 原因:静态代码块会在类加载时执行一次(此时还未创建类的对象),因此对象非静态成员变量和方法无法获得。 简而言之: (先)静态代码块 静态方法在类加载进内存时就会执行 (后)非静态代码块 在类实例化时执行

    final

    adj. 最终的;决定性的;不可更改的

    finalfinal修饰的变量为常量 修饰的方法为最终方法 修饰的类为最终类final修饰的所有内容无法更改 因此final类也无法继承 final方法无法重写 final属性值无法修改final类中方法默认为final修饰final修饰的变量必须有初始值

    demo1:

    总结

    abstract抽象类仅规定了生产流程和标准,并不关心具体实现(模板方法 )抽象类不能被实例化,当然也就不能调用其方法抽象方法没有方法体 static静态代码块在类第一次加载的时候就会执行,以后不会在执行(demo1)非静态代码块和构造方法会在每次使用这个类时执行,因此常用于初始化工作static修饰的成员变量属于类 而非对象(demo2)static修饰的成员变量属于类 而非对象,成员方法亦是(验证略)static修饰的类 理论上可以被继承(demo3)但使用Father f=new Son();f的引用时仍调用了父类的方法 所以是不能被覆盖的正确调用应该用类名.方法名 用哪个类的方法 就执行哪个类名.方法静态引用无法调用非静态引用 方法(demo4) finalfinal修饰的变量为常量 修饰的方法为最终方法 修饰的类为最终类final修饰的所有内容无法更改 因此final类也无法继承 final方法无法重写 final属性值无法修改final类中方法默认为final修饰final修饰的变量必须有初始值

    思考

    main()中是否可以直接调用成员变量? static和abstract是否可以修饰同一个方法? abstract和final是否可以修饰同一个方法/类? static和final可以一起使用吗?

    –学习之余仅作记录如有错误 恳请支出。

    Processed: 0.009, SQL: 9