Java学习笔记 02、Java的基本概念

简介: Java学习笔记 02、Java的基本概念

一、Java的程序结构


源文件、类、方法

关系:类存在源文件中,方法存在类中,语句存在方法

各自含义:

源文件:扩展名为.java带有类的定义。类用来表示程序的组件,类的内容必须包含在{}中。

类:类中带有一个或多个方法,方法必须在类内部声明。

方法:方法中包含一连串执行的指令,也是包裹在{}中,一个方法就是一个函数或过程。

当Java虚拟机启动执行时,首先会寻找你指定的类(例如java class文件名),接着锁定类中的一个特定main()方法:


public static void main(String[] args){
}


紧接着虚拟机会执行main方法{}中的函数所有指令,每一个Java程序最少有一个类以及一个main(),一个应用程序只有一个main函数!!!


执行过程为三步:保存、编译、运行。



编译器及JVM各自作用

编译器:Java强类型语言,不容许变量保存类型的数据(类型安全性问题),其能找到所有的编译型错误,语法错误,以及对一些违反调用private方法的程序检查。并不会处理一些异常问题,例如字符串除数字。主要就是能够容许动态绑定功能,java可以在执行期引用连程序员都没有预期会碰到的类型。


JVM:期间处理一些问题会抛出异常,存取权限的安全问题,确保不会有人在执行前修改二进制代码。



二、关键字及标识符


关键字与保留字

关键字与保留字都有特殊含义,命名时不能使用下列名称定义


关键字:对java的编译器有特殊的意义,用来表示一种数据类型或者表示程序的结构等。


定义数据类型:class、interface、enum、byte、short、int、long、float、double、char、boolean、void

定义流程控制:if、else、switch、case、default、while、do、for、break、continue、return

定义访问权限:private、protected、public、extends、implements

定义建立实例与引用实例,判断实例:new、this、super、instanceof

用于异常处理:try、catch、finally、throw、throws

用于包:package、import

其他修饰符关键字:native、strictfp、transient、volatile、assert

定义数据类型值的字面值:true、false、null

其他关键字:abstract、static、synchronized

保留字:是为java预留的关键字,他们暂时还没有作为关键字,在以后升级版本可能会作为关键字。


byValue, cast, false, future, generic, inner, operator, outer, rest, true, var,goto,const, null


标识符

标识符含义、规则以及命名规范


标识符:命名时使用的序列,java中严格区分大小写。


标识符规则:


可有英文字母大小写、0-9数字、_或$字符组成。

不能使用数字开头,同时标识符不能包含空格。

不能使用关键字或保留字,但是可以包含关键字或保留字。

严格区分大小写,长度没有限制。

标识符命名规范:仅仅只是种规范,并不强求,但是一般都遵守这种规范


包名:可以多单词组成,全小写,例如:xxxyyyzzz。

类名、接口名:可以多单词组成,所有单词首字母都大写,例如:XxxYyyZzz。

变量名、方法名:多单词组成时,第一个首字母小写,第二个单词后每个单词首字母都大写,例如:xxxYyyZzz。

常量名:所有字母都大写,多单词时每个单词使用下划线连接,例如:XXX_YYY_ZZZ。

其他说明:由于java采用unicode字符集,所以标识符中也可以包含汉字,但是通常不建议使用!!!



三、数据类型


初识数据类型

注意注意,这是数据类型,不是数据结构!!!


Java是强类型的,其含义:需要明确指出的类型,定义,声明及赋值。


所有数据类型包含内容以及取值范围如下图:






其中2的31次方都有21亿了,一般来说int就都够用了,在这里特地说明下数字大小。



计算机换算单位(小到大):bit、B(byte)、Kbit、KB、Mbit、MB、Gbit、GB、Tbit、TB…,换算关系如下图:



bit:是计算机中最小的存储单位。

byte:计算机中基本的存储单位。上面一些基本类型就是使用字节byte表示。


基本类型

整数类型

Java各整数类型具有固定的表数范围以及字段长度,不受具体OS(operation system 操作系统)的影响,保证java的可移植性。


整数类型有:byte、short、int、long


