Java里面的十万个为什么

lucien-ma
• 阅读 941

Java里面的十万个为什么

1.不是说 JVM 是运行 Java 程序的虚拟机吗?那 JRE 和 JVM 的关系是怎么样的呢?

简单地说,JRE 包含 JVM 。JVM 是运行 Java 程序的核心虚拟机,而运行 Java 程序不仅需要核心虚拟机,还需要其他的类加载器,字节码校验器以及大量的基础类库。JRE 除包含 JVM 之外,还包含运行 Java 程序的其他环境支持。

一般而言,如果只运行 Java 程序, 可以只安装 JRE ,无需安装 JDK。

2.配置环境变量的时候,为什么选择用户变量?用户变量与系统变量有什么区别?

用户变量和系统变量并没有太大的差别,只是用户变量只对当前用户有效,而系统变量对所有用户有效。为了减少自己所做的修改对其他人的影响,故设置用户变量避免影响其他人。对于当前用户而言,设置用户变量和系统变量的效果大致相同,只是系统变量的路径排在用户变量的路径之前。这可能出现一种情况:如果 Path 系统变量的路劲里包含了 java 命令,而 PATH 用户变量的路劲里也包含了 java 命令,则优先执行 Path 系统变量路径里面包含的 java 命令。

3.当编译 C 程序时,不仅需要指定存放目标文件的位置,还需要指定目标文件的文件名,这里使用 javac 编译 Java 程序时怎么不需要指定目标文件的文件名呢?

使用 javac 编译文件只需要指定存放目标文件的位置即可,无须指定字节码文件的文件名。因为 javac 编译后生成的字节码文件有默认的文件名:文件名总是以源文件所定义类的类名作为主文件名,以 .class 作为扩展名。这意味着如果一个源文件里定义了多个类,将编译生成多个字节码文件。事实上,指定目标文件存放位置的 -d 选项也是可以省略的,如果省略该选项,则意味着将生成的字节码文件放在当前路径下。

4.我想学习 Java 编程,到底学习 Eclipse 好,还是学习 IntelliJ IDEA 好呢?

你学习的是 Java 语言,而不是任何工具。如果一开始就从工具学起,可能导致你永远都学不会 Java 语言。虽然说“工欲善其事,必先利其器”,但是这个前提是你已经会做这件事情了----如果你还不会做这件事情,那么再利的器对你都没有任何作用。再者,你现在知道的可能只有 Eclipse 和 IntelliJ IDEA,实际上,Java 的 IDE 工具多如牛毛,除 Eclipse 和 IntelliJ IDEA 之外,还有 NetBeans、IBM提供的 WSAD、Oracle 提供的 JDeveloper 等,每个 IDE 都有特色,各有优势。如果从工具学起,势必造成对工具的依赖,当换用其他 IDE 工具时极为困难。如果从 Java 语言本身学起,把 Java 语言本身的相关方面掌握到熟练,那么使用任何 IDE 工具都会得心应手。

5.API 文档是什么?

开发一个大型软件时,需要定义成千上万的类,而且需要很多人参与开发。每个人都会开发一些类,并在类里定义一些方法、成员变量提供给其他人使用,但其他人怎么知道如何使用这些类和方法呢?这时候就需要提供一份说明文档,用于说明每个类、每个方法的用途。当其他人使用一个类或一个方法时,他无须关心这个类或方法的具体实现,他只需要知道这个类或方法的功能即可,然后使用这个类或方法来实现具体的目的,也就是通过调用应用程序接口(API)来编程。API 文档就是用以说明这些应用程序接口的文档。对于 Java 语言而言, API 文档通常详细说明了每个类、每个方法的功能及用法等。

6.为什么要学习查看 API 文档的方法?

前面已经提到了,API 是 Java 提供的基本编程接口,当使用 Java 语言进行编程时,不可能把所有的 Java 类、所有的方法全部记下来,当编程遇到一个不确定的地方时,必须通过 API 文档来查看某个类、某个方法的功能和用法。因此,掌握查看 API 文档的方法是学习 Java 的一个最基本的技能。读者可以尝试查阅 API 文档的 String 类来掌握 String 类的用法。

7.什么是变量?变量有什么用?

编程的本质,就是对内存中数据的访问和修改。程序所用的数据都会保存在内存中,程序员需要一种机制来访问或修改内存中的数据。这种机制就是变量,每个变量都代表了某一小块内存,而且变量是有名字的,程序对变量赋值,实际上就是把数据装入该变量所代表的的内存区的过程;程序读取变量的值,实际上就是从该变量所代表的的内存区取值的过程。形象地理解:变量相当于一个有名称的容器,该容器用于装各种不同类型的数据。

