public class FinalAndPrivate { @SuppressWarnings("all") public static void main(String[] args) { Parent p = new Parent(); p.call(); p.call2(); p.print(); p.staticMethod(); System.out.println("====================================="); Parent psub = new FAP(); psub.call(); psub.call2(); psub.print(); psub.staticMethod(); System.out.println("====================================="); FAP fap = new FAP(); fap.call(); fap.call2(); fap.print(); fap.print("hello world"); fap.staticMethod(); } } class Parent { private void show() { System.out.println("super.show() is calling..."); } public void call() { System.out.println("super.call() is calling..."); this.show(); } private final void show2() { System.out.println("super.show2() is calling..."); } public void call2() { System.out.println("super.call2() is calling..."); this.show2(); } public final void print() { System.out.println("super.print() is calling..."); } public static void staticMethod() { System.out.println("super.staticMethod() is calling..."); } } class FAP extends Parent { private void show() { System.out.println("FAP.show() is calling..."); } //override public void call() { System.out.println("FAP.call() is calling..."); this.show(); //编译错误,super.show() is not visible //super.show(); } public void show2() { System.out.println("FAP.show2() is calling..."); } /* * 编译错误,不能覆盖(override)超类的final方法 public final void print() { System.out.println("super.print() is calling..."); }*/ //可以重载(overload) public final void print(String str) { System.out.println("FAP.print(String str) is calling... message = " + str); } /* * 编译错误,不能覆盖(override)超类的static方法 public void staticMethod() { System.out.println("FAP.staticMethod() is calling..."); } */ public static void staticMethod() { System.out.println("FAP.staticMethod() is calling..."); } }
输出为:
super.call() is calling...
super.show() is calling...
super.call2() is calling...
super.show2() is calling...
super.print() is calling...
super.staticMethod() is calling...
=====================================
FAP.call() is calling...
FAP.show() is calling...
super.call2() is calling...
super.show2() is calling...
super.print() is calling...
super.staticMethod() is calling...
=====================================
FAP.call() is calling...
FAP.show() is calling...
super.call2() is calling...
super.show2() is calling...
super.print() is calling...
FAP.print(String str) is calling... message = hello world
FAP.staticMethod() is calling...
* static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
对静态方法的调用不存在任何动态的分派机制。 当一个程序调用了一个静态方法时,要被调用的方法
都是在编译时刻被选定的, 而这种选定是基于修饰符的编译期类型而做出的。
子类中可以创建相同签名static的方法,但是不会覆盖父类的static方法。
不能创建相同签名的非static方法,编译器会认为试图覆盖static方法而报错。
* 方法重载的选择是在编译时静态绑定的,方法覆盖的选择是在运行时根据具体类型动态绑定的。
编译时会根据方法调用时使用的接口或者基类的方法签名决定调用哪一个接口方法,运行时
再根据当前对象的具体类型,判断接口方法在当前对象所属类的实现中是否被覆盖过,如果覆盖了就
调用覆盖过的版本,否则调用接口方法。
* final方法和private方法的区别:
类中任何private方法默认是private final的,因为你不能访问一个private方法,所以你不能覆盖它。
(虽然当你试图覆盖一个private方法时,编译器没有给出错提示,但你并没有覆盖这个方法,你只是
创建了一个新的方法而已。)
final方法通常不会是private的,所以一般在子类或者类外部可以访问,由于其在子类中可见,所以不能
创建相同签名的方法。
* private方法只可以在类的内部使用,在类外根本访问不到,而final方法可以在类外访问,
但是不可以重写该方法(在子类中试图覆盖时编译器会给出错误提示,申明final方法不能被覆盖。),
就是说可以使用该方法的功能但是不可以改变其功能,这就是private方法和final方法的最大区别。
* final的方法可以内联(inline)优化,private的和static的也可以进行同样的优化。
相关推荐
Java 中 final 和 static 的区别 final 关键字在 Java 中有多种用法,包括修饰变量、方法、类等。下面是 final 关键字的各种用法: 1. final 修饰变量:表示该变量一旦被初始化,程序无法修改变量的值,该变量变成...
Static、Final 和 Static Final 的区别 Static、Final 和 Static Final 是 Java 中三个重要的关键字,它们之间的区别和应用场景是开发者需要了解和掌握的。 首先,让我们来了解 Static 关键字。Static 是 Java 中...
private static final int D = 70; public final int E; // final空白, 必须在初始化对象的时候赋初值 public Test3(int x) { E = x; } public static void main(String[] args) { Test3 t = new Test3(2)...
4. **工具类**:为了防止实例化工具类,通常将工具类的构造器声明为 `private` 并使用 `static` 方法来提供功能,有时候还需要将某些方法声明为 `final` 来避免被重写。 通过上述讨论可以看出,`static` 和 `final`...
### Java关键字final、static使用总结 #### 一、final关键字详解与应用 在Java语言中,`final`关键字被广泛应用于各种场景,如定义不可变的变量、禁止类的继承等,具有重要的作用。 1. **final修饰变量** - `...
1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.
本文将详细介绍 final 和 static 关键字的使用方法和注意事项。 一、final 关键字 final 关键字在 Java 中有多种用途,包括修饰类、方法和变量。 1. final 类 final 类是无法被继承的,final 类中的方法默认是 ...
private static int calculateInitialValue() { // 计算初始值的复杂逻辑 } } ``` 4. **非静态内部类与静态内部类的区别**: 非静态内部类(也称为成员内部类)与外部类有隐式的引用,而静态内部类则没有。这...
public static final String EMPTY = ""; public static final String ZERO = "零"; public static final String ONE = "壹"; public static final String TWO = "贰"; public static final String THREE = "叁...
// private static final String CONTENT_TYPE = "text/html; charset=GBK"; private static int WIDTH = 93; private static int HEIGHT = 25; public void doGet(HttpServletRequest request, ...
private static final String DATABASE_NAME = "MoneyManagerDB"; private static final int DATABASE_VERSION = 2; private static final String DATABASE_SETTING_TABLE = "SettingTbl"; private static final...
另一种是根据类名、接口名、成员方法及属性等来生成一个 64 位的哈希字段,例如 private static final long serialVersionUID = XXXL; 在 Java 序列化机制中,serialVersionUID 的重要性不言而喻,它可以确保序列...
这些修饰符包括`public`、`private`、`protected`以及`final`和`abstract`等。下面将详细解释这些关键字的意义及其在面向对象设计中的作用。 ### 1. `public` `public`是最开放的访问修饰符,意味着无论在哪一个类...
private static final int DIALOG_0 = 1; /**多个按钮信息框 **/ private static final int DIALOG_1 = 2; /**列表框 **/ private static final int DIALOG_2 = 3; /**进度条框 **/ private static final int...
本文目录一、abstract(抽象的)1...最后的)1.final可以修饰变量2.final可以修饰方法3.final可以修饰类总结abstract、static、final可以修饰的内容abstract、static、final是否可以修饰构造方法?private、abstract、sta
### Java中static、this、super、final用法详解 #### 一、static关键字 `static`关键字在Java中主要用于声明类成员(变量或方法)为静态成员。这意味着这些成员不属于任何特定的对象实例,而是属于整个类本身。因此...
private static final String DB NAME "people db"; private static final String DB TABLE "peopleinfo"; private static final int DB VERSION 1; public static final String KEY ID &...
在Java编程语言中,`static`、`this`、`super`和`final`是四个非常重要的关键字,它们各自有着特定的用途和含义。 1. **static**: 静态关键字`static`用于声明类级别的变量和方法,即静态变量和静态方法。静态变量...