跳至主要內容

Java基础概念(一)

CodeShouhu大约 20 分钟使用指南Markdown

Java基础概念与知识汇总

1,详细说明Java语言有哪些重要的特性

(1)简单性:Java语言继承了C++语言的优点,去掉了C++中学习起来比较难的多继承、指针等概念,因此Java语言学习起来更简单,使用起来也更方便。

(2)面向对象:Java是一种面向对象的编程语言。

(3)分布性:Java设计成支持在网络上应用,它是分布式语言。

(4)编译和解释性:Java编译程序生成字节码,而不是通常的机器码,这使得Java开发程序比用其他语言开发程序快很多。

(5)稳健性:Java刚开始被设计出来就是为了写高可靠和稳健的软件的。

(6)安全性:Java的存储分配模型是它防御恶意代码的主要方法之一。

(7)可移植性:Java并不依赖平台,用Java编写的程序可以运用到任何操作系统上

(8)高性能:Java是一种先编译后解释的语言,所以它不如全编译性语言快。但Java设计者制作了“及时”编译程序,这样就可以实现全编译了。

(9)多线索性:Java是多线索语言,它可以同时执行多个程序,可以支持多线程,能处理不同任务。

(10)动态性:Java语言设计成适应于变化的环境,它是一个动态的语言。

速记

Java 特性真不少,听我来把顺口溜表。
继承 C++ 优点妙,多继指针全不要,简单方便学习好。
面向对象设计巧,分布网络用得到。
编译解释生字节,开发速度真叫快。
稳健安全有一套,存储分配防恶扰。
平台无关可移植,任意系统都能跑。
先编后解性能高,及时编译来提高。
多线并发任务搞,动态适应变化妙。

2,举例详细说明Java和c++的区别?

(1)编译与解释:Java是一种解释性语言,源代码通过Java编译器编译成字节码,然后由JVM解释运行。而C++则是编译语言,源代码经过编译和链接后生成可执行的二进制代码,可以直接执行。因此,一般来说,Java的执行速度比C++慢,但Java能够跨平台。

(2)内存管理:Java是一种内存安全型语言,当为给定数组分配的参数超出范围时,只会返回错误提示,Java中也存在垃圾回收机制,可以自动释放无用的内存。C++更加灵活,但代价是一旦分配的参数超出资源范围,就可能引起错误甚至严重崩溃。

(3)面向对象:Java是一种完全面向对象的编程语言,除了基本数据类型外,所有的数据类型都是类,都直接或间接继承自Object类。而C++同时具有面向过程和面向对象的特点。

(4)重载:Java允许方法重载,而C++则允许进行运算符重载和方法重载

(5)继承:在Java中的类允许是单继承的,但是可以定义接口实现多继承,在c++中可以实现类的多继承

(6)指针:从安全性角度考虑,Java不提供指针对内存进行直接的访问,更安全

速记

Java C++ 来对比,听我给你说仔细。
Java 解释生字节,JVM 运行跨平台;C++ 编译直执行,速度更快没悬念。
内存管理有差异,Java 安全有垃圾;C++ 灵活易崩溃,使用起来要留意。
面向对象看仔细,Java 纯粹无压力;C++ 过程又对象,双重特性真神奇。
重载方面也不一,Java 方法 C++ 齐,运算方法都可以。
继承规则有区别,Java 单继接口多;C++ 多继很直接,使用场景各有得。
指针安全 Java 棒,内存访问不瞎闯;C++ 指针虽灵活,风险伴随要斟酌。

3,在Java中JDK,JRE和JVM有哪些重要的不同点,分别详细介绍?

(1)JDK(Java Development Kit):

JDK是Java语言的软件开发工具包,是Java程序的开发环境。它内部包含了代码的编译工具和运行工具,包含运行环境JRE,供程序员在编写和测试程序时使用。JDK是进行Java程序开发所必需的,无论是编译还是运行Java程序,都需要使用JDK中的工具和库

(2)JRE(Java Runtime Environment):

JRE是Java运行时环境,它包含了Java虚拟机(JVM)和Java的核心类库,是Java程序运行所必需的环境。JRE是运行已经编译好的Java程序所必需的,只有安装了JRE,才能运行Java程序。

(3)JVM(Java Virtual Machine):

