Java父类继承中的static和final用法

1、父类中staitic修饰的静态方法,不能覆盖、不能继承。

2、父类中staitic修饰的变量或常量,能覆盖、不能继承。

static修饰的变量和方法,只属于类本身,不属于对象;当声明一个对象时,并不产生static变量和方法的拷贝。也就是说,用static修饰的变量和方法在类加载的时候,会分配一块存储空间,所有此类的对象都可以操控此块存储空间;

注意:当子类没有与父类同名的static变量(或方法时),子类的对象也可操控这块内存空间。但是,子类并没有继承父类中static修饰的变量和方法。这是因为static修饰的变量和方法是属于父类本身的。

3、父类中final修饰的方法,不能覆盖,但可继承。

代码示例:

package com.jdk;

/**
 * Created by Liuxd on 2018-11-02.
 */
public class TestExtendsClass {
  public static void main(String[] args) {
    ParentClass parentClass = new ChildClass();
    System.out.println();

    int pFResult = ParentClass.plus(3,2);
    int pResult = ParentClass.add(3,2);
    int cResult = ChildClass.add(3,2);

    int pMResult = parentClass.minus(2,3);

    System.out.println("父类静final方法计算结果:" + pFResult);
    System.out.println("父类静方法计算结果:" + pResult);
    System.out.println("子类静方法计算结果:" + cResult);
    System.out.println("父类final方法计算结果:" + pMResult);

    System.out.println("父类静态变量num:" + ParentClass.num);
    System.out.println("子类静态变量num:" + ChildClass.num);

  }
}

class ParentClass {
  public static final int num = 1;
  ParentClass() {
    System.out.println("执行父类无参数构造方法");
  }

  static int add(int i, int j) {
    return i + j;
  }

  static final int plus(int i, int j) {
    return i + j;
  }

  final int minus(int i, int j) {
    return i - j;
  }

}

class ChildClass extends ParentClass {
  public static final int num = 2;
  ChildClass() {
    System.out.println("执行子类无参数构造方法");
  }

//  @Override 无法继承,编译时出错
  static int add(int i, int j) {
    return i * j;
  }

//  无法继承,编译时出错
//  int plus(int i, int j) {
//    return i + j;
//  }

//  无法继承,编译时出错
//  int minus(int i, int j) {
//    return i - j;
//  }

}

输出结果:

执行父类无参数构造方法

执行子类无参数构造方法

父类静final方法计算结果:5

父类静方法计算结果:5

子类静方法计算结果:6

父类final方法计算结果:-1

父类静态变量num:1

子类静态变量num:2

补充知识:java中static、final 和 static final之间的区别

static可以修饰:全局属性,方法,代码块,内部类(静态内部类或嵌套内部类)

由于静态属性和方法是属于该类的所有对象的,所以可以用类名.静态属性/方法名来访问。用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。

1.被static修饰的变量,叫静态变量或类变量(不能是局部变量),直接可以用类名调用;被static修饰的变量,叫实例变量,必须实例化对象以后调用;static修饰的变量可以被修改.

