java native 方法和修饰符
最近开始学习java基础工具等源码,还是得更耐心些,去体会精髓的地方。。
看到了ArrayList.java中的fastRemove方法:
由于数组删除了中间一个元素,就必须把之后的元素向前移动一位。发现这边用的是System.arraycopy:
之后就找不到它的实现源码了。查了native修饰符 才知道:
"A native method is a Java method whose implementation is provided by non-java code."
简单来说一个Native Method就是一个java调用非java代码的接口。
这个也比较好理解,因为java底层本来就是用c、c++去写的,所以当然有对应接口去直接调用C/C++写的方法;而且众所周知java对底层的操作远不如C/C++灵活,所以可以通过直接调用非java代码来实现对底层的操作。在java api中有很多这种方法,例如:
系统提供的数组拷贝方法public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);等
暂时看不到源码,就看到网上有人说这个方法的复制,居然是浅复制的!!
所以只能通过做一个测试来验证:
public class testMain {public static void main(String[] args) {Te[] t1 = new Te[1];t1[0] = new Te("a");Te[] t2 = new Te[1];System.out.println(t1[0]);//调用System.arraycopy(t1, 0, t2, 0, 1);System.out.println(t2[0]);}static class Te {String name;Te(String name) {this.name = name;}}
}
从输出中可以看出 指针指向了同一个地址:
然后再进行修改,发现因为指向了同一个地址,t2的值确实跟着一起改变了:
Te[] t1 = new Te[1];t1[0] = new Te("a");Te[] t2 = new Te[1];System.out.println(t1[0]);//调用System.arraycopy(t1, 0, t2, 0, 1);System.out.println(t2[0]);System.out.println("t1修改前:"+t1[0].name);System.out.println("t2修改前:"+t2[0].name);t1[0].name = "1";System.out.println("t1修改后:"+t1[0].name);System.out.println("t2:"+t2[0].name);
对t1[0]进行修改,但是由于t1[0]和t2[0]引用了同一个对象,因此后者也会随之改变,在平时的使用中如果不注意的话会引起相当大的问题。
而且由于System.arraycoppy()是JDK中的native方法,JDK中有关于集合,数组操作的基本上都调用此方法,因此在使用这些的时候要注意。
java native 方法和修饰符相关推荐
- java域的控制修饰符可分为_Java中的类和方法的修饰符
java 中的类和方法的修饰符Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性.类的修饰符分为访问控制符和非访问控制符两大类 ...
- java修饰方法有哪些,探讨Java语言中那些修饰符
一.在java中提供的一些修饰符,这些修饰符可以修饰类.变量和方法,在java中常见的修饰符有:abstract(抽象的).static(静态的).public(公共的).protected(受保护的 ...
- java中的类修饰符、成员变量修饰符、方法修饰符。
类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fin ...
- java方法和变量修饰符有哪些_死磕Java基础---类,变量和方法的修饰符
欢迎关注微信公众号:一个自学的程序员 类修饰符 对于类的修饰符,毫无疑问是用来修饰类的,那么,修饰类的修饰符都有哪些? 有如下这些: 1. abstract 2. final 3. private 4 ...
- Java中的反射和Java中的访问修饰符
什么是反射? ①在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性 ②对于任何一个对象,我们都能够对它的方法和属性进行调用 总而言之:它反射Java语言中的一种机制,通过这种机制可以动 ...
- Java本地方法/Java native方法/JNI
一.什么是JNI? JNI是 Java Native Interface的缩写,又叫Java本地方法/Java native方法.用于Java代码和其他语言写的代码进行交互.使用java与本地已编译的 ...
- Java常见的各种修饰符
Java常见的各种修饰符 目录 Java常见的各种修饰符 修饰符的分类 一.访问权限修饰符 二.非访问权限修饰符 修饰符的使用 一.类修饰符 1.外部类修饰符 2.内部类修饰符 二.方法修饰符 三.变 ...
- java中的访问修饰符
对Java中的修饰符一直记不住,现在结合网上的一些资料进行总结,并重点说明一下protected修饰符. 一. Java中的访问修饰符 Java面向对象的基本思想之一是封装细节并且公开接口.Java语 ...
- Java final修饰符的作用,Java中的final修饰符
1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...
- [转载] 基本概念:java中的访问修饰符
参考链接: Java中类或接口的访问说明符 转自:https://www.cnblogs.com/tjudzj/p/4443066.html 对Java中的修饰符一直记不住,现在结合网上的一些资料进行 ...
最新文章
- 当 AI 闯入法律界,第一步是当律师的得力助手
- 蚂蚁森林最高效的合种团队—招募队友云植树,最快1天1颗树
- Intellij IDEA自动部署项目至远程FTP服务器
- Failed building wheel for netifaces
- 1.2.2 OSI参考模型(1)
- Mysql存在则更新,不存在则插入
- mysql 镜像备份_手动构建percona-xtrabackup Docker镜像,并实现mysql数据备份
- 【七】zuul路由网关
- iOS中实现plist中读取数据实现Cell的显示(字典转模型,实现按序分组)修改图片的尺寸...
- 罗永浩重新定义直播带货
- Falcon(一)——数据集管理和数据处理平台
- 英国essay与澳洲essay写作区别以及注意事项
- how-to-solve-the-specific-problem,learn-this,imitate-this
- 愤怒的小鸟 高清完整版下载
- Win10中无法加载 .iso文件的问题一例
- 导致我们形不成「自律」的「罪魁祸首」
- MySQL数据库30条规范解读
- 中文命名实体识别(ner)迁移学习
- CAS实现的单点登录系统
- Python Leetcode(905.按奇偶排序数组)