Java概述
何为编程
编程就是使用某种程序设计语言编写程序代码让计算机解决某个问题
为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。
什么是Java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
jdk1.5之后的三大版本
1、Java SE(J2SE,Java 2 Platform Standard Edition,标准版)
Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。
2、Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版)
Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名为 JakartaEE
3、Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
JVM、JRE和JDK的关系
1、JVM
Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。
2、JRE
ava Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等
3、JDK
Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK, 就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等
什么是跨平台性?原理是什么
跨平台性是指软件能够在不同的操作系统和硬件平台上运行的能力。
Java具有跨平台性是因为Java字节码可以在不同的操作系统和硬件平台上运行,而不需要对字节码进行修改,这是Java虚拟机(JVM)的工作。
Java的跨平台原理是基于Java虚拟机(JVM)的。Java编译器将Java源代码编译成Java字节码,然后Java虚拟机(JVM)将这些字节码加载到内存中,并在运行时解释执行这些字节码。由于Java虚拟机(JVM)是与平台无关的,因此Java程序可以在不同的操作系统和硬件平台上运行。
Java语言有哪些特点
简单易学(Java语言的语法与C语言和C++语言很接近)
面向对象(封装,继承,多态)
平台无关性(Java虚拟机实现平台无关性)
支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
支持多线程(多线程机制使应用程序在同一时间并行执行多项任务)
健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
什么是字节码?采用字节码的最大好处是什么
1、字节码
Java源代码经过编译器(例如IDEA软件)编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。
2、采用字节码的好处
采用字节码的好处主要有以下几点:
1. 跨平台性:Java字节码是一种中间语言,可以在不同的操作系统和硬件平台上运行,这使得Java具有跨平台性。
2. 安全性:Java字节码可以在运行时进行安全检查,防止程序对系统造成损害。
3. 高效性:Java字节码可以通过即时编译器(JIT)在运行时进行优化,提高程序的执行效率。
4. 反编译困难:Java字节码是一种二进制文件,相对于源代码来说更难以被反编译,这有助于保护程序的知识产权。
5. 动态性:Java字节码可以在运行时动态生成和加载,这使得Java具有更强的动态性和灵活性。
总之,采用字节码是Java语言的一大特色,也是Java成为一种广泛应用的编程语言的重要原因之一。
3、编译与解释并存
Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java源程序经过虚拟机编译器编译后变成字节码,字节码由虚拟机解释器执行,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。
流程:Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm把字节码发给解释器----->解释器将其翻译成特定机器上的机器码------>程序运行。
补充:不同操作系统的jvm虚拟机是一样的吗?
不同操作系统的JVM虚拟机是不一样的。尽管Java虚拟机规范定义了Java虚拟机的行为和接口,但是Java虚拟机的实现是与操作系统相关的,因为Java虚拟机必须与操作系统交互来实现Java程序的执行。
不同操作系统的JVM虚拟机在实现上可能存在一些差异,比如内存管理、线程调度、垃圾回收等方面的实现会因为操作系统的不同而有所不同。此外,JVM虚拟机还需要与操作系统交互来实现一些底层功能,比如文件操作、网络通信等,这些功能的实现也会因为操作系统的不同而有所不同。
尽管不同操作系统的JVM虚拟机存在一些差异,但是它们都遵循Java虚拟机规范,保证了Java程序在不同操作系统上的可移植性和跨平台性。
什么是Java程序的主类?
Java 应用程序是由若干类和接口组成的,为了使Java 应用程序能够运行,至少要有一个类含有main()主方法,因为main()主方法是Java 应用程序的入口点,Java 应用程序就是从这里开始运行的,我们把含有main()主方法的类称为Java 应用程序的主类。
骚戴理解:很容易误认为有public的类就是主类,注意有public的类不一定是主类。在Java程序中,可以有多个public类,但是只能有一个主类(Main Class),主类是程序的入口点,是Java虚拟机启动程序时调用的类。
在Java程序中,主类必须包含一个public static void main(String[] args)方法,这个方法是程序的入口点,Java虚拟机会从这个方法开始执行程序。因此,只有包含这个方法的类才能作为主类。
如果有多个public类都包含了main方法,那么只有其中一个类可以作为主类,其他类只能作为辅助类。如果没有public类包含main方法,那么程序将无法运行。
Java 应用程序是从main()主方法开始运行的,在Java 应用程序中将含有main()主方法的类称为主类,而在一个Java 应用程序中,开发人员往往为了测试的方便,会为每个类添加一个主方法,但是在测试完以后,应该记着将进行测试的主方法删除,只保留主类中唯一的一个主方法。
Java和C++的区别
Java和C++是两种不同的编程语言,它们之间存在以下几点区别:
1. 语言类型:Java是一种面向对象的编程语言,而C++既可以面向过程编程,也可以面向对象编程。
2. 平台依赖性:Java具有很好的跨平台性,可以在不同的操作系统和硬件平台上运行,而C++的程序在不同的操作系统上需要重新编译。
3. 内存管理:Java具有自动内存管理机制,程序员不需要手动管理内存,而C++需要程序员手动进行内存管理。
4. 异常处理:Java中的异常处理机制比C++更加完善和规范。
5. 安全性:Java具有更好的安全性,可以防止程序对系统造成损害,而C++程序可以访问系统的底层资源,存在一定的安全风险。
6. 开发效率:Java的开发效率比C++更高,Java具有更丰富的类库和工具,可以快速开发出高质量的应用程序。
总之,Java和C++是两种不同的编程语言,它们各有优缺点,适用于不同的场景和需求。Java适合于开发跨平台的应用程序和Web应用,而C++适合于开发需要高性能和底层控制的应用程序,如操作系统、驱动程序等。
基础语法
Java有哪些数据类型
定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。
Java的引用数据类型包括以下几种:
1. 类类型(Class Type):类类型是指由类定义的数据类型,包括自定义类和Java API中的类。
2. 接口类型(Interface Type):接口类型是指由接口定义的数据类型,接口定义了一组方法的签名,而不包含方法的实现。
3. 数组类型(Array Type):数组类型是指由相同数据类型的元素组成的有序集合,可以通过下标来访问每个元素。
4. 枚举类型(Enumeration Type):枚举类型是指由一组具名常量组成的数据类型,每个常量都有一个唯一的名称和一个预定义的值。
5. 注解类型(Annotation Type):注解类型是指由注解定义的数据类型,注解用于为程序元素添加元数据。
除了以上几种引用数据类型,Java还有一种特殊的引用类型——null类型,它表示一个空引用。当一个引用变量没有指向任何对象时,它的值为null。
8种java基本数据类型的详细解释
8种java基本数据类型的详细解释
在JDK8的官方文档中,boolean类型仍然占用1个字节(8位)。Java中的boolean类型只有两个取值:true和false,因此只需要1个字节的存储空间就可以表示它们。在JDK8中,boolean类型的范围仍然是true和false,没有发生变化,因此它的存储空间也没有发生变化。
骚戴理解:char占两个字节,在Java中,String类型是一个引用类型,它表示一个字符串对象。String对象占用的字节数取决于字符串的长度和编码方式。
在Java中,字符串默认使用UTF-16编码,每个字符占用2个字节。因此,如果一个字符串包含n个字符,则它占用的字节数为2n个字节。例如,字符串"Hello World"包含11个字符,因此它占用的字节数为22个字节。
需要注意的是,字符串对象本身也需要一定的存储空间,包括对象头和其他元数据。在32位Java虚拟机中,一个空的String对象占用16个字节,在64位Java虚拟机中,一个空的String对象占用24个字节。因此,实际上一个字符串对象占用的总字节数为2n加上对象头和其他元数据的字节数。
switch 是否能作用在 byte 上?是否能作用在 long 上?是否能作用在 String 上?
在Java中,switch语句可以作用在byte、short、char、int、枚举类型和String类型上,但不能作用在long类型上。
具体来说:
1. byte、short、char、int和枚举类型:这些类型可以作为switch语句的表达式类型,因为它们的取值范围是有限的,可以作为case语句的常量表达式。
2. long类型:由于long类型的取值范围较大,无法枚举所有的取值,因此不能作为switch语句的表达式类型。
3. String类型:从Java SE 7开始,String类型也可以作为switch语句的表达式类型。在使用String类型作为表达式时,case语句后面跟的是字符串常量,而不是整数常量。
需要注意的是,无论是哪种类型,case语句后面的值必须是常量表达式,不能是变量或者其他表达式。
用最有效率的方法计算 2 乘以 8
计算2乘以8,最有效率的方法是使用位运算。因为位运算比乘法运算和除法运算更快。
具体来说,可以使用左移运算符(<<)实现2乘以8的计算。左移运算符将一个二进制数向左移动指定的位数,相当于将这个数乘以2的指定次幂。
对于2乘以8,可以将2左移3位,即2 << 3,得到的结果为16。因此,最有效率的方法计算2乘以8的结果为16。
Math.round(11.5) 等于多少?Math.round(-11.5)等于多少
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。Math.round是取大于这个数的最小整数
骚戴理解:通俗易懂的讲就是四舍五入
float f=3.4;是否正确
不正确!3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化) 会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;
short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗
对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给short 型。
而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。
Java语言采用何种编码方案?有何特点?
Java语言采用Unicode字符集来表示字符和字符串,Unicode字符集是一种全球通用的字符编码方案,它包含了世界上几乎所有的字符,包括各种语言的字母、数字、符号、汉字等。Java中的char类型和String类型都使用Unicode字符集来表示。
在Java中,Unicode字符集采用UTF-16编码方式进行存储,每个字符占用2个字节。UTF-16编码方式是一种可变长的编码方式,在表示ASCII字符时只需要一个字节,而在表示非ASCII字符时需要两个字节或者四个字节。UTF-16编码方式可以保证所有的Unicode字符都能被正确地表示,并且支持快速的随机访问和长度计算。
Java中的字符串常量也采用Unicode字符集和UTF-16编码方式进行存储。在Java源代码中,可以直接使用Unicode转义序列来表示任意的Unicode字符,例如"\u4e2d\u6587"表示中文。Java编译器会将这些转义序列转换为对应的Unicode字符,然后存储到class文件中。在程序运行时,Java虚拟机会将这些Unicode字符转换为UTF-16编码方式,并存储到内存中。
Java注释
1、Java注释的定义
定义:用于解释说明程序的文字分类
2、Java注释的分类
单行注释格式: // 注释文字
多行注释格式: /* 注释文字 */
文档注释格式:/** 注释文字 */
3、Java注释的作用
在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。多行和文档注释都不能嵌套使用。
访问修饰符
1、访问修饰符定义
Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
2、访问修饰符分类
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected : 对同一包内的类和不同包的所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
public : 对所有类可见。使用对象:类、接口、变量、方法
3、访问修饰符图
&和&&的区别
&和&&的区别
&和&&都是Java中的逻辑运算符,用于判断两个布尔表达式的逻辑关系。它们的区别如下:
1. &是逻辑与运算符,它的两个操作数都会被求值,只有当两个操作数都为true时,结果才为true。即使第一个操作数为false,第二个操作数也会被求值。
2. &&也是逻辑与运算符,它的两个操作数都会被求值,但是当第一个操作数为false时,第二个操作数不会被求值,直接返回false。只有当第一个操作数为true时,才会继续求值第二个操作数。
因此,&&运算符具有短路求值的特点,可以避免不必要的计算,提高程序的效率。在实际开发中,如果两个操作数都是常量或者字面量,建议使用&&运算符,可以避免不必要的计算。
需要注意的是,&和&&的优先级不同,&&的优先级比&高。在使用时,应该根据实际需要加上括号,以避免优先级问题导致的错误。
Java 有没有 goto
Java中没有goto语句,这是由Java语言设计者故意决定的。goto语句是一种无限制的跳转语句,它可以跳转到程序中的任何一行代码,包括循环、条件语句等。goto语句虽然可以简化程序的编写,但是会使程序结构变得混乱和难以理解,容易引起逻辑错误和调试困难。
为了避免goto语句的缺陷,Java语言设计者采用了其他的控制结构来代替goto语句,比如循环语句、条件语句、异常处理语句等。这些控制结构可以更加清晰地表达程序的逻辑结构,使程序更容易理解和维护。
需要注意的是,Java中有一个标签(Label)语句,可以用于给代码块起一个名字,但是它不能像goto语句一样随意跳转到任何一行代码,只能用于在嵌套的循环语句或者switch语句中跳出多层循环或者switch语句。在实际开发中,应该避免使用标签语句,以保持程序的简洁和清晰。
在Java中,没有goto语句,也不推荐使用。但是可以使用标签(Label)语句来跳出多层循环。下面是一个使用标签语句来跳出多层循环的示例代码:
outer: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (i * j > 50) { System.out.println("i=" + i + ", j=" + j); break outer; } } }
在这个示例代码中,使用了一个outer标签来标识外层循环。当内层循环中的条件满足时,使用break outer语句来跳出外层循环,从而实现了跳出多层循环的效果。
需要注意的是,使用标签语句来跳出多层循环虽然可以实现跳转的效果,但是会使程序结构变得复杂和难以理解,容易引起逻辑错误和调试困难。在实际开发中,应该尽量避免使用标签语句,以保持程序的简洁和清晰。
inal 有什么用?
用于修饰类、属性和方法;
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变
final finally finalize区别
1. final关键字用于修饰类、方法和变量,表示它们是不可变的。final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的变量不能被重新赋值。final关键字可以提高程序的性能和安全性,避免意外的修改。
2. finally关键字用于定义一个代码块,无论try语句块中是否发生异常,finally语句块中的代码总是会被执行。finally语句块通常用于释放资源、关闭文件、清理数据等操作,保证程序的健壮性和可靠性。
3. finalize方法是Object类中的一个方法,用于在垃圾回收器回收对象之前执行一些清理操作。finalize方法在对象被垃圾回收之前被调用,可以用于释放资源、关闭文件等操作,但是不建议这么做。但是finalize方法不是Java中的析构函数,不能保证一定被调用,也不能保证在对象被回收之前立即执行。
finalize方法是Java中的垃圾回收机制的一部分,它在垃圾回收器回收对象之前被调用,但是不能保证在对象被回收之前立即执行。这是因为Java的垃圾回收机制是异步的,垃圾回收器并不会立即回收对象,而是在一定的时间间隔后才会启动垃圾回收器进行回收。因此,finalize方法的执行时间是不确定的,可能会被延迟到下一次垃圾回收时才被执行。
另外,由于finalize方法的执行时间不确定,因此不能在finalize方法中进行重要的操作,比如释放系统资源、关闭文件等操作。如果在finalize方法中进行这些操作,可能会导致系统资源泄漏、文件无法关闭等问题。
因此,建议在Java程序中尽量避免使用finalize方法,而是采用其他方式来释放系统资源和清理数据,比如使用try-with-resources语句块来自动关闭文件等资源。
需要注意的是,final、finally和finalize虽然名称相似,但是它们的作用和用法是完全不同的,不要混淆使用。
this关键字的用法
this是自身的一个对象,代表当前对象本身
this的用法在java中大体可以分为3种:
1、普通的直接引用,this相当于是指向当前对象本身。
2、在构造方法里形参与成员名字重名,用this来区分:
publicPerson(String name,int age){ this.name = name; this.age = age; }
3、引用本类的构造函数
classPerson{ private String name; private int age; public Person(){} public Person(String name){ this.name = name; } public Person(String name,int age){ this(name); this.age = age; } }
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
super关键字的用法
super相当于是指向当前对象的父类的引用
super也有三种用法:
1.普通的直接引用
与this类似,super相当于是指向当前对象父类的引用,这样就可以用super.xxx来引用父类的成员。
2.子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分
class Person{ protected String name; public Person(String name){ this.name = name; } } class Student extends Person{ private String name; public Student(String name, String name1){ super(name); this.name = name1; } publicvoidgetInfo(){ System.out.println(this.name);//Child System.out.println(super.name);//Father } } publicclassTest{ public static void main(String[] args){ Student s1=newStudent("Father","Child"); s1.getInfo(); } }
3、引用父类构造函数
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this与super的异同
super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
1、super()和this()的区别
this关键字用于引用当前对象,可以用于访问当前对象的成员变量和成员方法。this关键字还可以用于调用当前类的其他构造方法,以实现构造方法的重载。
super关键字用于引用父类对象,可以用于访问父类的成员变量和成员方法。super关键字还可以用于调用父类的构造方法,以实现子类的构造方法。
this关键字可以省略,Java编译器会自动判断当前对象是否需要使用this关键字。而super关键字不能省略,必须显式地指定父类的构造方法。
2、super()和this()的相同点
super()和this()均需放在构造方法内第一行。
this和super都必须在构造方法或者实例方法中使用,不能在static环境中使用。包括:static变量,static方法,static语句块。
this和super都可以用于访问对象的成员变量、成员方法和构造方法
3、注意事项
this和super不能同时出现在一个构造函数里面,是因为它们都是用于调用构造方法的关键字,使用它们会引起歧义。在Java中,构造函数的第一行必须是调用本类或父类的构造方法,如果同时使用this和super,编译器无法确定应该调用哪一个构造方法,会导致编译错误。