JVM是Java虚拟机,是真正运行Java程序的地方。它的主要作用是保证Java语言跨平台,将Java字节码转换为本地机器码并执行。JVM屏蔽了底层操作系统的细节,使得Java程序可以在不同的操作系统平台上运行,只要这些平台上有对应的JVM实现即可。

(4)总结:

JDK用于开发Java程序,JRE用于运行已编译的Java程序,而JVM则是执行Java程序的虚拟机环境。这三者共同构成了Java的开发和运行环境。

速记

Java环境三件宝,JDK、JRE、JVM绕。
JDK开发好依靠,编译运行工具妙。
JRE运行不能少,JVM、类库是个宝。
JVM跨平台真高,字节码转本地跑。
开发运行配合巧,共同构建环境好。

4,解释Java代码可以实现一次编写、在不同的系统上到处运行?

Java代码可以实现一次编写、到处运行的原因是因为Java是一种跨平台的编程语言。跨平台性是Java语言最重要的特性之一,也是Java语言设计的初衷。

Java语言通过将源代码编译成Java字节码(以.class为扩展名),然后在不同的平台上使用Java虚拟机(JVM)来运行字节码,实现了跨平台的能力。因为不同的操作系统上都有不同的JVM实现,所以只需要编写一次Java代码,就可以在任何支持JVM的平台上运行,无需对代码进行修改。

另外,Java语言还提供了跨平台的标准类库,这些类库可以在任何支持JVM的平台上使用,使得开发人员可以轻松地编写跨平台的应用程序。

因此,Java语言的跨平台性使得开发人员可以更加高效地编写和维护代码,同时也降低了开发和维护成本。这也是Java语言广泛应用于开发各种类型的应用程序,包括桌面应用程序、移动应用程序、Web应用程序、企业应用程序等的原因之一。

速记

Java跨平台超棒,一次编写到处闯。
源码编译字节码,JVM运行有保障。
不同系统都能上,代码无需再更张。
标准类库也帮忙,跨平台来真在行。
开发维护都通畅,各类应用它来扛。

5, Java 语言有一种说法是“编译与解释并存”,请简单说明?

Java语言之所以被称为“编译与解释并存”的语言,是因为它采用了一种独特的运行方式,结合了编译和解释两种方式的优点。

Java的源代码首先会被编译成一种叫做 字节码(bytecode) 的中间形式。这个过程是由 Java编译器 完成的。字节码是一种平台无关的代码,它可以在任何安装了 Java虚拟机(JVM) 的设备上运行。这就是Java的“一次编写,到处运行”的特性。

然后,这些字节码在运行时由 Java虚拟机(JVM) 解释或者编译成机器代码执行。JVM中的 解释器(interpreter) 可以直接解释执行字节码,而 即时编译器(Just-In-Time compiler,JIT) 可以将热点的字节码编译成机器代码以提高执行效率。这就是Java的“编译与解释并存”的含义。

总的来说,Java语言的 编译与解释并存 的特性使得它具有了良好的性能和跨平台能力。

速记

Java编译又解释,独特方式真明智。
源码先变字节码,编译步骤首实施。
平台无关字节妙,JVM运行没烦恼。
解释执行即时编,热点代码效率高。
编译解释并存好,性能跨板双达标。

6,在编程算法中,可以介绍什么是编译型语言,什么是解释型语言?

编译型语言和解释型语言是两种不同的计算机程序设计语言,它们的主要区别在于如何将源代码转换为可以由计算机执行的机器代码

编译型语言是指使用专门的编译器,将某种高级语言源代码一次性翻译成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式。这个转换过程称为“编译”。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。因为编译型语言是一次性编译成机器码,所以可以脱离开发环境独立运行,而且运行效率较高。但是,编译型语言的程序被编译成特定平台上的机器码,所以通常无法移植到其他平台上运行。如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少也需要采用特定平台上的编译器重新编译。常见的编译型语言有C、C++等

解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言可以方便地实现源程序级的移植,但这是以牺牲程序执行效率为代价的。解释型语言在运行时,会先对源代码进行解释,然后再逐行执行。这使得它们在运行速度上可能较慢,因为每次执行都需要重新解释。但是,由于其源代码可以直接在各种平台上运行,解释型语言具有良好的跨平台性。常见的解释型语言有Python、Ruby、JavaScript等

