JAVA学习笔记(一)

1.Java跨平台的原理:

1)编译之后会生成与平台无关的字节码文件
2)得依赖不同平台的虚拟机(JVM)
JVM是不跨平台的

编译工具:javac
启动JVM工具:Java

JRE(Java Runtime Environment):Java运行环境,如果要运行Java程序,就需要JRE的支持,JRE里边包含JVM
JDK(Java Development Kit):Java开发工具,包含开发Java的所有工具,如javac和java等,JDK里包含JRE
Java虚拟机(Java Virtual Machine),简称JVM,它是运行所有Java程序的虚拟计算机,好比是街机游戏的模拟器。
JVM是Java语言的运行环境,也是Java最具吸引力的特性之一。JVM用于读取并处理编译过的与平台无关的字节码(class)文件,从而实现Java的可移植性。但是值得注意的是Java虚拟机是不跨平台的,也就是说在Win下得安装Win版本的JVM,在Linux下得安装Linux版本的JVM
JVM是Java程序的解释和执行器

2.Java安装后各个文件夹的含义

(1)bin:存放了Java的操作工具,比如编译工具javac,启动JVM的java等
(2)db:存放了Java测试的数据库derby,企业不用
(3)include:存储C++头文件
(4)jre:Java的运行环境,里面有JVM
(5)lib:Java运行和依赖的核心库
(6)src.zip:Java的源代码

3.安装jre运行java程序

(1)jre-8u121-macosx-x64.dmg(下载安装,在系统偏好设置的面板上)
(2)创建一个空文本,命名为.java文件(比如123.java 文件中有一个名为Hello的类,.java是后缀名或者拓展名)
(3)在终端找到文件路径执行javac 123.java,对文件进行编译,编译成功后此时路径下会生成一个Hello.class的字节码文件
(4)启动JVM,并加载Hello.class这份字节码,并解释执行(执行命令 java Hello),注意不要带后缀.class,就会执行字节码文件中的代码
(5)每次修改代码都需要进行编译

代码解释
// Java程序的开始,表示定义一个公共的类,类的名字是Hello,编译后会生成一个和该名字一样的class文件
public class Hello {
    // 主方法,Java程序的入口,执行Java命令后,程序自动执行主方法代码
    public static void main(String[] args) {
        // 功能执行代码,表示打印一个文本信息“Hello World”,最后要以分号结束,表示语句结束
        System.out.println("Hello World");
    }
}

4.Java编译和运行机制

源文件(.java) ->编译-> 字节码文件(.class)->输出-> Hello World
Java语言编译型语言

5.CLASSPATH(一般不用配这个环境变量)一般默认在当前目录下

环境变量:指在操作系统中用来指定操作系统运行环境的一些参数

JAVA_HOME: 指JDK的安装根目录,如D:\OpenSource\jdk1.8.0
PATH: 指Java开发工具的位置,如D:\OpenSource\jdk1.8.0\bin
CLASSPATH: 指JVM在运行时去哪一个目录路径加载字节码文件

如果在当前路径下希望把字节码文件统一到一个文件夹中,可以新建一个文件夹命名为classes 编译的时候使用命令javac -d classes 123.java 就可以将123.java的编译文件放在classes的文件夹下,解释字节码文件的命令此时换成java -classpath classes Hello就可以得到程序执行的结果

6.Java基本语法

1)Java语言严格区分大小写,好比main和Main是完全两个不同的概念。
2)一个Java源文件里可以定义多个Java类,但其中最多只有一个类被定义成public类。若源文件中包含public类,源文件必须和该public类同名
3)一个源文件中包含N个Java类时,成功编译后会生成N份字节码文件,即每个类都会生成一份单独的class文件,且字节码文件名和其对应的类名相同
4)若一个类必须运行,则必须拥有main方法,因为main方法是程序的入口

编程建议:
一个Java源文件只定义一个类,不同的类使用不同的源文件定义;
将每个源文件中单独定义的类定义成public的;
保持Java源文件的主文件名与源文件中的类名一致;

