JAVA之private修饰成员方法默认是final型的?

Java之private修饰成员方法默认是final型的?

private修饰的成员方法默认final型的?

  • 用fianl声明的成员方法是最终方法,最终方法不能被子类覆盖(重写)

从表面上看这个命题是错误的,private访问修饰符修饰的成员方法怎么会跟final型方法有关系呢?但从最终方法的定义可以看出,不能被子类覆盖的成员方法就是最终方法,而private修饰的成员方法就不能被子类覆盖,证明如下:

//证明private修饰的成员方法不能被子类覆盖
class Father{int m = 0;private void set() {m += 1;}public Father() {set();}
}
public class Son extends Father{private void set() {m += 3;}public static void main(String[] args) {Father f = new Son();System.out.println(f.m);}
}

输出:3

分析:
如果private修饰的set()方法被子类重写了,当执行到 Father f = new Son(); 语句,先执行Father类的构造方法,而构造方法的set()方法会调用子类的set()方法(多态的一种表现),输出结果为:1
而实际输出的结果为:3,因此private修饰的成员方法没有被子类覆盖,也就是说private修饰的成员方法默认是final型的。

  • 在class文件中,有专门描述方法的方法表,方法表第一项就是访问标志access_flags。其中标志值为0x0001的 ACC_PRIVATE代表方法为private;标志值为0x0002的 ACC_PUBLIC代表方法为方法为final,可以通过判断access_flags的值判断方法有哪些访问标志。
public class Test {private void test(){}private final void test2(){}
}

通过jclasslib bytecode viewer看出,如下图:

在这里插入图片描述

在这里插入图片描述

分析:
两个方法一个是只有private修饰,另一个是有private和final 修饰,如果private修饰的成员方法默认是final型的,那两个方法的access_flags值应该一样的,可结果并非如此,由此可以说明private修饰的成员方法默认是final型的是错误的。




如何理解 :类中所有的private方法都隐式的指定为是final的 为什么这么说?有理论依据么

在这里插入图片描述

正解,这段话来自《Java编程思想》多态那一章节,的确不太明白作者为什么要这样子去说。

这种说法完全没有根据,属于误人子弟 private和final没关系,是两回事 拿属性来说可能更容易理解一些,虽然private不能访问,但通过反射修改访问权限还是可以访问修改的,但加了final,即使可以访问了也修改不了值,这就是区别 自己用反射打印一下结果就知道了,或者用javap反编译看一下伪代码