速记

编译解释两类型,代码转换各有型。
编译语言用器编,一次搞定机器言。
独立运行效率高,移植改动真不少。
C与C++是代表,编译特点要记牢。
解释语言逐行解,跨平台好速度跌。
Python等是代表,灵活移植没烦恼。

7,解释java中所蕴含的字节码的含义?

Java编译器将源代码编译成Java字节码(以.class为扩展名),使用字节码的好处在于:

(1)跨平台性:由于Java应用程序的字节码可以在任何Java虚拟机上运行,所以同样的Java应用程序可以在任何支持Java虚拟机的操作系统和硬件平台上运行。这是Java最引人注目的特点之一。

(2)安全性:由于字节码需要通过Java虚拟机运行,在字节码中一些危险的操作都被禁止了,如指针操作、内存管理等。这使得Java基本上免受了内存泄漏、空指针异常等问题。

(3)高效性:由于字节码可以通过即时编译器(JIT)在运行时编译成本地机器码,所以它可以实现接近本地应用程序的性能。即时编译器需要执行一些优化,如方法内联、循环展开等,可以使代码更加高效。

(4)易于维护:采用字节码编写的程序,由于在运行时已经经过了优化,因此在程序维护和调试上将更加容易。

(5)支持动态性:在运行时,字节码可以被动态的生成和修改,这使得程序具备了更加灵活的控制能力。

速记

Java编译本领强,源码转成字节档。跨平台来真叫棒,任意JVM都能上。危险操作全阻挡,安全无忧心不慌。JIT编译性能旺,维护调试也清爽。动态生成可变样,灵活控制有保障。

8,面向对象和面向过程有哪些重要的区别?

两者的主要区别在于解决问题的方式不同:

面向过程以过程为核心,强调事件的流程、顺序。面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。

面向对象以对象为核心,强调事件的角色、主体。面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。

一般来说,面向过程的性能较高,所以单片机、嵌入式开发等一般采用面向过程开发。面向对象有封装、继承、多态的特性,所以易维护、易复用、易扩展,可以设计出低耦合的系统。

速记

面程面相对比妙,解决方式差异找。面程核心在流程,方法执行顺序明。面相对象是主体,抽象对象方法齐。面程性能比较高,嵌入开发常用到。面多特性优势妙,维护复用扩展好。

9,在一个Java文件中可以包含多个类吗,有什么注意点?

在一个Java源文件中,只能有一个public类,并且这个公共类的名字必须与文件名相匹配,也可以有多个非public类。如果没有public类,那么源文件可以任意命名,只要扩展名是.java就可以了。

10,详细介绍在Java中全局变量,局部变量,以及成员变量的主要区别

1,全局变量:
全局变量是在整个程序中都可以访问的变量。在Java中,全局变量通常指的是类变量或静态变量。它们在程序的生命周期内一直存在,从程序开始运行时就被分配内存,直到程序结束运行时才被释放,未被static修饰的变量也叫实例变量,它存储于对象所在的堆内存中,被static修饰的变量也叫类变量,它存储于方法区中,生命周期与当前类相同。

2,成员变量:
成员变量是类的实例变量,一般也称为非静态变量,未被static修饰。每个类的实例都有自己的成员变量副本,它们随着对象的创建而创建,随着对象的销毁而销毁,存储于对象所在的堆内存中。全局变量与成员变量之间的界限比较模糊,可以都记。

3,局部变量:
局部变量只在其定义的代码块或方法中可见。它们在进入代码块或方法时被创建,并在退出代码块或方法时被销毁。局部变量存储在Java栈区的栈帧中。

public class VariableExample {  
    // 全局变量 (类级别的静态变量)  
    static int globalVar = 10;  
  
    // 成员变量  
    int memberVar = 20;  
  
    public void method() {  
        // 局部变量  
        int localVar = 30;  
        System.out.println("局部变量: " + localVar);  
    }  
  
    public static void main(String[] args) {  
        VariableExample example = new VariableExample();  
        System.out.println("全局变量: " + example.globalVar);  
        System.out.println("成员变量: " + example.memberVar);  
        example.method();  
    }  
}

速记

