前言:
一:java常用命令及作用
盘符 切换到某个盘下: D:
dir:常看当前路径下的文件信息
cd:进入单级目录:cd itheima
进入多级目录:cd D:\ithelma\javase\diyitian
回到上一级目录:cd..
回退到盘符根目录:cd\
cls :清屏
上下键 :查找敲过的命令
tap:自动补齐命令(不见得正确,谨慎使用)
二:第一个java程序
HellowWorld
public class HellowWorld{
public static void main(string[] args){
System.out.println("HellowWorld");
}
}
正文:
一:
1.1java特性:
跨平台性 多线性 安全性 面向对象 简单性 高性能 分布式 健壮性
1.2运行机制
编译型+解释型
源文件>java编译器>字节码文件>类装载器>字节码校验器>解释>系统平台
虚拟机(JVM)运行环境(JRE)JDK:包括java虚拟机,库函数,运行Java必须的文件等
三者关系:JDK 包含 JRE 包含 JVM
JDK安装 环境变量Path设置
1.3第一个Java程序详解
1: java对大小写敏感。
2:关键字public:访问修饰符,用于控制程序的其他部分对这段代码的访问级别
3:class:类;Java是面向对象的语言,所有代码必须位于类里面
4:Java中,用花括号{}划分程序的各部分,任何方法的代码都必须以“{”开始,以“}”结束
5:一个源文件可以包含多个类,但一个源文件只能声明一个public类,源文件名必须和其中定义的public类名相同,且以“.java"为扩展名
6:main方法是Java应用程序的入口方法,他有固定书写格式
7:每个语句以分号结束,一个语句可以跨多行
注意:缩进规范 英文符号
二 数据类型与运算符
2.1注释
单行注释:以”//“开头,”//“后单行注释内容均为注释
多行注释:以“/*”开头,以“*/”结尾
文档注释:以“/**”开头,以“*/”结尾
2.2标识符
使用规范:
1:字母 下划线 美元符开头,其他部分可以是上面三个与数字的任意结合
2:大小写敏感 长度无限制
3:不可以是Java的关键字
4:类名标识符:首字母大写
方法与变量:首字母小写,从第二个单词开始首字母可以大写
注意:Java采用unicode国际字符集,字母含义不仅是英文还包括汉字
2.3关键字
class if new static public 等
2.4变量:可操作的存储空间
可以通过变量名来访问和改变
java是强类型语言,每个变量都必须声明其数据类型
变量的数据类型决定变量占存储空间的大小
变量包括:变量名,变量类型,作用域(只有在声明与初始化后才能使用)
2.4.2变量分类
局部变量:方法块或语句块内定义,使用时,必须先声明,初始化再使用
成员变量:方法外部,类内部定义,从属于对象,会自动赋值初始化
int double类赋值为0 char类赋值为“\u0000" boolean类赋值为false
静态变量:使用static定义,从属于类
2.5常量
主要利用关键字final来定义
常量一旦被初始化后不能再更改其值
声明格式:final type varname=value
建议:变量常量命名规范
1:所有变量常量名,方法 类名 见名知意
2:变量 方法名首字母小写
3:常量 类名 首字母大写
2.6基本数据类型
Java四大数据类型分类
1、整型
byte 、short 、int 、long
2、浮点型
float 、 double
3、字符型
char
4、布尔型
boolean
二、八种基本数据类型
三、数据类型详细介绍
1:整型(byte、short、int、long)
虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。
byte 的取值范围:-128~127(-2的7次方到2的7次方-1)
short 的取值范围:-32768~32767(-2的15次方到2的15次方-1)
int 的取值范围:-2147483648~2147483647(-2的31次方到2的31次方-1)
long 的取值范围:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
由上可以看出 byte、short 的取值范围比较小,而long的取值范围时最大的,所以占用的空间也是最多的。int 取值范围基本上可以满足我们的日常计算需求了,所以 int 也是我们使用的最多的一个整型类型。
2:浮点型(float、double)
float 和 double 都是表示浮点型的数据类型,它们之间的区别在于精确度的不同。
float(单精度浮点型)取值范围:3.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方)
double(双精度浮点型)取值范围:1.797693e+308~4.9000000e-324(同上)
double 类型比float 类型存储范围更大,精度更高。
通常的浮点型数据在不声明的情况下都是double型的,如果要表示一个数据时float 型的,可以在数据后面加上 "F" 。
浮点型的数据是不能完全精确的,有时候在计算时可能出现小数点最后几位出现浮动,这时正常的。
3:字符型(char)
char 有以下的初始化方式:
char ch = 'a'; // 可以是汉字,因为是Unicode编码
char ch = 1010; // 可以是十进制数、八进制数、十六进制数等等。
char ch = '\0'; // 可以用字符编码来初始化,如:'\0' 表示结束符,它的ascll码是0,这句话的意思和 ch = 0 是一个意思。
Java是用unicode 来表示字符,“中” 这个中文字符的unicode 就是两个字节。
String.getBytes(encoding) 方法获取的是指定编码的byte数组表示。
通常gbk / gb2312 是两个字节,utf-8 是3个字节。
如果不指定encoding 则获取系统默认encoding 。
4:布尔型(boolean)
boolean 没有什么好说的,它的取值就两个:true 、false 。
2.7运算符
Java 中常用的运算符:
算术运算符
赋值运算符
比较运算符
逻辑运算符
条件运算符
2.7.1
算术运算符:+、-、*、/、%、++、--
+:加法,如1+2=3;
-:减法,如3-2=1;
*:乘法,如2*2=4;
/:除法,如4/2=2;
%:取余,如4%3=1;
++:自增1,如int i=1,i++;
--:自减1;如int i=2,i--。
2.7.2
赋值运算符:=、+=、-=、*=、/=、%=
=:赋值,如c=a+b即将把a+b得到的值赋给c;
+=:加等于,如a+=b等价于a=a+b;
-=:减等于,如a-=b等价于a=a-b;
*=:乘等于,如a*=b等价于a=a*b;
/=:除等于,如a/=b等价于a=a/b;
%=:模等于,如a%=b等价于a=a%b。
2.7.3
比较运算符:>、<、>=、<=、==、!=
>:大于,如a=1,b=2,a>b为false;
<:小于,如a=1,b=2,a<b为true;
>=:大于等于,如a=1,b=2,a>=b为false;
<=:小于等于,如a=1,b=2,a<=b为true;
==:等于,如a=1,b=2,a==b为false;
!=:不等于,如a=1,b=2,a!=b为true;
>、<、>=、<=只支持左右两边操作数是数值类型;
==、!=两边的操作数既可以是数值类型,也可以是引用类型。
2.7.4
逻辑运算符:&&、||、!、^
&&:与,如a&&b,若a与b都为true,则返回true;
||:或,如a||b,若a与b任一为true,则返回true;
!:非,如!a,若a为false,则返回true,即取反;
^:异或,如a^b,若a与b有仅有一个为true,则返回true。
2.7.5
条件运算符:(?:)(也叫三目运算符)
结构:布尔表达式a ? 表达式b :表达式c
为a为true,则取值b;若a为false,则取值c。
2.7.6
位运算符
按位与 异或 取反(-) 左移(<<) 右移(>>)
2.7.7
字符串连接符
+
2.7.8
运算符的优先级:(如下图
2.8.1 自动转换类型:
(int)x
注意:操作数大时,;留意是否溢出
三 结构
3.1 选择结构
if
if-else
if-else-if-else
switch
补充:math.radom :返回0-1间随机数
3.1.2
if-else
补充:math类
3.1.3
if-else if-else
3.1.4
switch(表达式){
case 1:语句序列1;
[break]
……
default:默认语句;}
3.2循环结构:当型 直到型
3.2.1 while(条件){
循环体
}
3.2.2for与do while(先执行,后判断)
do{
循环体
}while(条件)
3.2.3 for
for循环 =while循环 但for更简洁
”,“在for里分隔不同变量
for( ;;)=while(true)
for里的i不能在外边使用
3.2.4嵌套循环
3.2.5 break与continue
break:强制退出循环
continue;跳出本次循环
3.2.6带标签的break continue
continue outer(内循环跳外循环)
outer:
continue outer
3.3语句块
{ …… }
3.4方法:一段用来完成特定功能的代码片段(类似于c和c++的函数)
声明:[修饰符1.修饰符2……]返回值类型 方法名(形参列表)
{java语句}
调用方法:
对象名.方法名(实参列表)
详细说明:
1:形参:在声明时用于接收外界传入的数据
2:实参:调用方法时实际传给方法的数据
3:返回值:方法在执行完毕后返回给调用它的环境的数据
4:返回值类型:事先约定好的返回值的数据类型。如无返回值,必须显示指定为void
注意:实参类型的数目与次序要和形参匹配
3.5方法的重载:实际是完全不同的方法只是名称相同
条件:形参的类型、个数、顺序不同
只有参数名不同或返回值不同不构成方法的重载
3.6递归结构:”自己调用自己“
定义递归头:什么时候不调用自身方法,没有头就会变成死循环
递归体:什么时候调用自己
四 面向对象
4.1面向对象与面向过程
面向对象就是制造汽车前需要画的图纸,要考虑一辆汽车包括那些组成成分
面向过程就是制造汽车时的步骤,第一步,第二步等等
面向对象与面向过程并不是互相独立的
4.2对象的进化史(这不重要)
4.3对象与类
对象:object.instance
类:class:1、属性 2、方法
创建一个对象:SxtStu stu=new SxtStu (通过构造方法来实现)
4.4面向对象内存分析(这有助于加深对编写程序的理解)
java虚拟机内存:
1:栈:方法执行内存模型 先进后出,后进先出(先执行的方法先占用存储空间,后执行的后占用,等到程序结束,先取消后执行的方法的内存,再取消先执行的方法的内存) 连续空间
2:堆:存储创建好的对象和数组 JVM是有一个堆,被所有线积共享 堆是不连续的内存空间,分配灵活,速度慢
3:方法区:用于存储类,常量相关的信息 存放程序中永远不变的量
(方法区属于堆,也就是说内存只被分为两块)
4.5构造方法:用于对象初始化
1:通过new关键字调用
2:有返回值,但不能确定类型,不能使用return返回某个值
3:如果没有定义构造方法,编译器会自动加一个无参的构造函数,已定义则不会自动添加
4:构造器的方法名要与类名一致
4.6构造方法重载(详细条件请见方法的重载)
4.7垃圾回收机制:发现无用对象然后回收空间
相关算法:引用计数算法 引用可达法(根搜索算法)
4.7.2分代垃圾回收机制(这也不重要)
4.7.3JVM调优,FullGC(不重要加一)
4.7.4内存泄露(不重要加二)
4.8 this关键字:创建好的对象的地址
1:在程序产生二义性之处,应使用this来指明当前对象,普通方法中,this总是指向调用该方法的对象,构造方法中,this总指向正要初始化的对象
2:使用this调用重载的构造方法时,要避免相同的初始化代码,但只能在构造方法中用,并且必须位于构造方法的第一句
3:this不能用于static方法中
4.9 static关键字
在类中,用static声明的成员变量为静态成员变量,也称类变量,类变量的生命周期和类相同
static修饰的成员变量和方法,从属于类,普通变量和方法从属于对象。
4.10 静态初始化块:用于类的初始化操作。在静态初始化块中不能直接访问非static成员
注意:静态初始化块执行顺序
1、上溯到object类,先执行object的静态初始化块,在向下执行子类静态初始化块,直到我们的类的静态初始化为止
2、构造方法执行顺序同上
4.11
参数传值机制:在java方法中,所有参数都是值传递,但引用类型指的是”对象的地址“。
4.12包:包对于类,相当于文件夹对于文件的作用
4.13 package
1、通常是类的第一句非注释语句
2、包名:域名倒写即可,再加上模块名,便于内部管理类
注意:写项目,要加包
com.gao与com.gao.car,这两个包没有包含关系,是两个独立的包
4.13.1JDK中的主要包(不是很重要)
4.13.2 import详解 静态导入详解
import cn.sxt.oo.User
import cn.sxt.oo.*(降低编译速度)
导入两个及以上,遇到同名的情况,直接指名
4.13.3 静态导入:导入类的静态属性
import static java.lang.Math.*
import static java.lang.Math,PI
5.1.1继承的实现:extends关键字
class Student extends Person {
}
5.1.3继承使用要点(关于5.1.2我也不知道为啥我手写的笔记上没有,可能跟其他章节融了?)
1、父类也称作超类 基类 派生类
2、Java中只有单继承没有多继承,因为会造成程序混乱
3、java中类无多继承,接口有多继承
4、子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得就可以直接访问
5、如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object
tips:可以使用ctrl+T方便查看继承层次
5.1.2 intance of 运算符:左边是不是右边的对象(5.1.2原来在这里,呦吼)
5.1.4 方法的重写:override:子类通过重写父类的方法,可以用自身行为替换父类行为(简单来说就是你从那你父亲那继承了一个房子,但你觉得不满意或者不想住,自己又重新买了一个)
要点:1、“”==“:方法名,形参列表相同
2、”<=":返回值类型和声明异常类型,子类要小于等与父类
3、“>=":访问权限,子类大于等于父类
5.2.1Object类基本特性:是所有Java类的根基,也就意味着所有的Java对象都拥有Object类的属性和方法
5.2.2to String方法:打印一个对象,调用to String
to String(){return get class().getName+"@"+Integer to HexString (hashCode)};返回类名加地址
5.2.3 ”==“与equals方法的辨析
”==“:代表比较双方是否相同 equals方法:对象内容相等
5.3super关键字:直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法和属性
5.3.1 继承树追溯:构造方法第一句总是:super(......)来调用父类对应的构造方法
5.4.1封装的作用与含义:让代码都收束起来,看起来变得更简洁,更安全等
5.4.2封装的实现——使用访问控制符
private:表私有,只有自己类能访问
default:表没有修饰符修饰,只有同一个包的类能访问
protected:表可以被同一个的类及其他包中子类访问
public:表示可以被该项目的所有包中的所有类访问
5.4.3封装使用细节
1、类的属性一般用private
2、提供相应get/set方法来访问属性,这些方法通常是public修饰(Boolean变量get方法是is开头)
3、一些只属于本类的辅助性方法可以用private修饰,希望可以让其他类调用 的用public修饰
Java Bean:属性与其set\get方法
5.5多态:同一方法,不同对象会有不同的行为
要点:1、多态是方法的多态,不是属性的多态
2、多态的存在要有三个必要条件:继承,方法重写,父类引用指向子类对象
3、父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了
5.6对象的转型(casting)
自动向上转换 强制向下转换
注意:java..lang.class.cast.exception:类型转换错误
5.7final关键字
1、修饰变量:被修饰的变量不可改变,一旦赋值就不能改 final int Max speeo=120
2\修饰方法;该方法不能被子类重写,但可被重载
final void study(){ }
3、修饰类:修饰的类不能被继承
final class A{ }
7.1数组的概述和特点
数组是相同类型数据的有序集合,每个元素可通过一个索引(下标)来访问他们
特点:1、长度确定
2、元素必须是相同类型
3、数组类型可以是任何数据类型,包括基本类型和引用类型
说明:数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
7.2.1数组声明
1、type[] arr-name; int[] arr01=new int[10];
2、type arr-name[]; String arr02[]=new String[5];
注意:java.lang.array.index.out of Bounds Exception:索引下标不在正常范围内
7.2.2数组初始化:静态 动态 默认
静态:int[] a={2,3,4,5}
动态:通过下标进行赋值
默认:int[] b=new int[2]; 默认值为0;
布尔型:false
String:null
7.3.1数组的遍历:使用循环遍历初始化和读取数组
7.3.2 for-each 循环:专门用于读取数组和集合中所有的元素
for(int m:a){systym.out.println(m);}