Java类成员(成员变量和方法)的覆盖与隐藏归纳
以前就知道重写override和重载overload的区别,平时也是逮着用就是了,Eclipse报错再说。
最近看一本书里面出现了重写、替换、覆盖、置换、隐藏、重载,简直乱得不行,归纳整理一下。
从全局来看,java只有重写、隐藏、重载3种,具体归纳如下:
基本概念:
方法签名:方法名+参数列表(参数类型、个数、顺序)。
=================================【重写】=================================
某些书又叫覆盖、替换、置换。本文统一叫重写。
只有实例方法可以被重写!重写后的方法必须仍为实例方法!(实例方法------重写------>实例方法)
成员变量和静态方法都不能被重写,只能被隐藏。
重写实例方法:超类Parent中有实例方法A,子类child定义了与A“相同签名和子集返回类型”的实例方法B,子类对象ChildObj只能调用自己的实例方法B。
即使将子类对象ChildObj转换为超类对象ParentObj,ParentObj依然只能调用重写后的实例方法B!
(超类对象ParentObj中的实例方法A已经被实例方法B覆盖了)
重写的语法规则如下:
(1)方法签名必须相同(参数类型、个数、顺序);
(2)对返回类型有要求,分2种情况:
a.被重写方法的返回类型是基本类型:重写方法的返回类型必须“相同”。
基本类型包括了(byte,short,int,long,float,double,char,boolean,其实还包括一个void类型),但要注意返回类型是封装类时属于下面的情况b。
b.被重写方法的返回类型是引用类型:重写方法的返回类型应“相同”或是其“子类型”;
引用类型包括了数组、string等一切非基本类型的类型(即类类型)。
(3)重写方法的访问权限不能小于被重写方法的访问权限,可以更广泛。如被重写方法是包访问权限,重写方法是public访问权限。
重写方法可以改变其它的方法修饰符,如final、synchronized、native、strictfp。
不管被重写方法中有无final修饰的参数,重写方法都可以增加、保留、去掉这个参数的final修饰符(参数修饰符不属于方法签名)。
(4)重写方法抛出的异常范围不能大于被重写方法抛出的异常的范围(也可以不抛出异常)。
(5)不能重写final方法。(final修饰符存在的意义就是防止任何子类重写该方法)
(6)不能重写static静态方法。(形式上可以写,但本质上不是重写,属于下面要讲的隐藏)
(7)如果一个方法不能被继承,则不能重写它。或者说:只有当方法可以被访问时才可以被重写。
典型的就是超类的private方法。
对于(3)需要注意:
1.重写override对返回类型有要求,而重载overload对返回类型没有要求。
重载可以改变返回类型。因为编译器通过对方法签名的识别即可静态编译出不同的方法。这也是java中重载与重写的区别之一。
2.严格来说,重写属于多态,因为是动态绑定(或称为动态联编),而重载是静态绑定,编译时即可确定。
=================================【隐藏】=================================
隐藏与覆盖在形式上极其类似(语法规则),但有着本质的区别。
只有成员变量(不管是不是静态)和静态方法可以被隐藏。
----------------------------成员变量------------------------
隐藏成员变量:超类Parent中有成员变量A,子类Child定义了与A同名的成员变量B,子类对象ChildObj调用的是自己的成员变量B。
如果把子类对象ChildObj转换为超类对象ParentObj,ParentObj调用的是超类的成员变量A!
注:1.隐藏成员变量时,只要同名即可,可以更改变量类型(无论基本类型还是隐藏类型)
2.不能隐藏超类中的private成员变量,换句话说,只能隐藏可以访问的成员变量。
3.隐藏超类成员变量A时,可以降低或提高子类成员变量B的访问权限,只要A不是private
4.隐藏成员变量与是否静态无关!静态变量可以隐藏实例变量,实例变量也可以隐藏静态变量。
5.可以隐藏超类中的final成员变量。
----------------------------静态方法------------------------
隐藏后的方法必须仍为静态方法!(静态方法------隐藏------>静态方法)
隐藏静态方法:超类Parent有静态方法A,子类Child定义了与A“相同签名和子集返回类型”的静态方法B,子类对象ChildObj调用的是自己的静态方法B。
如果把子类对象ChildObj转换为超类对象ParentObj,ParentObj调用的是超类的静态方法A!
隐藏超类静态方法的语法规则与重写实例方法的规则几乎完全相同,只需要修改第(6)条为:(6)不能隐藏实例方法。。
示例代码:
- class Animal {
- char hairColor='B';
- int legNumber=2;
- static boolean isHuman=true;
- public static void testClassMethod() {
- System.out.println("The class" + " method in Animal.");
- }
- public void testInstanceMethod() {
- System.out.println("The instance " + " method in Animal.");
- }
- }
- public class Cat extends Animal {
- static int hairColor=1;
- char legNumber='A';
- double isHuman=3.1415926E5;
- public static void testClassMethod() {
- System.out.println("The class method" + " in Cat.");
- }
- public void testInstanceMethod() {
- System.out.println("The instance method" + " in Cat.");
- }
- public static void main(String[] args) {
- System.out.println("========child class=========");
- Cat myCat = new Cat();
- System.out.println("myCat.hairColor="+myCat.hairColor);
- System.out.println("myCat.legNumber="+myCat.legNumber);
- System.out.println("myCat.isHuman="+myCat.isHuman);
- myCat.testClassMethod();
- myCat.testInstanceMethod();
- System.out.println("========child class ---> parent class=========");
- Animal myAnimal = myCat;
- System.out.println("========parent class=========");
- System.out.println("myAnimal.hairColor="+myAnimal.hairColor);
- System.out.println("myAnimal.legNumber="+myAnimal.legNumber);
- System.out.println("myAnimal.isHuman="+myAnimal.isHuman);
- myAnimal.testClassMethod();
- myAnimal.testInstanceMethod();
- }
- }
输出结果:
- ========child class=========
- myCat.hairColor=1
- myCat.legNumber=A
- myCat.isHuman=314159.26
- The class method in Cat.
- The instance method in Cat.
- ========child class ---> parent class=========
- ========parent class=========
- myAnimal.hairColor=B
- myAnimal.legNumber=2
- myAnimal.isHuman=true
- The class method in Animal.
- The instance method in Cat.
Java类成员(成员变量和方法)的覆盖与隐藏归纳的更多相关文章
- java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问.但是,父类的同名变量可以通过super访问.一般来说,不推荐隐 ...
- java类的成员初始化顺序和初始化块知识
java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...
- Java类及成员
Java类及成员 类 类是对一类事物的的描述,是抽象的概念上的定义:类是创建对象的模板: public class TestClass { public static void main(String ...
- Java类的成员初始化顺序
Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...
- java类定义、变量类型、构造函数
1.java类class的定义 所有java程序都以类class为组织单元,java类由属性和方法组成,下面看例子: public class Phone{ //属性 String company ...
- python: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
- hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...
- java类中成员的初始化顺序(一)
类被创建之后的成员的初始化顺序到底是怎么样的? 首先 不考虑继承 package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 ...
随机推荐
- Flume interceptor 使用注意事项
1. 在使用 Regex Filtering Interceptor的时候一个属性是excludeEvents 当它的值为true 的时候,过滤掉匹配到当前正则表达式的一行 当它的值为false的时候 ...
- Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)
题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...
- Money类型转化为String去除小数点后0解决方法
Money类型转化为String去除小数点后0从数据库提取Money类型后,字符串如:1212.0000 如何使其成为1212 注:去掉了小数点 如果是:1212.0100 使 ...
- BZOJ3654 : 图样图森破
考虑枚举回文中心,然后向两边扩展,当匹配到当前串的边界的时候,枚举下一个串接上. 这个过程可以通过记忆化搜索来完成,设: $f[i][0]$表示对于$i$这个位置,$[i,串结尾]$等待匹配的最长回文 ...
- BZOJ3588 : fx
考虑从左往右填数,维护当前数字权值与$A$权值的差值,如果差值大于9,那么以后无论怎么填,都不会改变大小关系. 所以设$f[i][j][k]$表示填了前$i$位,差值为$j$,是否卡住$B$上限为$k ...
- mybatis 查询缓存问题
<settings> <setting name="localCacheScope" value="STATEMENT" /> < ...
- 来自于2016.2.23的flag
正是中午,百废待兴,写点什么调节一会儿心情吧.正巧有许多的想法. 机房来了许多小朋友,多么像一年之前的我啊,想写题,心又纷乱,但不同的是他们比我强太多了. 停课是什么感觉?停课在机房与寒暑假.双休日在 ...
- ACM 谁获得了最高奖学金
谁获得了最高奖学金 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: ...
- 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明
13:40 2015/11/20 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明 关键点:现在qq邮箱开通smtp服务后会给你一个很长的独立新密码,发邮件配置中的密码需要 ...
- 【HDU】2138 How many prime numbers
http://acm.hdu.edu.cn/showproblem.php?pid=2138 题意:给n个数判断有几个素数.(每个数<=2^32) #include <cstdio> ...