变量分类要记牢,全局成员局部瞧。全局变量范围广,类或静态来担当,程序全程它在场,内存分配方法藏。成员变量实例享,对象创建副本长,随生随灭堆中躺,与全局界有点茫。局部变量范围窄,代码方法才存在,进出存亡栈中来,各有特点别搞坏。

11,请详细说明Java中的基本数据类型有哪些,以及其对应的字节数

(1)byte:1字节,有符号的整数,取值范围是-128到127。

(2)short:2字节,有符号的整数,取值范围是-32768到32767。

(3)int:4字节,有符号的整数,取值范围是-2147483648到2147483647。

(4)long:8字节,有符号的整数,取值范围是-9223372036854775808到9223372036854775807。

(5)float:4字节,单精度浮点数,可以表示大约7位有效数字。

(6)double:8字节,双精度浮点数,可以表示大约16位有效数字。

(7)char:2字节,无符号的整数,取值范围是0到65535,通常用于表示Unicode字符。

(8)boolean:不确定字节数,通常认为是1字节,用于表示逻辑值true或false。

public class Main {  
    public static void main(String[] args) {  
        byte b = 10;  
        System.out.println("byte: " + b);  
          
        short s = 100;  
        System.out.println("short: " + s);  
          
        int i = 1000;  
        System.out.println("int: " + i);  
          
        long l = 10000L;  
        System.out.println("long: " + l);  
          
        float f = 12.34f;  
        System.out.println("float: " + f);  
          
        double d = 56.78;  
        System.out.println("double: " + d);  
          
        char c = 'A';  
        System.out.println("char: " + c);  
          
        boolean flag = true;  
        System.out.println("boolean: " + flag);  
    }  
}

速记

byte 1 short 2 int 4 long 8 double 8 float 4 char 2 —> 1248842

包装类型

12,在java中不同的基本数据类型所对应的包装类型有哪些,各自有什么作用?

(1)byte -> Byte;short -> Short;int -> Integer;long -> Long;float -> Float;double -> Double;char -> Character;boolean -> Boolean

(2)包装类型是对基本数据类型的封装,它们都是对象类型,而基本数据类型不是对象类型。

(3)包装类型可以使用null值,而基本数据类型不能使用null值。

(4)包装类型提供了更多的方法和功能,如类型转换、字符串转换等,而基本数据类型则没有这些方法。

(5)对于基本的数据类型,==符号比较的是,对于包装类型,==比较的是内存地址;并且对于整型包装类型的比较,用的是equals()

public class WrapperExample {  
    public static void main(String[] args) {  
        byte b = 10;  
        Byte wrapperB = b;  
        System.out.println("byte wrapper: " + wrapperB);  
          
        short s = 100;  
        Short wrapperS = s;  
        System.out.println("short wrapper: " + wrapperS);  
          
        int i = 1000;  
        Integer wrapperI = i;  
        System.out.println("int wrapper: " + wrapperI);  
          
        long l = 10000L;  
        Long wrapperL = l;  
        System.out.println("long wrapper: " + wrapperL);  
          
        float f = 12.34f;  
        Float wrapperF = f;  
        System.out.println("float wrapper: " + wrapperF);  
          
        double d = 56.78;  
        Double wrapperD = d;  
        System.out.println("double wrapper: " + wrapperD);  
          
        char c = 'A';  
        Character wrapperC = c;  
        System.out.println("char wrapper: " + wrapperC);  
          
        boolean flag = true;  
        Boolean wrapperFlag = flag;  
        System.out.println("boolean wrapper: " + wrapperFlag);  
    }  
}

速记

基本类型有包装,byte到Byte别忘,short变Short要记详,int成Integer响当当,long变Long也跟上,floatFloat别混淆,doubleDouble要明了,charCharacter别忘掉,booleanBoolean要记牢。包装类型是对象,基本类型不一样。包装可用null值,基本没这好本事。包装方法功能多,基本类型没法说。基本比较看数值,包装==比地址,整型包装用equals,这些区别要牢记。

13,在java中解释自动装箱,自动拆箱的含义,并举例说明

自动装箱与自动拆箱可以简化基本类型变量与包装类对象之间的转换流程

(1)装箱:包装对象 变量 = 包装对象.ValueOf(数值);

在装箱过程中,valueOf() 方法会创建一个新的包装类对象,并将基本数据类型的值封装到对象中。

