一.Java概述
1. 1991年sun公司的James Gosling等人开发名为oak(橡树)的 语言,希望控制嵌入在有线电视交换盒,PDA等微处理器。1994年更名 为Java。
2. Java的三种技术架构:
J2SE(标准版):桌面应用开发版,包含Java的核心类,如数据库连接,接口定义,输入输出,网络编程。是其他两者的基础
J2EE(企业版):开发企业环境下的应用程序,主要针对web应用的开发,包含J2SE中的核心类以及开发企业级应用的类,如 servlet,xml
J2ME(微缩版):开发嵌入式设备和电子消费产品贵,主要针对移动端应用开发,包含J2SE中的部分核心类,新添加了些专有类
3. 什么是JVM? JDK? JRE?
JVM(Java Virtual Machine):Java虚拟机,Java实现跨平台特性的核心部分,所有的Java程序首先会被编译成.class字节码文件,然 后再由 JVM将改程序解释给本地操作系统运行,也就是说class文件不与系统直接交互,这样就实现了Java跨平台特性
JRE(Java Runtime Environment):Java运行环境,包含了解释class文件所需的类库(存于lib下)和JVM二进制字节码文件(存于bin下)
JDK(Java Development Kit):Java开发工具包,其目录中主要包括bin,jre,lib,include四大部分。由此我们可以看出JDK包含JRE, bin:包含javac编译器的二进制字节码文件 jre:Java运行环境 lib:类库 include:JVM和Java交互所需头文件
4. 配置环境变量(classpath)
让java/jdk/bin目录下的工具能在任意处运行,当系统需要用到该工具如javac编译器器时会自动去环境变量配置的目录下寻找
5. java命名规范
①类名,大驼峰式命名(首字母大写,之后每个完整单词首字母大写)如TestName
②方法名,小驼峰式命名(首字母小写,之后每个完整单词首字母大写)如testName
③常量名全部大写
④包名全部小写
所有命名遵循以下规则:
①只能由数字,字母,_,$构成
②不能以数字开头
③不能使用关键字命名
二.数据类型
1.基本数据类型
数值型:整数型:int(4字节),byte(1字节),short(2字节),long(8字节)
浮点型:float(4字节),double(8字节) 注:输入数字默认为int,输入小数默
认为double
布尔型:boolean(1字节)
字符型:char(2字节)
级别排序:byte,char,short(这三个平级) < int < float < long < double
自动类型转换:自动转换,从低级别到高级别。
强制类型转换:手动把高级别转化低级别,如,int a = (int)1.2; 可能会造成精度溢出 可把int类型值赋给byte,char,short等类型变量而不需强制转换,前提是不超出其对应表述范围
2.引用数据类型
包含数组,类,接口,String(除基本数据类型外都是引用类型),引用类型的默认值为null
三.运算符
1.算数运算符
+,-,*,/,% 注:若接受类型为整数型,/运算结果只会取整数部分,如5/2 = 2++(自增),--(自减)
++i和i++的异同
共同点:①都等价于i = i + 1 ②如果i++,++i是一条单独语句,则二者没区别
③都仅适用于变量
不同点:如果i++,++i不是单独的语句,i++表示先运算后增加,++i表示先增加后运算
int x=5;int y=x++;System.out.println("x="+x+", y="+y); //以上代码运行后输出结果为:x=6, y=5
int x=5;int y=++x;System.out.println("x="+x+", y="+y); //以上代码运行后输出结果为:x=6, y=6
2.赋值运算符
=,-=,+=,*=,/= 注:=为赋值运算,而不是判断两数是否相等! i+=2等价于(i=i+2)
3.比较运算符
>,<,>=,<= 结果为true或false
4.逻辑运算符
!,&,|,&&,||,^ 注:除!外都是双目运算符
^:异或,两边结果相同返回false,不相同为true
&&(短路与)和&的区别:&&,只要第一个表达式为false,则直接返回false,不进行下个表达式的判断。&,不管第一个表达式值为什么,下个表达式都要进行判断
||(短路或)和|的区别:||,只要第一个表达式为true,则直接返回true,不进行下个表达式的判断。 |,不管第一个表达式值为什么,下个表达式都要进行判断
5.位运算符
&,|,^,<<,>>,>>>(无符号右移)
位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。如对于位运算符“<<”, 是将一个数左移n位,就相当于乘以了2的n次方,2*8 == 2*2^3(2的3次方) == 2 << 3
&,|,^,的使用也要先将数转化为二进制类型
&:两操作数对应位都为1则返回1,否则返回0
|:两操作数对应位有1个数为1,则返回1,否则返回0
^:两操作数对应位相同则返回0,不同则返回1
四.常用语句
1.条件语句
if(表达式){ 语句 }, if(表达式1){ 语句1 }else{语句2 }, if(表达式1){ 语句1 } else if(表达式2){ 语句2}
switch(变量){
case 值:待执行语句;
.....
default:默认执行语句
}
注:①若匹配不到对应的case条件,则会执行default;
②若匹配到了条件,但在执行语句末尾无break,则会继续往下执行所有case,
和default语句,直至遇到break
③switch后括号中变量只能是byte,char,short,int类型值
2.循环语句
while(表达式){ 循环体 }; do{循环体} while(表达式)
for(定义变量;表达式;变量变化){循环体}
while和do while的区别:
①while是先判断再执行,那么可能会一次都不执行
②do while是先执行再判断,至少会执行一次
for和while的选择:
如果想要控制循环次数,那么一般使用for循环,如果循环次数未知,那么可以使用while循环
break关键字:跳出当前循环(若嵌套有外层循环,则只是跳出内层循环),或者结束switch语句
continue:跳出本次循环,将程序执行权交由判断语句
五.数组
数组是相同数据类型的有序的集合,数组会在内存中开辟一块空间,每个空间相当于一个变量,数组的元素可通过下标获取,下标索引从
0开始
1.数组的定义
①动态初始化
int[ ] a = new int{1,2,3} ; int[ ] a = new int[ 3]{ };a[0] = 1
②静态初始化
int[ ] a = {1,2,3}
注:①数组只能存储基本数据类型以及String类型的值
②数组长度在初始化后便无法更改
六.类与对象
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。类和对象好比图纸和实物的关系,模具和铸件的关系。比如人类就是一个类,人类具有身高,体重等属性。人类可以吃饭、说话。相当于有这些方法。小明就是一个具体的人,也就是实例,他的属性是具体的身高200cm,体重180kg,他做的具体的方法是吃了一碗白米饭,说了“12345”这样一句话。
1.面向过程和面向对象
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象的特点:①可以将复杂的业务的业务逻辑变简洁,增加代码的复用性
②具有抽象,封装,继承,多态等特性
举个栗子:我要炒一盘青椒肉丝吃
面向过程的实现思想是:洗青椒,切青椒,切肉,炒菜
面向对象的实现思想是:首先将整个流程中涉及到的东西分为几个对象,我,青椒,锅,肉。那么在这个过程中“我”负责洗菜,切菜, 切肉,炒菜,青椒和肉负责变熟变好次,锅负责加热
两者区别:①面向过程以实现功能的函数开发为主,面向对象要首先抽象出类,属性及其方法,然后通过实例化类,执行方法来完成功能
②面向过程封装是功能,面向对象封装的是功能和方法
③面向对象具有继承性和多态性,而面向过程没有继承性和多态性
2.变量
变量即可以被改变的数据,创建一个变量时,会在内存中创建一个小空间,如int a = 1,a即为这个空间的名,1即为这个空间里存储
的内容
java变量分为成员变量(静态变量,实例变量),局部变量
成员变量:定义在类中的变量
静态变量:static 关键字修饰,表示该类共有的对象,而不属于某个类独有,在类加载
时便会被初始化赋值
实例变量:每一个实例所拥有的变量,创建对象时会被初始化赋值
局部变量:定义在方法中的变量,作用范围在整个方法
访问权限控制符:
private(私有访问控制符),指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。
default(默认访问控制符) ,可以被同包不同类访问
protected(保护访问控制符),指定该变量可以别被自己的类和子类访问。在子类中可以覆盖此变量。
public(公共访问控制符),指定该变量为公共的,他可以被任何方法访问。
friendly ,在同一个包中的类可以访问,其他包中的类不能访问。
一般是推荐使用private,这样能保证数据的安全性
3.函数
函数是具备特定功能的一段代码块,解决了重复性代码的问题。
格式为:修饰符 返回值 类型 函数名(形式参数1...){
函数体语句;
return返回值;
}
java函数分为一般函数和构造函数
一般函数:通过类名.函数名()或对象名.函数名()调用,可多次调用
public int test(){System.out.print("111"); return 2;}
构造函数: 无返回值类型,只在对象创建时执行一次
public User(){System.out.print("111")}
访问权限控制符:
private(私有控制符),指定此方法只能有自己类访问
default,默认的访问控制权限 ,可以被同包不同类访问
protected(保护访问控制符),指定该方法只能被它同包不同类和不同包中子类访问。
public(公共控制符),可以被同包不同类以及其他包中的类访问
函数重载:在同一个类中可存在多个函数,函数名称相同但参数不同。这就是函数的
重载(overlording)。
①函数名和返回值类型完全一致。
② 参数的数量不同、或数量相同而类型和次序不同,以方便JVM区分到底
调用哪个函数。
③返回值类型,修饰符可相同也可不同
注:判断是否是重载必须是程序在编译期能判断出两同名方法不是同一
方法
函数重写:在子类中对父类方法的方法体进行重新编辑(overriding)
①重写的方法必须和被重写的方法必须具有相同的函数名,参数,类型
②重写的方法不能使用比被重写方法更严格的修饰符
4.类
类时某一类事物的抽象,是一个模板,它描述一类对象的行为和状态。
类的基本结构
属性:对象数据的描述
普通方法:对象的行为
构造方法:用于实例化对象
块:分静态块与实例块 类的声明:(访问权限修饰符public.default(可忽略不写,为默认))(修饰符final.abstract.synchronized)class 类名{ 类体 }
注:程序默认会生成无参构造方法,初始化实例时默认调用无参构造方法
5.对象
对象是类的一个实例,有状态和行为。例如,小明是一个对象,它有:名字,年龄;行为有:吃饭、睡觉、等。
创建方法:
①通过new 关键字创建
②通过class类的newInstance()方法
对象创建的流程:
父类的静态字段——>父类静态方法——>父类静态代码块——>子类静态字段——>子类静态方法——>子类静态代码块——>父类成员变量(非静态字段)——>父类非静态方法——>父类非静态代码块——>父类构造器——>子类成员变量——>子类非静态方法——>子类非静态代码块——>子类构造器
6.封装
将实现方法的细节和流程隐藏起来,给外界提供一个接口用于访问,就比如我们直接通过对象名.方法名来调用一个方法,而不知道方法里面具体是什么
封装的优点:①提高了代码复用性
②提高了代码的安全性,隐藏了细节
③高内聚:仅在方法内维护代码
④低耦合:使用者调用方法十分方便
7.继承
一个类或取已有类的非私有属性和方法,并且可以在该类中新增属性和方法。例如交通工具是一个类,该类中有运动这个方法。飞机也是一个类,继承了交通工具类,那么飞机类就是子类,交通工具类就是父类。飞机也会有运动这个方法,并且可以重写该方法中的内容。此外,飞机类也可以自己创建其他的方法。
继承的优点:①提高了代码的复用
②增加了代码的扩展性(子类中可以创建新属性和方法)
8.抽象
抽象指的是在抽象类或接口中声明该方法而不实现,交由继承该方法或实现该接口的子类来具体的实现
抽象类:使用abstract关键字修饰的类,其特点如下
①和普通类一样,其可以有静态方法,实例方法,成员变量,构造方法,代码块
②可以有abstract修饰的方法(抽象方法,仅声明,子类中实现),且抽象方法修饰符只能为public,protected(若为private则无法被继承)
③无法创建其实例对象,但其子类在创建对象时也会调用他的构造方法
④一个类继承了抽象类必须实现其父类所有抽象方法,否则该类也必须声明为抽象类
接口:和抽象类类似,其与抽象类的共同点和区别如下
共同点:
①都不能通过new被直接实例化,如要创建对象,必须指向子类引用
②都需要被继承或实现
区别:
①接口中的方法都是public abstract修饰的,都是抽象方法,抽象类中可以有非抽象方法
②接口中的属性都是常量,修饰符都为public static final,无法被更改,抽象类中属性非常量
③一个类只能继承一个抽象类但可以实现多个接口
9.多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作 。
如何实现多态?
①必须要有继承关系
②子类要重写父类的方法
③父类引用要指向子类对象!(上转型)
10.重要关键字
①this和super
this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题;this可以调用成员变量,不能调用局部变量;this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省略,必须是构造方法的第一条语句。,而且在静态方法当中不允许出现this关键字。
super代表对当前对象的直接父类对象的引用,super可以调用直接父类的成员变量(注意权限修饰符的影响,比如不能访问private成员)
super可以调用直接父类的成员方法(注意权限修饰符的影响,比如不能访问private成员);super可以调用直接父类的构造方法,只限构造方法中使用,且必须是第一条语句。
②final、finally、finalize
final修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承例如:String类、Math类等。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写,但是能够重载。 使用final修饰的对象,对象的引用地址不能变,但是对象的值可以变!
finally,在异常处理时提供 finally 块来执行任何清除操作。如果有finally的话,则不管是否发生异常,finally语句都会被执行。一般情况下,都把关闭物理连接(IO流、数据库连接、Socket连接)等相关操作,放入到此代码块中。
finalize,方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。finalize() 方法是在垃圾收集器删除对象之前被调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 一般情况下,此方法由JVM调用,程序员不要去调用!
③static关键字的作用
static可以修饰变量、方法、代码块和内部类static属性属于这个类所有,即由该类创建的所有对象共享同一个static属性。可以对象创建后通过对象名.属性名和类名.属性名两种方式来访问。也可以在没有创建任何对象之前通过类名.属性名的方式来访问。
1.在内存中份数不同不管有多少个对象,static变量只有1份。对于每个对象,实例变量都会有单独的一份static变量是属于整个类的,也称为类变量。而非静态变量是属于对象的,也称为实例变量
2.在内存中存放的位置不同,static关键字修饰的存在于堆中的方法区中的常量区中,所有对象共享,而非静态的每存在一个对象,在堆中便对应有一块内存
3.static修饰的变量,可以通过对象名.变量名访问(不推荐),一般通过类名.变量名访问
许多不足之处欢迎指正,大家一起共同进步!