`

java 实践中的一些问题(1)

阅读更多

问题一、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.移除所有的类型参数。

 下面代码经过擦除(参数签名一样)是无法通过编译的:

  1. public class Erasure{  
  2.   
  3.         public void test(List<Long> ls){  
  4.             System.out.println("Long");  
  5.         }  
  6.         public void test(List<Integer> li){  
  7.             System.out.println("Integer");  
  8.         }  
  9. }

问题三、几段比较有意思的代码

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

    在这个“Java2上机实践1初识java”的过程中,你不仅会学到Java的基础知识,还会提升问题解决和逻辑思维能力。通过这些实例,你将逐渐理解面向对象编程的概念,学会如何创建类、对象,以及如何利用方法封装代码。此外...

    JAVA项目实践合集

    "JAVA项目实践合集"是一个综合性的资源集合,包含了多个Java项目的源代码和实践案例,旨在帮助学习者提升Java编程...记得在实践中不断探索和总结,这样才能真正提升自己的编程水平,达到“好好学习,天天向上”的目标。

    Java诊断利器Arthas排查问题实践.pptx

    Java 诊断利器 Arthas 排查问题实践 Arthas 是 Alibaba 开源的 Java 诊断工具,于 2018 年 9 月开源,目前在 Github 上获得了 11,000 多个星标。 Arthas 的主要功能特性包括查看类加载情况、反编译类、热更新类、...

    东南大学java实践

    在Java实践中,初学者会接触到如类和对象、继承、封装、多态等核心概念。银行和公司类的构建,会让学习者深入理解如何利用接口和抽象类来设计系统结构,如何使用异常处理来增强程序的健壮性,以及如何使用集合框架...

    Java程序设计实践.doc

    在Java程序设计实践中,理解Java基础知识是非常重要的。下面是Java基础知识的几个重要方面: 1. 类和对象:在Java中,类是对象的模板,对象是类的实例。类定义了对象的属性和行为,对象则是类的实例化。 2. 变量:...

    Java中文问题及最优解决方法

    由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题。于是我给出此...

    java上机实践指导教程

    Java上机实践指导教程是为帮助Java初学者和进阶者深入理解并熟练掌握Java编程技术而设计的一系列实践课程。...通过这个Java上机实践指导教程,你将不仅学习到Java语言本身,还能获得实际开发中的宝贵经验。

    java社会实践报告

    在此次Java社会实践过程中,我于重庆达内科技有限公司进行了实习,主要学习了Java的基础、高级以及Java Web编程技术。这段实习经历为我提供了宝贵的实践经验,不仅提升了我的专业技能,同时也锻炼了我的团队协作和...

    JAVA并发编程实践(中文)含源码

    通过阅读《JAVA并发编程实践》并实践其中的源码,开发者可以系统地学习到Java并发编程的各种技巧,提升解决实际问题的能力。无论是初级开发者还是有经验的工程师,都能从中受益匪浅,为构建高效、稳定、可扩展的并发...

    JAVA并发编程实践

    1. **线程与进程**:在计算机系统中,线程是程序执行的基本单元,而进程则包含了一个或多个线程。Java中的线程创建可以通过实现Runnable接口或者继承Thread类来实现。 2. **同步机制**:Java提供了多种同步机制,...

    Java 设计模式最佳实践

    Java 设计模式最佳实践是...在实践中,可以根据具体需求灵活组合和应用这些模式,以实现高效、可扩展的代码设计。通过学习和实践《Java 设计模式最佳实践》中的示例,开发者可以加深对设计模式的理解,提高开发效率。

    大型网站系统与Java中间件实践(书签版)

    希望读者通过《大型网站系统与Java中间件实践》可以了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型网站的 Java 中间件的实践经验。对于有一定网站开发、设计经验,并想了解大型网站架构和...

    分布式Java应用基础与实践pdf

    在Java中,分布式系统主要依赖于一些核心的技术和框架,如RMI(Remote Method Invocation)、JMS(Java Message Service)、EJB(Enterprise JavaBeans)、JNDI(Java Naming and Directory Interface)以及近年来...

    Java 程序设计与项目实践

    在项目实践中,读者将有机会运用这些知识来解决实际问题,可能的项目实践内容包括: 1. **简单计算器**:构建一个能进行基本算术运算的GUI应用程序。 2. **学生管理系统**:设计一个包含学生信息录入、查询、修改...

    Java并发编程实践(中文)

    Java并发编程实践(中文) 高清pdf 带书签。 详细讲解了java并发知识,推荐

    10年6月北大自考上机java实践题目

    【Java实践题目解析】 在10年6月的北大自考中,有三道与Java相关的实践题目,分别涉及基础的算法实现、GUI事件处理以及面向对象编程。这些题目旨在检验考生对Java语言的理解和应用能力,同时也包含了计算机应用的...

    java2上机实践5代码及练习答案

    5. **异常处理**:Java的异常处理机制是编程实践中不可或缺的部分,学生可能需要学会使用try-catch-finally语句块来捕获和处理运行时错误。 6. **输入/输出流**:Java的IO流用于读写文件,实验可能要求学生实现文件...

    Java上机实践指导教程

    在Java编程的学习过程中,上机实践是至关重要的环节,它能帮助我们巩固理论知识,提升实际操作能力。《Java上机实践指导教程》正是这样一本旨在帮助初学者和进阶者提升Java编程技能的实用指南。这本书涵盖了大量实战...

Global site tag (gtag.js) - Google Analytics