Java中的覆盖和隐藏以及final关键字

Java覆盖和隐藏

  • (1) 变量只能被隐藏(包括静态和非静态),不能被覆盖;
  • (2) 可以用子类的静态变量隐藏父类的静态变量,也可以用子类的非静态变量隐藏父类的静态变量,也可以用非最终变量(final)隐藏父类中的最终变量;
  • (3) 静态方法(static)只能被隐藏,不能被覆盖;
  • (4) 非静态方法可以被覆盖;
  • (5) 不能用子类的静态方法隐藏父类中的非静态方法,否则编译会报错;
  • (6) 不能用子类的非静态方法覆盖父类的静态方法,否则编译会报错;
  • (7) 不能重写父类中的最终方法(final);
  • (8) 抽象方法必须在具体类中被覆盖;
  • (9)静态方法和实例方法不能互相覆盖;

Java里用final修饰的成员和成员变量能否被继承

  • (1) final修饰的成员和成员变量,可以被继承。
  • (2) final修饰的方法可以被继承不能被重写。
  • (3) final修饰的类,不能被继承。
/**
 * Cat class
 * Java 中实例方法被覆盖,静态方法被隐藏
 *
 * @author libin
 * @date 2019/1/28 17:05
 */
class Animal {
    public static void testClassMethod() {
        System.out.println("Class" + " method in Animal.");
    }

    public void testInstanceMethod() {
        System.out.println("Instance " + " method in Animal.");
    }
}

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The class method" + " in Cat.");
    }

    @Override
    public void testInstanceMethod() {
        System.out.println("The instance method" + " in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

参考答案

Class method in Animal.
The instance method in Cat.
/**
 * Demo class
 *
 * @author libin
 * @date 2019/1/28 16:25
 */
class A {
    static void fun() {
        System.out.println("A.fun()");
    }
}

class B extends A {
    static void fun() {
        System.out.println("B.fun()");
    }
}

public class Demo {
    public static void main(String args[]) {
        A a = new B();
        a.fun();
    }
}

参考答案

A.fun()
/**
 * Son class
 *
 * @author libin
 * @date 2019/1/29 10:25
 */

class Dad {
    protected static String me = "dad";

    public void printMe() {
        System.out.println(me);
    }
}

public class Son extends Dad {
    protected static String me = "son";

    @Override
    public void printMe() {
        System.out.println(me);
    }

    public static void main(String[] args) {
        Dad dad = new Son();
        Son son = new Son();
        System.out.println("son.me:" + son.me);
        System.out.println("dad.me:" + dad.me);
        System.out.println("Son.me:" + Son.me);
        System.out.println("Dad.me:" + Dad.me);
        son.printMe(); // dad
        dad.printMe(); // dad
    }
}

参考答案

son.me:son
dad.me:dad
Son.me:son
Dad.me:dad
son
son

反编译Class代码

class Dad
{
    protected static String me;

    public void printMe() {
        System.out.println(Dad.me);
    }

    static {
        Dad.me = "dad";
    }
}

public class Son extends Dad
{
    protected static String me;

    @Override
    public void printMe() {
        System.out.println(Son.me);
    }

    public static void main(final String[] args) {
        final Dad dad = new Son();
        final Son son = new Son();
        System.out.println("son.me:" + Son.me);
        System.out.println("dad.me:" + Dad.me);
        System.out.println("Son.me:" + Son.me);
        System.out.println("Dad.me:" + Dad.me);
        son.printMe();
        dad.printMe();
    }

    static {
        Son.me = "son";
    }
}

参考链接

原文地址:https://www.cnblogs.com/hglibin/p/10333551.html

时间: 2024-08-01 18:05:18

Java中的覆盖和隐藏以及final关键字的相关文章

【Java学习笔记之二十】final关键字在Java继承中的用法小结

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类   当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用final

Java中的内存处理机制和final、static、final static总结

Java中的内存处理机制和final.static.final static总结 装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性.所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提.         一个完整的Java程序运行过程会涉及以

JAVA中方法和变量在继承中的覆盖和隐藏(一)

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下 首先我们来看几个概念 类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量. 实例变量:属于类的实例,即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量. 静态方法:通过类名访问. 实例方法:对象访问,

JAVA中方法和变量在继承中的覆盖和隐藏

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题. 隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法 覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问par

在java中string为什么要设计成final的

各种不同的理解 1 将方法或类声明为final主要目的是:确保它们不会再子类中改变语义.String类是final类,这意味着不允许任何人定义String的子类.换言之,如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象.——<Java核心技术 卷I> 2 举个例子:一个方法可能本来接受String类型并返回其大写方式 public static String uppperString(String s){ return s.toUpperCase();

java中的覆盖,重载和多态

今天来介绍java中的三大强功能覆盖,重载和多态. 方法覆盖:当一个子类继承了一个父类时,它也同时继承了父类的属性和方法,可以直接使用父类的属性和方法,或者,如果父类的方法不能满足子类的需求,则可以在子类中对父类的方法进行"改造"即覆盖.在覆盖的过程中,需要提供和父类中的被覆盖方法相同的方法名称,输入参数以及返回类型.另外,在子类对父类的方法进行覆盖的过程中,不能使用比父类中的被覆盖方法更严格的访问权限,例如父类中方法的修饰符为public,则子类的覆盖方法不能用protected,d

【Java基本功】一文读懂final关键字的用法

本文主要介绍了final关键字的基本使用方法及原理 final关键字可以修饰类.方法和引用. 修饰类,该类不能被继承.并且这个类的对象在堆中分配内存后地址不可变. 修饰方法,方法不能被子类重写. 修饰引用,引用无法改变,对于基本类型,无法修改值,对于引用,虽然不能修改地址值,但是可以对指向对象的内部进行修改. 比如char[0] = 'a'.不改变对象内存地址,只改变了值. 具体看一下下面的栗子: final class Fi { int a; final int b = 0; Integer

java中子类覆盖父类方法所必须满足的条件

一.描述 子类重写(覆盖)父类的方法必须满足的条件: 1.父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用super关键字来访问父类中的被重写的方法), 如果父类中的方法为private类型的,那么子类则无法继承,也无法覆盖. 2.子类和父类的方法必须是实例方法,如果父类是static方法而子类是实例方法,或者相反都会报错. 如果父类和子类都是static方法,那么子类隐藏父类的方法,而不是重写父类方法. 3.子类和父类的方法必须要具有相同的函数名称.参数列表,并且子类的

面试题:java中String为什么要设置成final

1.不可改变---执行效率高 2.因为String这个对象基本是被所有的类对象都会使用的到了,如果可以被复写,就会很乱套,比如map的key ,如果是一个string为key的话,String如果可以改变的话,你想想后果 3.执行效率可以这么解释,面向对象有一个多态的性质,如果可以改变,就可以被复写,子类如果复写了某个方法,虚函数表就被用上了:如果是final型的,jvm就直接去用了,根本不用去虚函数表里面找 ----------只要声明成final ,JVM才不用对相关方法在虚函数表中查询,而