7.标识符

在写代码的时候为了增强代码的阅读性会自定义很多名字,比如类名,方法名,变量名等.这些自定义的名称,成为标识符
标识符命名规则:
(1)由字母、数字、下划线、$组成,但不能以数字开头(注:此处的字母可以是中文、日文等,类名首字母大写)
(2)大小写敏感
(3)不能使用Java的关键字和保留字
(4)不用Java API里的类名作为自己的类名

8.变量分类-作用域-使用规则:

变量的分类:
随着变量定义在类中的位置的不同,故把变量分为两类:
(1)成员变量:直接定义在类里的变量,又称为全局变量或字段.
(2)局部变量:变量除了成员变量以外,其他就是局部变量.根据定义位置不同有3种表现形式:方法形参,方法内变量,代码块变量

变量的作用域:
根据变量的存在范围,只有在这个范围内,程序代码才能访问它.当一个变量被定义时,他的作用域就被确定了
作用域是定义开始到定义所在的花括号结束;

变量的使用规则:
(1)变量必须先声明,并且初始化后才能使用;
(2)声明变量必须有数据类型
(3)同一作用域内变量名不能重复定义
先声明赋值后使用,并且可重复使用

//变量分类-作用域-使用规则
public class VarDemo2{
    //成员变量,字段(不叫属性)
    static int age=17;
    public static void main(String[] args){
        /*
         变量的分类:
         变量依据定义的位置的不同,分为两大类:
         1.成员变量/字段(Field):直接定义在类的{}中的变量(在方法外)
         --报错:无法从静态上下文中引用非静态变量

         2.局部变量(定义在方法中的变量)
         变量除了成员变量,就是局部变量.

         3.变量的作用域:可以起作用的领域.
         1.成员变量:在所定义的类中起作用
         2.局部变量:从定义的那个地方开始,到紧跟着结束的"}"之间
         */

        int age=18; // 局部变量
        System.out.println(age);/*输出18,当成员变量和局部变量同名时,编译不会出错,得到的结果采取就近原则*/
    }
}

9.表达式(expression):是由数字、运算符、数字分组符号(括号)、变量、常量等以能求得结果的有意义排列的组合。

用运算符号连接的变量/常量可称为表达式.那么也就是说表达式是由常量、变量、运算符、括号组成能求得之的有意义结果的语句。
如:
a+b
3.14+a
(x+y)*z+100
表达式中操作数进行运算得到的最终结果就是表达式的结果
表达式的运算顺序(大多和数学一样,参照后面的运算符操作优先级);
a + 110 -->表达式
操作数 运算符 操作数

10.在JAVA中数据类型整体上分为两大类:

   1):基本数据类型/原生数据类型:共8个
        1>:数值型
            1/:整数类型: byte short int long;(不同正数类型在内存中占用空间大小是不一样的,整数常量默认是int类型)
            2/:小数类型:float double;
        2>:字符型:char (字符:字母/符号)
        3>:布尔型:boolean,表示对错:ture false;

   2):引用数据类型/对象数据类型:
        类 / 接口 / 数组

11.小数的默认常量为double类型,若要声明小数常量卫float类型,就在后面加F或f

float表示单精度
double表示双精度
但是两者均不能表示精确的小数,那么在精度要求很高的系统如银行系统中,就需要使用BigDecimal类型,它表示任意精度的数据

Java的浮点类型常量有两种表现形式:
(1)十进制形式:例如:3.14,168.0,.618
(2)科学计数法形式:例如:3.14e2,3.14E2,1000E-2
科学计数法表达式返回的结果是Double类型的

默认情况下,一个浮点类型的字面量默认是double类型,若要声明一个常量为float类型,则需要在常量后加上f或者F,double常量后面的D或者d可省略。注意:Java只有浮点型的变量才可以接受科学计算数的结果

12.字符类型:字符、字母和符号

char类型:表示16位的无符号整数或者Unicode字符,Java对字符占用两个字节,可以表示一个汉字

