问题一、java的by value而非by reference传递方式
java中的数据类型分为两大类:基础类型和引用类型,基础类型的值传递很容易理解,它被作为参数传递并修改后,并不会影响它原来的值,而引用类型,它传的是它引用的地址,即使被传到方法内被修改后,直接会影响这个对象本身的值。举例如下
public static void modifyPoint(Point p,int x){
pt.setLocation(5,5);
x=15;
System.out.println("during modifypoint"+ "pt = " + pt +" and j = " +j);
}
public static void main(String [] args){
Point p = new Point(1,2);
int i = 10;
System.out.println("before modifypoint"+ "p = " + p +" and i = " +i);
modifyPoint(p,i)'
System.out.println("after modifypoint"+ "p = " + p +" and i = " +i);
}
上述程序中输出modifyPoint方法调用前后的值,p是对象的引用(值传递,传的是引用的地址值),方法会修改其坐标值,最后的结果会直接影响对象的值,i是一个基础类型的变量,把它作为参数传给方法并修改它的值,因为是值传递,所以不会改变它的值。
问题二、JAVA 泛型-类型擦除
正确的使用Java泛型需要深入的了解Java的一些概念,如协变,桥接方法,以及这篇笔记记录的类型擦除。Java泛型的处理几乎都在编译器中进行,编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。
通常情况下,一个编译器处理泛型有两种方式:
1.Code specialization。在实例化一个泛型类或泛型方法时都产生一份新的目标代码(字节码or二进制代码)。例如,针对一个泛型list,可能需要针对string,integer,float产生三份目标代码。
2.Code sharing。对每个泛型类只生成唯一的一份目标代码;该泛型类的所有实例都映射到这份目标代码上,在需要的时候执行类型检查和类型转换。
C++中的模板(template)是典型的Code specialization实现。C++编译器会为每一个泛型类实例生成一份执行代码。执行代码中integer list和string list是两种不同的类型。这样会导致代码膨胀(code bloat),不过有经验的C++程序员可以有技巧的避免代码膨胀。
Code specialization另外一个弊端是在引用类型系统中,浪费空间,因为引用类型集合中元素本质上都是一个指针。没必要为每个类型都产生一份执行代码。而这也是Java编译器中采用Code sharing方式处理泛型的主要原因。
Java编译器通过Code sharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。
类型擦除的主要过程如下:
1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2.移除所有的类型参数。
下面代码经过擦除(参数签名一样)是无法通过编译的:
- public class Erasure{
- public void test(List<Long> ls){
- System.out.println("Long");
- }
- public void test(List<Integer> li){
- System.out.println("Integer");
- }
- }
问题三、几段比较有意思的代码
try
{
if (you.believe(it) == true || you.believe(it) == false)
{
I.believe(it);
}
}
catch (Exception ex)
{
throw new Exception("It's a miracle!");
}
finally
{
it.justHappened();
}
you.believe(it) 此方法可能会有副作用,开始为true,后为false,所以 I.believe(it);可以执行。
if (you.believe(it) || !you.believe(it))
{
I.believe(it);
}
优化了一下,关注怎么做而不是做了什么
if (true || you.believe(it))
让编译器优化
if (you.believe(it) || true)
装个样子,其实结果已经确定
if (you.Love(me) || !you.Love(me))
{
love++;
love--;
}
同样由于副作用,语句不会被优化。
相关推荐
在这个“Java2上机实践1初识java”的过程中,你不仅会学到Java的基础知识,还会提升问题解决和逻辑思维能力。通过这些实例,你将逐渐理解面向对象编程的概念,学会如何创建类、对象,以及如何利用方法封装代码。此外...
"JAVA项目实践合集"是一个综合性的资源集合,包含了多个Java项目的源代码和实践案例,旨在帮助学习者提升Java编程...记得在实践中不断探索和总结,这样才能真正提升自己的编程水平,达到“好好学习,天天向上”的目标。
Java 诊断利器 Arthas 排查问题实践 Arthas 是 Alibaba 开源的 Java 诊断工具,于 2018 年 9 月开源,目前在 Github 上获得了 11,000 多个星标。 Arthas 的主要功能特性包括查看类加载情况、反编译类、热更新类、...
在Java实践中,初学者会接触到如类和对象、继承、封装、多态等核心概念。银行和公司类的构建,会让学习者深入理解如何利用接口和抽象类来设计系统结构,如何使用异常处理来增强程序的健壮性,以及如何使用集合框架...
在Java程序设计实践中,理解Java基础知识是非常重要的。下面是Java基础知识的几个重要方面: 1. 类和对象:在Java中,类是对象的模板,对象是类的实例。类定义了对象的属性和行为,对象则是类的实例化。 2. 变量:...
由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题。于是我给出此...
Java上机实践指导教程是为帮助Java初学者和进阶者深入理解并熟练掌握Java编程技术而设计的一系列实践课程。...通过这个Java上机实践指导教程,你将不仅学习到Java语言本身,还能获得实际开发中的宝贵经验。
在此次Java社会实践过程中,我于重庆达内科技有限公司进行了实习,主要学习了Java的基础、高级以及Java Web编程技术。这段实习经历为我提供了宝贵的实践经验,不仅提升了我的专业技能,同时也锻炼了我的团队协作和...
通过阅读《JAVA并发编程实践》并实践其中的源码,开发者可以系统地学习到Java并发编程的各种技巧,提升解决实际问题的能力。无论是初级开发者还是有经验的工程师,都能从中受益匪浅,为构建高效、稳定、可扩展的并发...
1. **线程与进程**:在计算机系统中,线程是程序执行的基本单元,而进程则包含了一个或多个线程。Java中的线程创建可以通过实现Runnable接口或者继承Thread类来实现。 2. **同步机制**:Java提供了多种同步机制,...
Java 设计模式最佳实践是...在实践中,可以根据具体需求灵活组合和应用这些模式,以实现高效、可扩展的代码设计。通过学习和实践《Java 设计模式最佳实践》中的示例,开发者可以加深对设计模式的理解,提高开发效率。
希望读者通过《大型网站系统与Java中间件实践》可以了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型网站的 Java 中间件的实践经验。对于有一定网站开发、设计经验,并想了解大型网站架构和...
在Java中,分布式系统主要依赖于一些核心的技术和框架,如RMI(Remote Method Invocation)、JMS(Java Message Service)、EJB(Enterprise JavaBeans)、JNDI(Java Naming and Directory Interface)以及近年来...
在项目实践中,读者将有机会运用这些知识来解决实际问题,可能的项目实践内容包括: 1. **简单计算器**:构建一个能进行基本算术运算的GUI应用程序。 2. **学生管理系统**:设计一个包含学生信息录入、查询、修改...
Java并发编程实践(中文) 高清pdf 带书签。 详细讲解了java并发知识,推荐
【Java实践题目解析】 在10年6月的北大自考中,有三道与Java相关的实践题目,分别涉及基础的算法实现、GUI事件处理以及面向对象编程。这些题目旨在检验考生对Java语言的理解和应用能力,同时也包含了计算机应用的...
5. **异常处理**:Java的异常处理机制是编程实践中不可或缺的部分,学生可能需要学会使用try-catch-finally语句块来捕获和处理运行时错误。 6. **输入/输出流**:Java的IO流用于读写文件,实验可能要求学生实现文件...
《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序...在《JAVA并发编程实践》中,这些便利工具的创造者不仅解释了它们究竟如何工作、如何使用,还阐释了创造它们的原因,及其背后的设计模式。