定义方式很简单如下:


//下列定义类型在占内存以及可取值范围都越来越大
byte x = 2;
short y = 2;
int z = 2;
long d = 2L;


需要说明的几点:


注意点:


定义long类型时,若是后面不加l或者L会认为是int型,所以定义long需要如long d = 100l或long d=100L


大容量值不能赋给小容量值,如下:


int x = 24;
byte x1 = x;//这是错误的,编译会报错为:不兼容的类型,从int类型转为byte类型可能会有精度损失
//若是硬要转,想要跳过编译器处理,可以使用这种方式:byte x1 = (byte)x


小容量值可以赋给大容量值,如下:


byte x = 24;
int y=x;//这是允许的


说明:我们通常来说定义int就足够用了,特定情况需要使用long类型。



浮点型


Java的浮点型常量默认为double型


分别是单精度float、双精度double


定义方式如下:


float f = 1.5f //或者float f = 1.5F
double d = 1.5;


注意点:


定义float类型时,若后面不加’f’或者’F’,都直接会被默认为double类型。


大容量不能赋给小容量,见下面情况:


//情况一:直接变量赋值
double f = 3;
float d = f; //这里编译会报错,会损失精度,若想要跳过编译报错,如float d = (float)f
//情况二:
float e = 13;
float d = e + 12.5;//同样也是会编译报错,因为12.5默认为double类型,两者相加就是double类型,所以需要修改如下
//float d = (float)e + 12.5


小容量也是可以赋给大容量。



字符型


可以为任意单个字符或者转义字符


范围为:0-65535


定义方式:


char a = 'a';
char a = 97;//允许
char a = (char) 97.0; //97.0为double类型,需要向下转型
char a = '\\';//转义字符,输出为\



布尔类型


只能通过true或false表示


定义如:boolean a = true; 或者 boolean a = false;



总结


这里暂时不介绍引用数据类型,对基本类型进行总结


上述几个类型大小排序为:byte、char、short <int<float<long<double


大容量赋给小容量都需要进行向下转型,否则会有编译问题。


需要注意的如下:


①其中比较特殊的是char它内存中占2个字节却能够与int相互赋值而不用进行向下转型,如:


//下面两种都是可以编译通过的
int a = 'a';
char b = 12;


②java在运算的时候,如果操作数都在int范围内,那么一律按在int空间运算。


简单来说:byte、char、short 这三个类型进行运算,其结果一定是int类型。


byte a = 10;
short b = 11;
short c = (short) (a+b);//这里需要向下转型 或者 int d = a+b;


我们这样想byte是1字节,short是2字节,char也是2字节,编译器应该是通过计算其内存占用空间,1字节+2字节=3字节,那么不就超过了这个三个类型的任意一个了嘛,所以就会出现直接使用int来得到值的情况。


③强制向下类型转换会缺失精度,举例介绍。


float a = 15.2f;
int b = (int) a;
System.out.println(b);  //结果为15,向下类型转换会缺失精度


④Java中定义基本类型时一定要赋初值,否则编译报错。



引用类型(String)

String属于引用数据类型中的class类,也叫做字符串,下面暂时只介绍连接字符串情况。


一般类的话若是创建对象需要new出来,而声名String类型变量,可以使用""包裹。


String可以与8种基本数据类型变量做运算,并且运算只能是连接运算,使用的+号。


下面列举几种比较特殊情况:


①普通连接运算,连接到原本字符串之后


String str = "";
str += 'a';  //"a"
str += true; //"atrue"


②String可以为空字符串,而char不行


String str = "";//编译通过
char a = '';//编译不通过


③String与char相加会变为String;char与char相加会对ASCII码进行累加,此时若+字符串,就会相连,如下情况:


//案例1:整型、字符串与char相混
char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c+num+str);//107hello  
System.out.println(c+str+num);//ahello10
System.out.println(c+(num+str));//a10hello
System.out.println((c+num)+str);//107hello
System.out.println(str+num+c);//hello10a
//说明:从前往后,若是char与string相加那么就会变为字符串,char与char相加就会按照ASCII码相加
//案例2:字符串及转义类型
System.out.println("*    *");         //* *
System.out.println('*'+'\t'+'*');     //93
System.out.println('*' + "\t" + '*'); //* *
System.out.println('*'+'\t'+"*");     //93*
System.out.println('*'+('\t'+"*"));   //*   *