什么是编码?
计算机只能表示0和1两个数,于是规定使用一个数字去表示一个特定的字符,比如a使用97表示 char前256个字符和ASICC(美国信息交互标准编码)码中的字符重复

13.基本数据类型的转换

在8大基本数据类型(byte-1字节,short-2字节,int-4字节,long-8字节,double,float,char-2字节,boolean),boolean不属于数值类型,不参与转换
字节数 byte < short(=char) < int < long < float < double (一般的byte short char不参与转换 char虽然也是2字节但是不包含负数跟short比起来数量少,因此short和char不能相互转换)
转换规则其实就是各自数据类型的空间大小,把不同的数据类型看成是不同容量的容器
自动类型转换,也称为“隐式类型转换”(从小到大)

强制类型转换(从大到小 显式类型转换):当把大范围类型的数值赋给另一个小范围变量时,此时系统不能自动完成转换,需要加上强制转换符,但这样的操作可能造成数据精度的降低或溢出,所以使用时要格外注意

byte b2 = 125; 把一个int类型常量赋值给byte类型变量,编译时,发现125在byte的范围之内,底层就会转换成byte类型的但是如果设置成byte b2 = 128; 则就会报错了

14.表达式类型的自动提升

当一个算数表达式中包含多个基本数据类型(boolean除外)的值时,整个算数表达式的数据类型将在数据运算时出现类型自动提升,其规则是:所有的byte,short,char类型自动提升到int类型 整个表达式的最终结果类型提升到表达式中类型最高的类型

String和任意数据使用,连接起来就是String(字符串)

double d2 = 123 + 1.1F + 99L + 3.14;
System.out.println(d2); // 输出226.2400061035156

System.out.println('A' + 1); // 输出66

byte b4 = 25;
// b4 = b4 + 3; // 表达式运算后已经提升到int类型了,在赋值给byte类型,编译会报错
// 为了避免这种情况 将会用到赋值运算符
b4 += 3;  // 这里就体现出了+=赋值运算符的好处了
System.out.println(b4); // 28

b4 += 3 等价于 b4 = (byte)(b4 + 3)
查看第16点笔记

15.算术运算符

取模(求余数):模数的符号忽略不计,结果的正负取决于被模数
注意:无穷大和NaN都属于double浮点类型,但是所有的正无穷大都是相等的,所有的负无穷大也是相等的,NaN永远不相等,也不等于自己

public class ArithmeticOperatorsDemo {
    public static void main(String[] args) {
        // 操作数字
        System.out.println(10 + 2); // 12
        System.out.println(10 - 2); // 8
        System.out.println(10 * 2); // 20
        System.out.println(10 / 2); // 5
        System.out.println("----------------------");
        // 操作字符
        System.out.println('A' + 'B'); // 131
        // 操作字符串
        System.out.println("AAA" + "BBB"); // AAABBB
        System.out.println("----------------------");

        System.out.println(10 / 3); // 3
        System.out.println(9876 / 1000 * 1000); // 9000
        System.out.println("----------------------");
        // System.out.println(100 / 0);  // 报错  by zero
        System.out.println(100.0 / 0); // Infinity正无穷大
        double d1 = 100.0 / 0;
        double d2 = 200.0 / 0;
        System.out.println("所有的正无穷大都相等吗?");
        System.out.println(d1 == d2); // true
        double d3 = -100.0 / 0;
        double d4 = -200.0 / 0;
        System.out.println("所有的负无穷大都相等吗?");
        System.out.println(d3 == d4); // true
        System.out.println("正无穷大和负无穷大相等吗?");
        System.out.println(d1 == d3); // false

        System.out.println(100 / 0.0); // Infinity正无穷大
        System.out.println(-100 / 0.0); // -Infinity负无穷大
        System.out.println(0.0 / 0.0); // NaN Not a Number 自己都不等于自己
        double d5 = 0.0 / 0.0;
        System.out.println(d5 == d5); // false
        // 取模(求余数):模数的符号忽略不计,结果的正负取决于被模数
        System.out.println(10 % 3); // 1

        // 自增 ++
        /*
        * ++前置情况
        *   ++a
        *   表示a变量自身先加1,再运算
        * ++后置情况
        *   a++
        *   表示a变量自身先加1,把递增1之前的原始值拿去做运算
        * */
        // --道理一样
        System.out.println("---------------");
        int a1 = 5;
        int b1 = ++a1;
        System.out.println("a1 = " + a1 + " b1 = " + b1); // a1 = 6 b1 = 6
        System.out.println("---------------");
        int a2 = 5;
        int b2 = a2++;
        System.out.println("a2 = " + a2 + " b2 = " + b2); // a2 = 6 b2 = 5
    }
}