(2)拆箱:基本数据类型 名称 = xxxValue();

在拆箱过程中,xxxValue() 方法会从包装类对象中提取出相应的基本数据类型值,并返回给调用者。

(3)自动装箱是指将基本数据类型自动地转换为对应的包装类对象

(4)自动拆箱是指将包装类对象自动转换为对应的基本数据类型。

public class fun {
    public static void main(String[] args) {
        //装箱
        //Integer a=Integer.valueOf(100);
        //自动装箱
        Integer b = 100;
        //拆箱
        //b==b.intValue()+200
        //自动拆箱
        b+=200;  
        System.out.println(b);
    }
}

速记

自动装箱与拆箱,转换流程变简单。装箱ValueOf创建,基本数据对象载。拆箱xxxValue取,对象数据提取齐。自动装箱基本转对象,自动拆箱对象变基本畅。

14,包装类型的主要作用有哪些,可以分别详细介绍

(1)对象化基本数据类型:在Java中,基本数据类型不是对象,因此无法直接调用对象的方法。通过使用包装类型,我们可以将基本数据类型转换为对象,从而可以使用面向对象编程的方法。

(2)提供了null值:在Java中,基本数据类型的默认值为0,无法表示null值。而包装类型可以表示null值,使得我们可以将基本数据类型的值设置为null。

(3)提供了转换方法:包装类型提供了将基本数据类型转换为字符串的方法(例如,Integer类的toString()方法),以及将字符串转换为基本数据类型的方法(例如,Integer类的parseInt()和valueOf()方法)。

(4)提供了比较方法:包装类型提供了比较两个基本数据类型值大小的方法(例如,Integer类的compareTo()方法)。

(5)增强了类型安全性:使用包装类型可以避免一些类型转换错误,提高了类型安全性

速记

包装类型真奇妙,基本数据对象造;null 值它能代表,基本类型做不到。转换方法很可靠,字串互转没烦恼;比较方法也不少,大小判断有高招。类型安全更重要,错误减少没糟糕。

15,,举例说明如何判断java中Integer和Double类型判断相等?

(1)如果想比较一个Integer和一个Double是否完全相等,可以先将Integer转换为Double,然后使用Double的equals方法进行比较。这是因为Double的equals方法会考虑精度问题。

Integer integerValue = 5;  
Double doubleValue = 5.0;  
if (doubleValue.equals(integerValue.doubleValue())) {  
    System.out.println("The values are equal.");  
} else {  
    System.out.println("The values are not equal.");  
}

(2)不能用==进行直接比较,因为它们是不同的数据类型;不能转为字符串进行比较,因为带小数点;不能使用compareTo方法进行比较,只能对相同的类型。

速记

equals+doubleValue,不能用==与compareTo,因为涉及到相同类型,不能用字符串,因为包含有小数点

16,在java中int和Integer有什么区别,可以通过举例详细介绍下

在进行==运算时,intInteger的表现会有所不同:

  • 对于两个int类型的变量,==运算会比较它们的值是否相等。例如,int a = 5; int b = 5;,在这里a == b会返回true
  • 对于两个Integer对象,==运算会比较它们是否引用同一个对象。也就是说,即使两个Integer对象的值相等,但如果它们不是同一个对象,==运算也会返回false。例如,Integer a = new Integer(5); Integer b = new Integer(5);,在这里a == b会返回false
  • 如果将一个Integer对象和一个int值进行==运算,Java会自动将Integer对象拆箱(unbox)为int值,然后进行比较。例如,Integer a = 5; int b = 5;,在这里a == b会返回true
public class Main {  
    public static void main(String[] args) {  
        // int example  
        int num1 = 10;  
        System.out.println("int value: " + num1);  
  
        // Integer example  
        Integer num2 = 20;  
        System.out.println("Integer value: " + num2);  
  
        // null value  
        Integer num3 = null;  
        System.out.println("Can Integer be null? " + (num3 == null));  
        // int cannot be null, will compile error if uncommented  
        // int num4 = null;  
  
        // Integer methods  
        String str = "30";  
        Integer num5 = Integer.parseInt(str);  
        System.out.println("Parsed Integer: " + num5);  
    }  
}

速记

int+int=true ; new Integer+new Integer=false ; Integer+int=true true false true