8.int[] 是一种数据类型吗?怎么使用这种类型呢?

没错,int[] 就是一种数据类型,与 int 类型、String 类型类似,一样可以使用该类型来定义变量,也可以使用该类型进行类型转换等。使用 int[] 类型来定义变量、进行类型转换时与使用其他普通类型没有任何区别。int[] 类型是一种引用类型,创建 int[] 类型的对象也就是创建数组,需要使用创建数组的语法。

9.能不能只分配内存空间,不赋初始值呢?

不行!一旦为数组的每个数组元素分配了内存空间,每个内存空间里存储的内容就是该数组元素的值,即使这个内存空间存储的内容时空,这个空也是一个值(null)。不管以哪种方式来初始化数组,只要为数组元素分配了内存空间,数组元素就具有了初始值。初始值的获得有两种形式:一种由系统自动分配;另一种由程序员指定。

10.为什么要我记住这些异常信息?

编写程序,并不是单单指在电脑里敲出这些代码,还包括调试这个程序,使之可以正常运行。没有任何人可以保证自己写的程序总是正确的,因此调试程序是写程序的重要组成部分,调试程序的工作量往往超过编写代码的工作量。如何根据错误提示信息,准确定位错误位置,以及排除错误是程序员的基本功。培养这些基本功需要记住常见的异常信息,以及对应的出错原因。

11.为什么有栈内存和堆内存之分?

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此,所有在方法中定义的局部变量都是放在栈内存中的;在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的借书而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。

12.构造器不是没有返回值吗?为什么不能用 void 声明呢?

简单地说,这是 Java 的语法规定。实际上,类的构造器是有返回值的,当使用 new 关键字来调用构造器时,构造器返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意:不要在构造器里显式使用 return 来返回当前类的对象,因为构造器的返回值是隐式的。

13.为什么方法的返回值类型不能用于区分重载的方法?

对于 int f(){} 和 void f(){} 两个方法,如果这样调用 int result = f(); ,系统可以识别是调用返回值类型为 int 的方法;但 Java 调用方法时可以忽略方法返回值,如果直接调用 f(); 不接受返回值,你能判断时调用哪个方法吗?如果你尚且不能判断,那么 Java 系统也会糊涂。在编程过程中有一条重要规则:不要让系统糊涂,系统一糊涂,肯定就是你错了。因此,Java 里不能使用方法返回值类型作为区分方法重载的依据。

14.构造器是创建 Java 对象的途径,是不是说构造器完全负责创建 Java 对象?

持续整理更新中...

点赞
收藏
评论区
推荐文章
Java面向对象试题
1、 请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。 创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现 接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿 吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Wesley13 Wesley13
11个月前
Java爬虫之JSoup使用教程
title: Java爬虫之JSoup使用教程 date: 2018-12-24 8:00:00 +0800 update: 2018-12-24 8:00:00 +0800 author: me cover: [https://img-blog.csdnimg.cn/20181224144920712](https://www.oschin
Wesley13 Wesley13
11个月前
Java是如何实现跨平台的
一.Java是如何实现跨平台的 =============== 1.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件 2.Java虚拟机JVM就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。 ![](https:/
Stella981 Stella981
11个月前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Wesley13 Wesley13
11个月前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Wesley13 Wesley13
11个月前
Java基础知识强化(用于自我巩固)以及审查
1\. Java 和 JDK 的关系 ------------------ JDK(Java Development Kit)Java 开发工具包,它包括:编译器、Java 运行环境(JRE,Java Runtime Environment)、JVM(Java 虚拟机)监控和诊断工具等 Java 则表示一种开发语言。 2. Java 程序是怎么执行的?
Wesley13 Wesley13
11个月前
Java基础知识总结
一:java概述: ========= **1,JDK:Java Development Kit,**java的开发和运行环境,java的开发工具和jre。 **2,JRE:Java Runtime Environment,**java程序的运行环境,java运行的所需的类库+JVM(java虚拟机)。 **3,配置环境变量:**让java jdk\\
Wesley13 Wesley13
11个月前
Java虚拟机(一):JVM简介
JVM简介 ===== Java虚拟机(JVM)是由Java虚拟机规范定义的,其上运行的是字节码指令集。这种字节码指令集包含一个字节的操作码(opcode),零至多个操作数(oprand),虚拟机规范明确定义了每种字节码指令完成的功能是什么以及需要多少个操作数。Java虚拟机上运行的class文件,这个文件中包含字节码指令流以及类定义的信息,所以Java虚
Wesley13 Wesley13
11个月前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
2个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为