college java(1-4)
college java (java基础黑皮书)
第一章 java入门
java的地位
-
Java语言是一种 面向对象 的 高级 程序设计语言。
-
面向对象具有三大基本特性:封装、继承、多态
-
高级:
- 1)适合人类理解,不适合机器理解
- 2)源代码程序需翻译成低级语言程序
-
程序设计语言:
-
程序是使用编程语言来编写的
-
用来编写计算机程序的语言,通常 分为三类:机器语言,汇编语言,高级语言
-
源程序:用高级语言编写的程序称为源程序
-
目标程序:由于计算机不识别源程序,所以使用一种称为编译器 (compiler)的程序将源程序翻译成低级语言的程序, 这种低级语言程序称为目标程序
-
目标程序与其它支持库代码进行链接,从而构成可执行 文件,可执行文件就可以在计算机上运行了
-
-
-
java适用于服务器后台开发,JavaScript是java的缩版适用于网页开发
-
java版本:
- java SE(标准版):用于pc端应用
- java EE(企业版):用于企业应用
- java ME(微型版):用于移动端
java的特点与组成:
-
java 具有语法简单,面向对象,稳定,与平台无关,多线程,动态等特点
- 比C++简单:摒弃了C++里难以理解的多继承、指针等概念。
- 面向对象 : Java是面向对象的编程语言
- 平台无关:源代码程序→中间字节码文件→Java虚拟机→机器码→运行。
- 多线程 : Java的特点之一就是内置对多线程的支持。多线程允许同 时完成多个任务。
- 动态 : Java程序的基本组成单元就是类,有些类是自己编写的, 有一些是从类库中引入的,而类又是运行时动态装载的,这 就使得Java可以在分布环境中动态地维护程序及类库
-
java与其他语言相比,最大的优势是编写的软件能在执行码上兼容,在所有的计算机上兼容,之所以能做到这一点是因为java可以在计算机的操作系统上再提供一个java运行环境(Java Runtime Environment,JRE),该运行环境由java虚拟机(Java Virtual Machine,JVM),类库以及一些核心文件组成,也就是说只要平台提供了java运行环境(JRE),java编写的软件就能在其上运行
-
java虚拟机(JVM)
-
无论哪种Java开发平台都需要具有Java虚拟机 (Java Virtual Machine)
-
Java虚拟机的核心是所谓的字节码指令
-
字节码是可以被java虚拟机直接识别,执行的一种由 0,1组成的序列代码。
-
字节码不是机器指令,因为他不和特定的平台相关,不能被任何平台直接识别,执行
-
java针对不同平台提供的java虚拟机的字节码指令都是相同的,因此能够实现平台无关性,例如所有的虚拟机都将11110000识别,执行为加法操作。
-
-
与c/c++不同,java语言提供的编译器不针对特定的操作系统和cpu芯片进行编译,而是针对虚拟机把java源程序编译程被称为“字节码”(能够被虚拟机识别的)的“中间代码”。
例如:,Java源文件中的+被编译成字节码指令111000字节码是可以被Java虚拟机识别、执行的代码,即Java虚拟机负责解释运行字节码,其运行原理是:Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台运行该机器码,如下图所示。
在一个计算机上编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计
算机上直接使用。字节码由Java虚拟机负责解释运行,即Java虚拟机负责将字节码翻译成
本地计算机的机器码,并将机器码交给本地的操作系统运行 -
虚拟机负责将字节码文件(包括程序使用的类库中 的字节码)加载到内存,然后采用解释方式来执行 字节码文件。
-
运行Java程序
-
运行Java程序
-
解释执行
-
-
-
java语言的执行过程
-
java程序的开发步骤
- 编写源文件:扩展名必须是 .java。
- 编译Java源程序:用Java编译器(javac.exe)编译源文件, 得到字节码文件(* . class)。
- 运行Java程序:使用Java解释器(java.exe)来解释执行 字节码文件。
-
API
应用程序接口(API)也称为库,包含了为开发java程序而预定义的类和接口。包含在jdk
-
JDK 与 JRE
-
Java开发平台( J2SE、J2EE、J2ME )均需要相应 的开发工具包(JDK、JRE)。
-
JDK和JRE
-
JRE:Java Runtime Environment (Java运行时环境)
包含了运行Java程序的所需要的所 有组件,如JVM、动态库等。
-
JDK:Java Development Kit (Java开发工具包)
-
包含 JRE, 开发、调试所需要的各种工具、类库等
-
JDK 1.8包含有数千个类(classes),数万个方法 (methods),涵盖了 网络 , 文件IO , 桌面(Swing/AWT)系统 , 安全 , 分布式操作 , 数据库访问等
-
JDK的主要内容如下:
-
开发工具
位于bin子目录中。指工具和实用程序,可帮助开发,执行,调试以java编程语言编写的程序,例如编译器javac.exe和解释器java.exe都位于该目录中。
-
-
-
-
-
+ java运行环境
位于jre子目录中。java运行环境包括java虚拟机,类库,以及其他支持执行以java编程语言编写的程序的文件。
+ 附加库
位于lib子目录。开发工具所需的其他类库和支持文件。
+ C头文件
位于include的子目录中。支持使用java本机界面,jvm工具界面以及java平台的其他功能进行本机代码编程的头文件
+ 源代码
位于JDK安装目录之根目录中的sre.zip文件是Java核心API的所有类的Java编程语言
源文件(即java.* 、 javax.* 和某些org. * 包的源文件,但不包括com.un*包的源文件)。
+ **注意:**
+ 1)若需要开发和运行Java程序,则必须下载并安装JDK
+ 2)若只需要运行Java程序,而不开发Java程序,则只须下载并安装JRE
- JDK,JRE,JVM 的关系
简单的java程序
1.系统环境的设置
1.右键单击“此电脑”–>选择“属性”–>点击”高级系统设置”–>选择“高级”–>“环境变量”
2.配置环境变量
①新建系统变量(JAVA_HOME)
变量名: JAVA_HOME
变量值: C:\Program Files\Java\jdk1.8.0_151;(注意:此处为你的jdk安装路径)
② 新建系统变量(CLASSPATH)——CLASSPATH为java加载类(class or lib)路径。(此步一般可省略)
变量名: CLASSPATH
变量值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
注意:注意前面的点号和分号都是有的。
③编辑系统变量(PATH)——PATH使得系统可在任何路径下识别java命令。
变量名: PATH
变量值: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注:不要清空掉path中的其他环境变量)
然后点击两个确定,之前的操作也都要点击确定。
(win7下Path打开后可能不是这样的页面,打开后需要手动输入这两个变量名,每个变量名都用英文分号隔开即可)
==分割线
3.测试配置是否成功
点击"开始"—>“运行”(或按下win+R),键入"cmd";
在命令行中输入“java -version”、“java”显示如下环境就说明环境配置成功!
原文链接:https://blog.csdn.net/sinat_36264666/article/details/78571128
2源文件的编写,保存,运行
编写:
public class Hello{
public static void main(String args[]){
System.out.println("大家好");
System.out.println("我是段金龙");
Student st=new Student();
st.speak("在下无敌");
}
}
class Student{
public void speak(String s){
System.out.println(s);
}
保存:
-
用文本编辑器,如记事本打开文件,并将其另存为ANSI编码,然后执行javac Test.java即可。
-
运行时指定编码方式,使用javac -encoding UTF-8 Test.java也可以编译成功。
注意:
不适用以上保存方法会出现:
运行:
-
最多只有一个类可使用public,pubic+类 是主类
-
main方法:
- 1.main方法是java应用程序运行时的入口
- 2.解释器通过调用main方法执行程序
-
有几个类就产生几个class文件 ,编译完上文代码运行前就会产生
-
Hello.class是应用程度运行的,Hello.java还未运行可以有多个main
执行的是.class文件,之所以是java Hello是因为系统会自动加.class
有多个main的情况例如:
public class Hello{ public static void main(String args[]){ System.out.println("大家好"); System.out.println("我是段金龙"); } } class Student{ public static void main(String args[]){ System.out.println("hhhhh"); } }
结果:
执行的.class文件 有多少个main不会导致程序报错
javac.exe:是编译Java源代码的应用程序
java.exe:是解释执行Java字节码的应用程序
易错题型
1.
答案:B
解析:Java语言程序翻译成低级语言程序是.class中间字节码文件,不能直接执行,需要JVM去解释执行。
对下面的Java程序,
class PersonA {
void speakHello() {
System.out.println("nice to meet you");
}
public static void main(String args[]) {
System.out.println("you are welcome");
}
}
public class PersonB {
void speakHello() {
System.out.println("欢迎你");
}
}
class TestPerson {
public static void main(String args[]) {
System.out.println("你好");
}
}
试判断对错:
程序中有多个main方法,编译器无法找到执行入口,所以程序有错误。
答案:错误
解析:Java程序编译后,每个类产生各自独立的.class文件,执行时互不影响。
第二章 基本程序设计
java 数据类型
Java的数据类型分为两大类:基本数据类型和引用数据类型
基本数据中保存数据值,而引用类型数据中保存地址
注意:
浮点数的精度问题(浮点数的计算是近似的)
System.out.println(1.0 - 0.9); 显示的是0.09999999999999998 而不是0.1
-
整型直接量默认为是int型
System.out.println(2147483648); // 超出范围会引起编译错误
要写一个long型的整型直接量,在其后加字母L或l
因为l(L的小写)很容易与1(数字1)混淆,因此建议使用大写 L
由于2147483648超出了int型的范围,必须表示成2147483648L
System.out.println(2147483648L);//编译成功 结果2147483648
-
浮点型直接量默认为 double型
例如:5.0 被认为是 double 型而不是 float 型
可以通过在后面加字母 f 或 F 表示 float 型直接量 加 d 或 D 表示 double 型直接量
100.2f 或 100.2F 表示 float 类型的值
100.2d 或 100.2D 表示 double 类型的值
double 型的值比 float 型更精确
注意:
1)在Java中,没有byte、short型字面直接量
2)只有默认的int 、double型直接量
3)long型直接量需在数值后加 L ,float型直接量需在数值后加 F
- 科学计数法
浮点型直接量也可以用科学记数法表示,
如:
1.23456e+2 或 1.23456e2 —> 1.23456×102 —> 123.456
1.23456e-2 —> 1.23456×10-2 —> 0.0123456
e表示指数,也可以大写为E
注意:
反过来,用科学记数法表示的数值是浮点类型(double)。
例:10e2 表示 1000.0 , 而不是 1000。
- 转型
转型范围排序:double>float>long>int
隐式转型:小范围可给大范围赋值
int a=10;
double b=a;
System.out.println(b); //结果10.0
显式转型:大范围转成小范围 需要强制转型
double b=10.0;
int a=(int)b;
System.out.println(a); //结果10
- 字符串连接
若为字符串的连接时,自动把数值转换成字符串, 再进行连接
public static void main(String [] args) {
//数值与字符运算 会变成字符运算
System.out.println(1+2);
System.out.println(1+""+2);
//1与字符进行运算变成字符1 字符1与2运算同理
System.out.println(1+2+"hhh"+1+2);
System.out.println(1+2+"hhh"+(1+2));
}
运行结果:
3
12
3hhh12
3hhh3
字符串注意
1.在Java源代码中,一个字符串是不能跨行的 下面的语句会造成编译错误: System.out.println("Introduciton to java
Programming, by Y.Daniel Liang");
改正:将该字符串分成两个独立的字符串,再用+连接:
System.out.println("Introduciton to java " + “Programming, by Y.Daniel Liang”);
2.char是单引号是单个字符,String是双引号是字符串
3.字符打印出的是ASCII码与此不同
标识符
定义:
标识符是用来标识变量、常量、方法、类、对象等元素的 有效字符序列。
命名规则:
- 标识符是一个由字符、数字、下划线( _ )或美元符号($)构成 的字符串
- 标识符必须以字符、下划线(_)或美元符号($)开头,不能用 数字开头
- 标识符不能是Java保留字 和 true、false、null等字面常量
- 标识符可以有任意的长度,但实际命名不宜过长
数值运算
- 整数与整数运算,结果为整数
- 整数与浮点数运算,结果为浮点数
double b=10.0;
int a=(int)b;
System.out.println(b); //结果10.0
-
强制转换不改变被转换变量的值!
-
两数取余时,只有当被除数是负数时,余数才是负的 (其它情况均为正)
例:5%2 = 1 5%-2 = 1 -5%2 = -1 -5%-2 = -1
幂运算
幂运算使用Java API的Math类的pow方法
语法格式:Math.pow(a , b) //表示a b (double类型)
例子:
Math.pow(2, 3) //返回 8.0
Math.pow(4, 0.5) //返回 2.0
Math.pow(2.5, 2) //返回 6.25
Math.pow(2.5, -2) //返回 0.16
例子:
注:
1)由于要保留小数点后面两位,因此先乘以100,取整(截去小数部分),再除以100.0
2)由于要四舍五入,因此要先加上0.005
字符类型
通常计算机采用ASCII码(8位编码),Java支持 Unicode编码(16位编码)
Unicode 编码
- 统一码协会建立的一种16位编码方案,支持世界不同语言 的文本交换、处理和显示。
一个统一码占两个字节,书写上用以\u开头的4位十六进制数 表示,
范围从 ‘\u0000’ 到 ‘\uFFFF’,共65536个
包括ASCII码(从’\u0000’到’\u007F’对应的128个字符)
- 字符与字符串的区别
System.out.println("3");
System.out.println('3');
结果都是 3 无区别
System.out.println( 2 + "3");
System.out.println( 2 + '3');
结果为: 23 53
即在字符运算时是以其ASCII码进行数值运算
总结
1.字符型在直接输出时
System.out.println('S'); //结果为字符 仍是
2.字符与字符比较时,是按照Unicode码进行比较
3.字符与数字运算时会用其Unicode码
System.out.println( 2 + '3'); //结果为53
- 特殊字符转义含义
获取输入
public class ScannerInput {
public static void main(String [] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入整数:");
int intinput=scanner.nextInt();
System.out.println("你输入了:"+intinput);
System.out.println("请输入浮点数:");
double doubleinput=scanner.nextDouble();
System.out.println("你输入了:"+doubleinput);
System.out.println("请输入字符串:");
String stringinput=scanner.next();
System.out.println("你输入了:"+stringinput);
}
}
结果:
第三章 选择
基本控制结构
-
顺序结构:就是按照语句的书写顺序从上到下、逐条语 句地执行。执行时,排在前面的代码先执行,排在后面 的代码后执行。
-
选择结构:是根据条件来判断并选择执行语句的结构, 也称分支结构。
-
循环结构:重复执行某一部分代码,即利用计算机高速 处理的特性,完成大量有规则的重复运算
逻辑运算符
逻辑运算符 (logical operator)又称为布尔运算符(boolean operator )
-
连接的操作数具有布尔值(true or false)
-
运算结果:得到新的布尔值
java 运算符优先级
Switch
char grade ; // 学生的等级
String range = ""; //成绩范围 (需要初始化!)或者在在default中赋值
grade = ; //给等级赋值
switch( grade ){
case 'A': range= "90~100";
break;
case 'B': range= "80~89";
break;
case 'C': range= "70~79";
break;
case 'D': range= "60~69";
break;
case 'E': range= "0~59";
break;
default: range = "bad grade";
}
System.out.print("grade: "+ grade +", rang: "+ range);
条件表达式
条件表达式:基于一个条件来计算表达式的值
条件运算符又称为“三元运算符” ,是Java中唯一 的一个三元运算符
语法格式:
(booleanexp) ? exp-for-true : exp-for-false
例子:
假设数值型变量num1和num2,输出较大值
if(num1 > num2){
System.out.println(num1);
}
else {
System.out.println(num2);
}
等价于
System.out.println( (num1 > num2)? num1:num2 );
闰年代码
四年一闰,百年不闰,四百年再闰。
import java.util.Scanner;
public class LeapYearVerifier {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入年份:");
int year=scan.nextInt(); //获取输入值
boolean ifLeapYear=(year%4==0&&year%100!=0)||year%400==0;
System.out.print(year+"是否是闰年?");
System.out.println(ifLeapYear);
}
}
结果
注意
2000年虽然被100整除使得"||"前的表达式为假但是2000年又被400整除,“||”只要有一真则真
易错题型
- 编写一个赋值语句,当变量num的值在1到100之间 时,将变量flag赋值为true,否则赋值为false。
flag = ( (num >= 1) && (num <= 100) ) ;
- 编写一个赋值语句,当变量num的值在1到100之间, 或者为负时,将变量flag赋值为true,否则赋值为 false。
flag = ( ( (num >= 1) && (num <= 100) ) || (num < 0) );
- 为|x-5| < 4.5 编写一个布尔表达式。
( ( x – 5 ) > ﹣4.5 ) && ( ( x – 5 ) < 4.5 )
- 为|x-5| > 4.5 编写一个布尔表达式。
( ( x – 5 ) < ﹣4.5 ) || ( ( x – 5 ) > 4.5 )
-
将下列布尔表达式改写成等价的其它形式:
( x != 1 ) && ( x != 2 ) && ( x != 3 )
! ( ( x == 1 ) || ( x == 2 ) || ( x == 3 ) )
- 执行下列switch语句之后,x 、y 的值分别是多少?
int x = 3, y = 3;
switch(x+3){
case 6: y = 1;
default: y += 1;
}
x=3,y=2;
使用if-else语句改写上面swtich语句
提示:没有break,(x+3) == 6时需要执行到底
if((x+3) == 6){
y = 1;
y += 1;
}
else {
y += 1;
}
第四章 数学函数,字符,字符串
数学函数
java常用数学函数
- Java语言提供Math类(包含在Java.lang包中,隐式导入)
- Math类包含完成基本数学函数所需的方法。
- 三类:三角函数方法、指数函数方法和服务方法。
- 其中服务方法包含取整、求最小值、最大值、绝对值和 随机值
- 在Math类中定义了两个double型常量:PI 和 E
- PI就是π的值,而E即e指数底的值,分别是: 3.141592653589793 和 2.718281828459045
- 在程序中可以直接使用 Math.PI 和 Math.E
三角函数
弧度与三角度数
- 弧度制:用弧度作单位来度量圆心角的制度
- 1弧度的角:等于半径长的圆弧所对的圆心角。 (即弧长等于半径的弧,其所对的圆心角为1弧度)
- 弧度制:是用弧的长度来度量圆心角的一种方法
- 弧度制的基本思想:使圆周长与圆半径具有同一的度量单 位,然后用弧长与圆半径之比来度量角度。 ( 即 弧度 = 弧长 / 半径 )
- 圆的一周,弧度数:2πr / r = 2π 角度数:360度,则 2π弧度 = 360度;所以:1角度 = π/180 弧度 1弧度 = 180/π角度(1弧度约为57.3°)
- 由圆心角计算弧长:弧长 = nπr/180(n为圆心角度数) (即圆心角n所对应的弧长)
例子
指数函数
e是指数e
取整函数
例子
最大值、最小值、绝对值
-
求最小值:Math.min( a , b )
-
a、b 可以是int 、long 、 float 或 double 类型
-
返回值的类型为 a、b 的类型中较大的一个
-
-
求最大值:Math.max( a , b )
-
a、b 可以是int 、long 、float 或 double 类型
-
返回值的类型为 a、b 的类型中较大的一个
-
-
求绝对值:Math.abs( a )
- a 可以是int 、 long 、 float 或 double 类型
- 返回值的类型与 a 的类型相同
随机值
-
Math.random():
- 获取区间[a, b) 内的一个随机整数:
(int)( a + Math.random( ) *(b - a) )
- 获取区间 a ~ b 之间的一个随机整数:
(int)( a + Math.random( ) *(b – a + 1) )
-
random.next…():
- 获取区间[a, b) 内的一个随机整数:
a+ran.nextInt(b-a)
- 获取区间 a ~ b 之间的一个随机整数:
a+ran.nextInt(b-a+1)
字符类型的操作
Unicode 编码 n 由统一码协会建立的一种16位编码方案,支持世界不同语言 的文本交换、处理和显示。 n 一个统一码占两个字节,书写上用以\u开头的4位十六进制数 表示
范围从 ‘\u0000’ 到 ‘\uFFFF’,共65536个 包括ASCII码(从’\u0000’到’\u007F’对应的128个字符)
字符类型与数值类型的转换
-
字符类型可以转换成任意的数值类型
- 隐式转换(当转换结果适用于目标变量)
byte x = 'a'; // 'a'的Unicode码是97,在byte和int范围内 int y = 'a'; // x、y 的值均为97
- 显式转换(即强制转换,当转换结果不适于目标变量时)
byte x = '\u0101'; //不正确, '\0101'的Unicode码超出byte的范围 byte y = (byte) '\u0101'; //正确,截取低8位,即0x01,y的值为整数1
-
任意的数值类型可以转换成字符类型
- 隐式转换(当转换结果适于char类型时)
char ch1 = 97; // ch1的值为'A' char ch2 = 0x41; // ch2的值为'A'
- 显式转换(即强制转换,当类型不匹配或数值超出char类型的范围时)
char x = (char)50.25; //正确,截取整数值50,x的值为字符 '2' char y = (char)0xF0041; //正确,截取低16位,y的值为字符 'A'
参与数学运算时,字符型数据会自动转换成数值(ASCII码)
Character类字符判别方法
字符串
从字符串中获取字符
- 使用 charAt ( index ) 方法
例如:
String message = "Hello,World";
message.charAt(5); // 返回 ","
- 索引从 0 开始,到 message.length( ) - 1
- 注意,不能使用数组下标,如 message[5](错)
连接字符串
两种方法:
- 字符串直接相加 (用"+")
String str1 = "Hello";
String str2 = "World";
String str3 = str1 + str2;//str3: "HelloWorld"
str1的值不变
- 使用 String 的 concat 方法
String str1 = "Hello";
String str2 = "World";
String str4 = str1.concat(str2); //str4: "HelloWorld"
str1的值不变
- 多个字符串相加,支持连写:
String str5 = str1 + str2 + str3 + str4;
String str6 = str1.concat(str2).concat(str3).concat(str4);
字符串的转换与比较
字符串的转换
- 一旦字符串被创建之后它的内容就不能改变。可以使用字符串转换方法将字符串转换为新字符串(但是原来的不变)
- 常用的转换方法有:
- 例子
"Hello,world".toLowerCase() 得到新字符串"hello,world"
"Hello,world".toUpperCase() 得到新字符串"HELLO,WORLD"
" Hello world ".trim() 得到新字符串"Hello world"
String的比较方法
**字符串比较之compareTo方法 **
注意:
>、>=、<、<= 等比较运算符只能比较两个字符不能比较两个字符串
**compareTo方法 **
注意:只比较到可比较的第一个字符 后面的不管
例如:
String str1 = new String("Hello,Wo");
String str2 = "Hello,wO";
System.out.println(str1.compareTo(str2));
结果为:-32
str1<str2 即使w后的o大于O依旧不管甚至多几个字母结果依然是-32
获取,查找,替换子字符串
substring 方法(获取)
-
public String substring( int beginIndex , int endIndex )
注: beginIndex: 开始点的索引,包含本字符(索引起始为0) endIndex: 结束点的索引,不包含本字符 得到从 beginIndex 到 endIndex - 1 之间的子串。
-
public String substring( int beginIndex )
注: beginIndex: 开始点的索引,包含本字符 得到从 beginIndex 开始直到字符串结束的字
indexOf 方法(查找)
replace 方法(替换)
实例
数字字符串与数值间的转换
-
数字字符串转换为数值
- 数字字符串 -> int
Integer. parseInt(String)
- 数字字符串 -> float
Float. parseFloat(String)
- 数字字符串 ->double
Double. parseDouble(String)
注意:int 、double 是基本数据类型;Integer、Double是对象(引用类型) 若字符串不是数值字符串,则会导致运行错误,
如: int intValue = Integer.parseInt(“8abc”); // 运行错误!
-
数值转换为数字字符串
- 将数值与一个空字符串连接
20.5 + "" ; "" + 20.5 ;// 得到"20.5"
- 用 String 类中的 valueOf 方法
String.valueOf( a ),a 可以是任意的数值 、字符 或 字符串
String value1 = String.valueOf(12); // int ->String:"12" String value2 = String.valueOf(12.0); // double -> String:"12.0" String value3 = String.valueOf('9'); // char -> String:"9" String value3 = String.valueOf('c'); // char -> String:"c"