public class Sample {static class ATest {private void test1() {}private final void test2() {}}public static void main(String[] args) {try {Class<?> c = Sample.ATest.class;Method f1 = c.getDeclaredMethod("test1", null);System.out.printf("%s:%d\n", f1.getName(), f1.getModifiers()); //private修饰Method f2 = c.getDeclaredMethod("test2", null);System.out.printf("%s:%d\n", f2.getName(), f2.getModifiers()); //private final修饰System.out.printf("private:%d\n", Modifier.PRIVATE); //private的修饰值System.out.printf("final:%d\n", Modifier.FINAL); //final的修饰值System.out.printf("private & final:%d\n", Modifier.PRIVATE|Modifier.FINAL); //private和final一起的修饰值} catch (Throwable e) {e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python高阶函数教学_Python 简明教程 --- 16,Python 高阶函数

对于那些快速算法&#xff0c;我们总是可以拿一些速度差不多但是更容易理解的算法来替代它们。—— Douglas Jones目录高阶函数一般以函数为参数。本节我们介绍Python 中三个方便的高阶函数&#xff0c;分别是&#xff1a;mapreducefilter如果你了解过分布式系统框架---Hadoop&…

react 组件传值

一、父传子 - 函数式组件 function Father (props) {const {money} props; // 解构render() {<div><Child getSonMoney{money}/></div>} }function Child (props) {return (<div><p>我爸爸现在有存款&#xff1a;${props.getSonMoney}</p&g…

深入理解static关键字

文章目录1、static存在的主要意义2、static的独特之处3、static应用场景4、静态变量和实例变量的概念5、静态变量和实例变量区别【重点常用】6、访问静态变量和实例变量的两种方式7、static静态方法8、static静态代码块9、static变量与普通变量区别10、静态内部类11、静态导包1…

kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失

不可靠的KAFKA这里的不可靠是指代KAFKA其设计之初就为高性能而设计&#xff0c;其是允许消息丢失的&#xff0c;但经过多个版本的升级之后&#xff0c;通过KAFKA的相关配置&#xff0c;我们可以将其作为可靠的队列(不丢消息的队列)。在本文里&#xff0c;不会具体列出要改哪个参…

聊聊 vue 生命周期

一、常用的常用的生命周期钩子&#xff1a; mounted: 发送 ajax 请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】 mounted() {console.log(vm 实例被挂载之后&#xff1a;mounted);this.timer setInterval(() > {...} }beforeDestroy: 清除定时器、解绑自定…

程序员你真的理解final关键字吗?

文章目录1、修饰类2、修饰方法3、修饰变量4、final变量修饰变量&#xff08;成员变量、局部变量&#xff09;4、1 final修饰成员变量&#xff1a;4、2 final修饰局部变量&#xff1a;5、final变量和普通变量的区别6、final与static的藕断丝连7、关于final修饰参数的争议前言 提…

axios vue 动态date_Web前端Vue系列之-Vue.js 实战

课程简介&#xff1a;课程目标&#xff1a;通过本课程的学习&#xff0c;让大家掌握Vue.js的进阶知识并在项目中应用。适用人群&#xff1a;具有一定vue开发基础的开发人员。课程概述&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式Jav…

Static静态代码块以及各代码块之间的执行顺序

文章目录代码块的分类1、静态代码块&#xff08;也叫静态块、静态初始化块&#xff09;2、构造代码块&#xff08;也叫构造初始化块&#xff09;3、代码块&#xff08;又叫普通代码块、初始化块&#xff09;执行顺序的代码测试继承中各代码块的执行顺序前言 在Java中&#xff0…

vue 组件 - 非单文件组件

一、定义组件 const school Vue.extend({name: xuexiao, // ----------------------------> 指定组件在开发者工具中显示的名字template: // ----------------------------> 模板<div>... 此处是结构</div>,data() { // ---------------------------->…

matlab安装好 启动总是闪退_在Ubuntu16.04下安装MATLAB2017b

1. 前言最近在折腾Ubuntu系统的高端机子&#xff0c;matlab这家伙的交互和可视化太方便了&#xff01;于是想在Linux下安装matlab&#xff0c;在各个版本中&#xff0c;matlab2017的性价比是非常高的&#xff0c;因此选择安装介个。阅读了很多帖子&#xff0c;综合找到几个靠谱…

vue 脚手架

一、 脚手架 初始 全局安装脚手架 npm i -g vue/cli切换到项目根目录&#xff0c;使用 vue create 项目名称 创建项目使用 npm run serve | yarn serve 启动项目 如果中途卡顿 使用 npm 淘宝镜像 npm config set registry --> https://registry.npm.taobao.orgvue 隐藏了…

这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

前言 package com.jvm.classloader;class Father2{public static String strFather"HelloJVM_Father";static{System.out.println("Father静态代码块");} }class Son2 extends Father2{public static String strSon"HelloJVM_Son";static{Syste…

bigdecimal js 判断等于0_为啥阿里禁用BigDecimal的equals方法做等值比较

BigDecimal&#xff0c;相信对于很多人来说都不陌生&#xff0c;很多人都知道它的用法&#xff0c;这是一种java.math包中提供的一种可以用来进行精确运算的类型。很多人都知道&#xff0c;在进行金额表示、金额计算等场景&#xff0c;不能使用double、float等类型&#xff0c;…

脚手架 - ref

被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09;应用在 html 标签上获取的是真实 DOM 元素&#xff0c;应用在组件标签上的是组件实例对象 VueComponent{}使用方式 (1). 打标识 <!-- 给真实 DOM 元素打标识 --> <h1 ref"xxx">...&…

git提交到github总是要输入密码_GitHub不为人知的秘密

本来想叫《GitHub骚操作》的&#xff0c;发现相关的文章已经有很多&#xff0c;而且和我本章要讲的内容完全不同&#xff0c;所以就换了这个也算贴切的标题。起因之前写过一篇文章《VM Manager 插件分享》&#xff0c;事后我发现有个地方不对劲&#xff01;看之前文章标题大家应…

MyBatis中大于号以及小于号的表达方式

mybatis使用的是xml格式的文件。使用>和<号的时候&#xff0c;会存在与xml的标签的规范冲突。 1.场景还原 在实际项目中&#xff0c;有很多需求需要通过设定一个具体的时间段来搜索或过滤所需的数据&#xff0c;今天笔者就mybatis中时间比较涉及到的大于&#xff0c;小于…

脚手架 - props

一、props — 让组件接收外部传过来的数据 传递数据 <Example name"xxx"/>接收数据 // 1. 只接收 props: [name]// 2. 接收并限制类型 props: {name: String }// 3. 接收、限制类型、必要性、默认值 props: {name: {type: String, // 类型required: true, /…

mybatis plus当月数据查询_Springboot+mybatis(plus)+druid多数据源

前言:我不太喜欢AOP读自定义注解来切换数据源.因为如果我一个业务里需要同时查2个数据源的数据而又不想把这个业务拆成2个方法的时候,就比较麻烦了.所以我打算根据package来扫描注入不同的DataSource.可能是我搜索的姿势不太对 , 资料比较少.也会碰到不少坑.所以记录一下.正文:…

mybatis里mapper.xml中SQL语句if语句嵌套if语句

为了实现一个sql可以根据条件不同实现sql语句的动态查询&#xff0c;所以在使用mybatis时&#xff0c;对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句&#xff0c; 最开始在我的where子句中我的if语句是这么写的&#xff1a; <where><if test"…

脚手架 mixin (混入)

可以把多个组件共用的配置提取成一个混入对象 使用方式&#xff1a; 定义混合 {data() {},methods() {}... }使用混合 // 1. 引入混合 import {hunhe1, hunhe2} from /..mixin/// 1. 在 main.js 中全局混入&#xff1a; Vue.mixin(hunhe1)// 2. 局部混入 mixins: [hunhe1]