16.赋值运算符

public class AssigningOperatorsDemo {
    public static void main(String[] args) {
        short a = 10;
        //a = a + 5; // 编译报错
        a += 5;
        // a += 5 等价于  a = (short)(a + 5);
        System.out.println(a); // 15
    }
}

17.比较运算符

==, !=, >, <, >=, <=, instanceof(检查是否是类的对象) "Hello" istanceof String true
比较运算符用于比较两个常量或者变量之间的关系,比较运算的结果都是boolean类型

18.三元运算符

三元运算符表示有三个元素参与的表达式,又称为三目运算符,其语义表示为if-else。
语法格式为:X ? Y : Z 其中X为boolean类型表达式,先计算X的值,若X计算结果为true,则整个三目运算表达式的结果是Y,否则就是Z。三目运算符结果的类型是由Y和Z决定的

19.逻辑运算符

运算符 运算 范例 结果
& AND(位与) false & true false
OR(或) false 丨 true true
^ XOR(异或) false ^ true true
! NOT(非) !true false
&& AND(短路) false && true false
丨丨 OR(短路) false 丨丨 true true

语法格式为:boolean result = 表达式A 逻辑运算符 表达式B
&:表示并且,当操作数A和B都为true结果才为true,否则结果result是false
&&:和&结果相同,具有短路效果,如果左边操作数A是false,result一定是false,且不运行B的运算
|:表示或者,当操作数A和B都为false结果才为false,只要有A或者B为true,结果result是true
||:和|结果相同,具有短路效果,如果左边操作数A是true,result一定是true,且不运行B的运算
^:判断A和B是否相同,不同则为true,相同则为false
!:取反,!true结果是false,!false结果是true

20.位运算符

运算符 描述
& 按位与
按位或
^ 异或(相同为0,不同为1)
~ 取反
<< 左移位
>> 右移位
>>> 无符号右移位

&:参与运算的两个数,若相应位数的值都为1,则该位结果值是1,否则是0.
|:参与运算的两个数相应位中只要有一个1,结果就是1.
^:参与运算的两个数相应位相同则结果为0,否则为1.
~:表示把两个二进制位的“1”换成“0”,把“0”换成1.
<<:将操作数的二进制码整体左移指定位数,左移之后的空位用“0”来补充.

:将操作数的二进制码整体右移指定位数,右移之后的空位用“符号位”来补充:
若是正数用“0”来补充
若是负数用“1”来补充(操作负数:取反,求补)

:将操作数的二进制码整体右移指定位数,右移之后的空位用“0”来补充:

二进制数a 二进制数b 与(&) 或(丨) 异或(^)
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0

boolean的true和false,在底层使用一位的1和0表示

public class BitOperatorsDemo {
    public static void main(String[] args) {
        System.out.println(3 & 5);
        System.out.println(3 | 5);
        System.out.println(3 ^ 5);
        System.out.println(~3);

        System.out.println(2 << 3);
        System.out.println(16 >> 3);
        System.out.println(-16 >> 3);
        
        // 交换两个数
        int a = 10;
        int b = 20;
        System.out.println("a = " + a + " b = " + b);
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("a = " + a + " b = " + b);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容