初识Java
大一时候就看过毕向东老师的Java基础教程,感觉毕老师讲课清晰易懂,幽默风趣。当初看该系列课程时并没有完全看完,只看了部分基础课程,而且过去这么长时间,Java基础知识也忘了十之八九,因此决定重新看看毕老师的Java基础全套教程。感觉收获颇丰,现将一些我认为重要知识点进行相关记录。
1、Java语言概述
Java是一门面向对象的编程语言,其吸收了C++语言的各种优点,还把C++里难以理解的多继承、指针等一系列概念摒弃掉。其功能强大,简单易用、可跨平台。其有三种技术架构:JAVAEE(企业版)、JAVASE(标准版)、JAVAME(小型版)。
2、Java语言的环境搭建
(1)JRE、JDK
JRE(Java Runtime Environment.Java 运行环境),包括Java虚拟机(JVM:Java Virtual Machine)和Java程序所需要的核心类库。计算机中安装JRE即可运行开发好的Java程序。
JDK(Java Development Kit,Java开发工具包)JDK是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括JRE。因此安装JDK便不需要再单独安装JRE。(开发工具包括编译工具:java.exe和打包工具:jar.exe等)。
JRE = JVM+类库
JDK:JRE+JAVA开发工具
(2)JDK的安装
1、下载JDK:链接.
2、安装JDK以及配置环境变量:安装细节
3、为什么要配置环境变量:
当在DOS命令行窗口输入一条命令试图运行某一应用程序时会检查当前目录下是否存在这一应用程序,若不存在则会去系统已有的path环境变量中继续去查找这一应用程序。因此需要配置环境变量,让java的一些工具可以在任何地方都可以被访问到。
4、检查JDK是否安装成功:在DOS命令窗口输入java -version 若输出java的version则安装配置成功。
3、 Java程序开发
(1) Hello World
在学习一门新的计算机编程语言时候,我们一般在最开始接触到的程序就是Hello World程序。接下来我们开始编写第一个Java程序。
其共分为一下三个步骤:
1、将Java代码编写到扩展名为.java的文件中;
2、通过javac命令对该Java文件进行编译;
3、通过java命令对生成的class文件进行运行。
Hello.java
.
class Demo{
public static void main(String[] args){
System.out.println("Hello World");
}
}
保存这段代码到Hello.java文件
进入DOS命令行窗口(Win+R输入cmd回车)
进入到Hello.java文件所在的目录下
输入javac Hello.java
输入java Demo
DOS窗口就会输出Hello World
至此,完成第一个Java程序。
2018.11.24
(2) 基本语法
1、Java语言基础组成
- 关键字
- 标识符
- 注释
- 常量以及变量
- 运算符
- 语句
- 函数
- 数组
接下来详细介绍一下其中几个重要的点。
关键字:事先定义好的、有特别意义的标识符,有时也叫保留字。关键字不能用作变量名、方法名、类名、包名和参数。Java中的关键字有:abstract、for、int、import等,关键字都是小写。
标识符:在程序中自定义的一些名称。由26个英文字母的大小写,数字0-9以及_和$组成。数字不可以用来做标识符的开头。Java语言严格区分大小写,因此要特别注意,而且标识符尽量要做到见名知意。
Java注释
//单行注释,多种计算机语言适用
/*
多行注释
多种计算机语言都适用
*/
/**
*文档注释,
*Java语言特有
*/
常量和变量
1、常量表示不能改变的数值,Java中常量有整数常量、小数常量、布尔型常量、字符常量、null常量(只有null)。
对于整数有四种表现形式:二进制(满2进1)、八进制(满8进1,0开头)、十进制(满10进1),十六进制(满16进1,0X开头)。
2、变量:内存中的一个存储区域,该区域有自己的名称(变量名)和类型(数据类型),该区域的数据可以在该数据类型范围内不断变化。
定义变量的方式:数据类型 变量名 = 初始化值; 例如 int a = 0;
数据类型
类型转换
1、自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换从低级到高级为:
byte,short,char->int->long->float->double。
进行类型转换是需要满足规则:
- 不能对boolean类型进行类型转换;
- 不能把对象类型转换为不相关类的对象;
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
- 转换过程中可能会导致溢出或者损失精度。
2、强制类型转换
- 转换的数据类型必须是兼容的;
- 格式:(type) value //type是要强制类型转换后的数据类型。例如:
Demo.java
.
class Demo{
public static void main(String[] args){
int a = 123;
int c = 257;
byte b = (byte)a;
byte d = (byte)c;
System.out.println(b);//123
System.out.println(d);//1,因为byte型数据的最大值为127
}
}
3、隐含强制类型转换
- 整数默认类型是int
Demo.java
.
class Demo{
public static void main(String[] args){
byte a = 4;
byte b = 3;
byte c = 7;
a = b+c;
System.out.println(a);//提示错误。因为整数默认类型是int
}
}
运算符
Java有六种运算符,包括算术运算符:[+,-,、*,/,%,++,- -];赋值运算符:[=,+=,-=,*=,/=,(%)=,<<=,>>=,&=,^=,|=];比较运算符:[>,<,==,!=,>=,<=,instanceof];逻辑运算符:[&&,||,!];位运算符:[&,|,^,~,<<,>>,>>>]以及三元运算符:[(条件)?表达式1:表达式2]。
程序流程控制
- 判断结构
- 选择结构
- 循环结构
if语句
//三种格式
//1
if(条件表达式){
执行语句;
}
//2
if(条件表达式){
执行语句;
}else{
执行语句;
}
//3
if(条件表达式){
执行语句;
}else if(条件表达式){
执行语句;
}
...
else{
执行语句;
}
switch
switch(表达式){
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
...
default:
执行语句;
break;
}
while
while(条件表达式){
执行语句;
}
do while
do{
执行语句;
}while(条件表达式);
//无论条件是否满足,循环体至少执行一次
for
for(初始表达式;循环条件表达式;循环后的操作表达式){
执行语句;
}
//初始化表达式只读一次,之后判断是否满足循环条件,满足则执行循环体,否则跳出循环,执行完循环体后执行循环后的操作表达式,然后再判断循环条件,如此循环往复。
break\continue
break//跳出。应用于选择结构和循环结构。
continue//继续。应用于循环结构
//这两个语句单独存在下面不可以有语句,因为执行不到,continue语句结束本次循环继续下次循环。
2018.12.1
函数
函数是定义在类中的具有特定功能的一段独立小程序,也称为方法。函数的格式一般为:
修饰符 返回值类型 函数名(参数类型 形参1,参数类型 形参2,...){
执行语句;
return 返回值;
}
/*返回值类型:函数运行后结果的数据类型;
参数类型:形参的数据类型;
形参:变量,用于存储调用函数时传递给函数的实参;
实参:传递给形参的具体数值;
return 用于结束函数;
返回值:函数运算后的结果,该结果会返回给调用者。没有具体返回值时return后面直接用分号结束,返回值类型为关键字void。
*/
//返回和值的参数
public static int add(int a,int b){
return a+b;
}
函数的特点
- 定义函数可以将功能代码进行封装;
- 便于对该功能进行复用;
- 函数只有被调用才会被执行;
- 函数的出现提高了代码的复用性;
- 对于函数没有具体返回值的情况,返回值类型用关键字void表示,该函数中的return语句如果在最后一行可以省略不写;
- 函数中只能调用函数,不可以在函数内部定义函数;
- 定义函数时,函数的结果应该返回给调用者,交由调用者处理。
函数的重载
在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可,重载与返回值类型无关,只看参数列表,重载可以方便阅读,优化程序设计
//返回两个整数的和
int add(int x,int y){
return x+y;
}
//返回三个整数的和
int add(int x,int y,int z){
return x+y+z;
}
//返回两个小数的和
double add(double x,double y){
return x+y;
}
数组
同一种类型数据的集合,数组就是容器。数组可以自动给数组中的元素从0开始编号,方便操作。数组定义有两种格式
//格式1
//元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
int[] arr = new int[5];
//格式2
//元素类型[] 数组名 = new 元素类型[] {元素1,元素2,....}
int[] arr = new int[]{1,3,5,7};
int[] arr = {1,3,5,7};
内存的划分
- 寄存器
- 本地方法区
- 方法区
- 栈内存(存储的都是局部变量,变量所属作用域结束,变量自动释放)
- 堆内存[存储的是数组和对象(数组就是对象)凡是new建立在堆中,
每一个实体都是首地址值;
堆内存中的每一个变量都有默认初始化值,根据类型不同而不同,整数是0,小数是0.0或者0.0f,boolean是false,char是’\u0000’;
垃圾回收机制。
]
int[] arr = new int[3];
//System.out.println(arr[3]);ArrayIndexOutOfBoundsException
//当访问到数组中不存在的角标时,就会发生该异常。
//arr = null;
//system.out.println(arr[0])
//NullPointerException
//当引用型变量没有任何实体指向时,还在用其操作实体。就会发生该异常
2018.12.9
- 如果数据出现了对应关系,而且对应一方是有序的数字编号,并作为角标使用,要想到数组的使用。可以将这些数据存储到数组中,根据运算的结果作为角标直接去查数组中对应的元素即可。查表法
//查表法进制转换
public static void toHex_1(int num){
if(num==0){
System.out.println("0");
return;
}
//对应关系表
char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] arr = new char[8];
int pos = arr.length;
while(num!=0){
int temp = num&15;
arr[--pos] = chs[temp];
num = num>>>4;
}
System.out.println("pos="+pos);
for(int x=pos;x<arr.length;x++){
System.out.print(arr[x]);
}
}
二维数组
二维数组的定义方式
//格式1
int[][] arr = new int[3][2];
//打印二维数组的长度,即一维数组的个数
System.out.println(arr.length);
//打印二维数组中角标为1的一维数组的长度
System.out.println(arr[1].length)
//格式2
int[][] arr = new int[3][];
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
4、 面向对象
(1) 、面向对象的概念
两种很重要的思想,面向过程思想和面向对象思想:面向过程强调的是过程(动作);面向对象强调的是对象(实体)。C语言就是面向过程的,而C++、Java以及C#是面向过程的。
面向对象是一种常见的思想,符合人们的思考习惯;面向对象将复杂的问题简单化;让曾经在过程中的执行者变为了对象中的指挥者。
(2) 、类与对象之间的关系
用Java语言对现实生活中的事物进行描述,通过类的形式来体现。对事物描述通常只关注两方面,一个是属性另一个是行为。成员函数对应行为,成员变量对应属性。只要明确该事物的属性和行为并定义在类中即可。对象其实就是该类事物实实在在存在的个体。
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类,对象的抽象是类,类的具体化就是对象
成员变量与局部变量的区别
- 成员变量定义在类中,整个类都可以访问,局部变量定义在函数、语句、局部代码块中,只在所属区域有效;
- 成员变量存在于对内存的对象中,局部变量存在于栈内存的方法中;
- 成员变量随对象的创建而存在,随对象的消失而消失,局部变量随所属区域的执行而存在,随所属区域的结束而释放;
- 成员变量都有默认的初始化值,局部变量没有默认初始化值;
2018.12.16