2.静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,也不能直接访问所属类的实例变量和实例方法(非static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

3.父子类中,静态方法只能被静态方法覆盖,父子类中,非静态方法只能被非静态方法覆盖。

常见的java中的main方法必须有static修饰,因为在类加载时无法创建对象,静态方法可以不通过对象调用,所以在类的main方法所在在类加载时就可以通过main方法入口来运行程序。

4.static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

final可以修饰:方法,类,局部变量

对于基本类型数据,final会将值变为一个常量,创建后不能被修改;但是对于对象句柄(亦可称作引用或者指针),final会将句柄变为一个常数(进行声明时,必须将句柄初始化到一个具体的对象。而且不能再将句柄指向另一个对象。

但是,对象的本身是可以修改的。这一限制也适用于数组,数组也属于对象,数组本身也是可以修改的。

方法参数中的final句柄,意味着在该方法内部,我们不能改变参数句柄指向的实际东西,也就是说在方法内部不能给形参句柄再另外赋值)。

1.final修饰的变量就会变成常量,而且应当大写,一旦赋值不能改变,final的常量不会有默认初始值,对于直接在初始化赋值时final修饰符常和static修饰符一起使用。

2.final修饰的方法将不能被其子类覆盖重写。

3.final修饰的类类将不能被继承,且final类中的方法也都是final的, final不能用来修饰构造方法,在父类中如果有常量属性,在子类中使用常量属性时是不会进行父类的类加载。

static final和final static

没什么区别,一般static写在前面,既具有static属性又具有final属性的类/方法/变量。

以上这篇Java父类继承中的static和final用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中的静态绑定和动态绑定详细介绍

    一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言.当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢,这应该是我们在初学Java时遇到的问题.这里首先我们将确定这种调用何种方法实现或者变量的操作叫做绑定. 在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定.另一种就是动态绑定,亦称为后期绑定. 区别对比 1.静态绑定发生在编译时期,动态绑定发生在运行时 2.使用private或stati

  • Java中继承、多态、重载和重写介绍

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

  • Java中static静态变量的初始化完全解析

    静态变量初始化顺序 1.简单规则 首先先看一段最普遍的JAVA代码: public class Test { public static Test1 t = new Test1(); public static int a = 0; public static int b; public static void main(String[] arg) { System.out.println(Test.a); System.out.println(Test.b); } } class Test1

  • java的继承原理与实现方法详解

    本文实例讲述了java的继承原理与实现方法.分享给大家供大家参考,具体如下: 继承 1.java中是单继承的.每个子类只有一个父类. 语法:子类 extends 父类 2.在java中,即使没有声明父类,也有一个隐含的父类,就是Object类 3.在子类中可以使用super来调用父类的方法 4.继承中的构造方法问题 在new一个子类实例的过程中,会优先自动调用父类默认的无参数构造方法,然后再调用子类的构造方法.如果父类没有默认的构造方法,只有带参数的构造方法,此时就会出错. 除了由jvm自动调用

  • Java父类继承中的static和final用法

    1.父类中staitic修饰的静态方法,不能覆盖.不能继承. 2.父类中staitic修饰的变量或常量,能覆盖.不能继承. static修饰的变量和方法,只属于类本身,不属于对象:当声明一个对象时,并不产生static变量和方法的拷贝.也就是说,用static修饰的变量和方法在类加载的时候,会分配一块存储空间,所有此类的对象都可以操控此块存储空间: 注意:当子类没有与父类同名的static变量(或方法时),子类的对象也可操控这块内存空间.但是,子类并没有继承父类中static修饰的变量和方法.这

  • Java修饰符abstract与static及final的精华总结

    目录 修饰符abstract (抽象的) 一.abstract可以修饰类 二.abstract可以修饰方法 修饰符之static? (静态的) 一.static可以修饰属性 二.static可以修饰方法 三.static可以修饰初始化代码块 修饰符之final? (最终的) 一.final可以修饰变量 二.final可以修饰方法 三.final可以修饰属性 修饰符abstract (抽象的) 一.abstract可以修饰类 (1) 被abstract修饰的类称为抽象类(2) 语法: abstra

  • java lambda 表达式中的双冒号的用法说明 ::

    双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 注意是方法名哦,后面没有括号"()"哒.为啥不要括号,因为这样的是式子并不代表一定会调用这个方法.这种式子一般是用作Lambda表达式,Lambda有所谓懒加载嘛,不要括号就是说,看情况调用方法. 例如 表达式: person -> person.getAge(); 可以替换成 Person::getAge 表达式 () -> new HashMap<>(); 可以替换成 HashMa

  • C++类中的static和const用法实例教程

    static和const是C++程序设计中非常重要的概念,本文实例列举了C++类中的static和const的规则和用法.供大家参考借鉴.具体说明如下: 首先以代码用来举例说明.示例代码如下: class A { public: A():m(10) //const成员必须在构造函数的初始化构造列表中初始化 { q = 40; } void fun1()const { m++; //错误.const成员是常量,不能改变其值. n++; //正确.static变量n属于类,但是每个对象的函数都可以访

  • Java多线程编程中synchronized关键字的基础用法讲解

    多线程编程中,最关键.最关心的问题应该就是同步问题,这是一个难点,也是核心. 从jdk最早的版本的synchronized.volatile,到jdk 1.5中提供的java.util.concurrent.locks包中的Lock接口(实现有ReadLock,WriteLock,ReentrantLock),多线程的实现也是一步步走向成熟化.   同步,它是通过什么机制来控制的呢?第一反应就是锁,这个在学习操作系统与数据库的时候,应该都已经接触到了.在Java的多线程程序中,当多个程序竞争同一

  • 关于Java继承中父类和子类构造函数的问题

    Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 可以参考这篇Java子类实例化总是默认调用父类的无参构造操作 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自己的无参和有参构造方法.不论实例化时调用的是子类的有参还是无参构造函数,默认调用的是父类的无参构造函数. 2.当父类有显式定义无参构造方法时, 此时子类也可以有自己的无参和有参构造方法.类似于1,同样默认隐式调用父类的无参构造方法. 3.

  • 浅谈java继承中是否创建父类对象

    1. 调用父类构造方法是真的,但是根本没有创建父类对象,只不过是调用父类构造方法来初始化属性. 如果说调用父类构造方法就等于创建父类对象,那就真的无稽之谈. new指令开辟空间,用于存放对象的各个属/性引用等,反编译字节码你会发现只有一个new指令,所以开辟的是一块空间,一块空间就放一个对象. 然后,子类调用父类的属性,方法啥的,那并不是一个实例化的对象. 在字节码中子类会有个u2类型的父类索引,属于CONSTANT_Class_info类型,通过CONSTANT_Class_info的描述可以

  • Java中this,static,final,const用法详解

    一.this 用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是够也应该有一个引用来访问自己的属性和方法纳?JAVA提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法. Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this.因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现t

  • 解析Java继承中方法的覆盖和重载

    方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public c

  • 学习Java的static与final关键字

    static:(静态修饰符)面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的成员变量一般称作类成员变量,而static修饰的方法一般称作类方法. 分类: 1.static变量,也叫作静态变量或者类变量.另一种是没有被static修饰的变量,叫实例变量. 2.static方法,也叫作静态方法或者类方法,静态方法中不能定义静态变量,实例方法也不能. 3.static代码块,静态块中,可以访问静态变量,调用静态方法. 注意事项: 1.static不依附于任何对

随机推荐