char字符相加也就是其ASCII相加,输出时会是数字。

char字符与String相加,会连接成字符串;若是char是转义字符单独与String相加,配合输出时带有转义效果。

String是常量类,底层就是使用的char value[]来进行存储数据的。



四、运算符


算术运算符

算术运算符指:+,-,*,/…


整数自增问题说明:


//问题描述:+1编译问题
short x = 1;
x = x+1;//这样有编译问题的!需要向下转型 x = (short)x+1;
//解决:自增或者+=
x++;//这样就不会出现向下转型情况了。
//或
x += 1; //这样也是可行的


浮点数除数问题:


//问题描述:结果为整数,缺失了精度
float f = 5/2;//先计算右边5/2 按照整数相除计算再赋值给f变量,所以会为2.0
System.out.println(f);//2.0
//解决:求得浮点数
float f = (float) (5/2.0); //参与运算的需要为浮点数,这样运算会进行浮点数运算
System.out.println(f);//2.5


比较细节问题


1、基本数据类型中的内存空间问题


byte b = 127;//byte范围为[-128,127]
b++;//底层存储数据采用补码127为[01111111]补+1=[10000000]补  所以其结果就表示为-128
System.out.println(b);//-128


2、浮点型赋值给整型损失精度


int i = 1;
i = (int) 0.1;
System.out.println(i);//0


3、多个自增运算


int n = 10;
n+= (n++)+(++n);// n = n+(n++)+(++n)=(10+10+11)+1=32 最后运算结束了还会自增1
System.out.println(n);//32


比较运算符

比较运算符指==、>=、<=、!=…


比较运算符的结果都是boolean类型的,要么是true,要么是false,见下图即可:




五、乱码字符集


我们常常会遇到转换字符集时,中文变乱码的情况,下面就说明一下。


乱码:世界上有许多不同的编码格式,同一个二进制数字可以被解释成不同字符,当我们打开一个文件时,若不是按照原本编码格式打开,很容易出现乱码问题,尤其是中文的乱码。


常见的几种编码格式:ASCII码、Unicode编码、UTF-8编码、ANSI编码(又叫GBK字符集)。


     计算机底层是用0、1表示的,为了表示不同的字符,那么就需要使用编码来进行表示,最初的字符集是ASCII码,起初只是针对于美国,之后不同国家也慢慢普及了,这时候就出现问题了,每个国家都有各自的编码。


     接着出现了Unicode编码:将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,使用Unicode就没有乱码的问题。缺点就是都使用4个字节表示,造成空间的极大浪费。


     最终实际落地的是UTF-8字符集,它是互联网上使用最广的一种Unicode的实现方式,其是一种变长的编码格式,可以使用1-6字节表示一个符号,能够解决Unicode编码的缺点,这里不过多介绍。


     最后再介绍一下ANSI编码,又叫做GBK字符集,在中文版windows系统中就是表示中文,若是你其中有文字是ANSI编码的,再使用UTF-8编码格式打开就会出现乱码情况!!!ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。


若是想详细了解一下Unicode、UTF-8、ANSI可以看文章:彻底弄懂 Unicode 编码、ANSI是什么编码?



运算符优先级

见下图即可:


相关文章
|
3月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
11天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
26 1
|
17天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
2月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
2月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
2月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
1月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
31 0
|
1月前
|
Java 程序员 开发工具
java学习笔记
java学习笔记
34 0
|
2月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
本文是“Java学习路线”中Java基础知识的高级篇,主要对多线程和反射进行了深入浅出的介绍,在多线程部分,详细介绍了线程的概念、生命周期、多线程的线程安全、线程通信、线程同步,并对synchronized和Lock锁;反射部分对反射的特性、功能、优缺点、适用场景等进行了介绍。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
|
3月前
|
Java Docker 微服务
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
83 1
下一篇
无影云桌面