1、Java语言的特点
1)Java是面向对象的语言
2)与平台无关性,一次编译到处运行
3)分布式,有一个丰富的例程库
4)Java程序能够防范各种攻击,例如运行时堆栈溢出
5)多线程可以带来更好的交互响应和实时行为
2、Java语言开发环境
1)JDK:Java Development Kit,Java的开发和运行环境,Java的开发工具和JRE
2)JRE:Java Runtime Environment,Java程序的运行环境,Java运行的所需的类库+JVM(Java虚拟机)
3)JVM:Java Virtual Machine,Java虚拟机
4)Java运行原理:首先编写java源文件,然后编译成class类文件,然后通过虚拟机解释成机器码到硬件执行。所以这里面涉及到两种文件,一种扩展名.java源文件,存储java源代码,另一种.class文件,存储编译后的二进制文件。
5)注意:Java是一种半编译半解释的语言
3、Java程序的结构
1)标识符:标识符只能包含字母或数字或下划线(“_”)或美元符号(“$”),且不能以数字开头,标识符中不可以含有空格,不可使用Java关键字或者保留字,严格区分大小写。
2)数据类型:Java中数据类型分为基本数据类型和引用数据类型,其中基本数据类型有八种,只可以存储单一的数据,不能以对象的形式存在(byte、short、char、int、long、float、double、boolean)。除了这八种基本数据类型之外的都是引用数据类型,可以存储复杂数据,可以以对象的形式存在。
3)注释:注释就是对代码的解释说明,方便程序员更好的了解代码,不会影响程序的正常执行。在Java中,注释有三种,分别是单行注释//、多行注释/* */、文档注释/** */
4)分支结构:顺序结构只能顺序执行,不可以进行判断和选择,所以我们才需要分支结构,在Java中有两种分支结构类型(1)if/if...else/if...elseif...else语句 (2)switch...case语句
5)if语句:一个if语句包含一个布尔表达式和一条或多条语句
6)if...else语句:if语句后跟else语句表示否则,也就是当条件为false时,执行else语句块
7)if...else if...else语句:if后可以多个else if,但是最多一个else,一旦if或者else if语句其中一个布尔表达式为true,其后else if和else均不会执行
8)switch...case语句:switch语句判断一个变量与某个值是否相等,类似if的等值判断。switch支持的数据类型有byte、short、int、char、String(JDK1.7后支持)。当变量与case语句对应的值相等时,case之后的语句执行,直到遇见break语句才会跳出switch语句。如果没有break语句,程序会执行下一条case语句,直到break语句出现为止。
9)Java循环结构:Java中循环结构主要有三种,分别是while循环、do...while循环和for循环。当然还有一种一种循环foreach,只要是循环,均会有以下三个要素,进入循环的条件、循环变量以及结束循环的条件。对于while循环和do...while循环,当第一次执行时,若表达式=false时,则while语句不执行,而do...while语句执行一次后面的语句
10)while循环
11)do...while循环
12)for循环:三个表达式均省略 即for(;;)语句,此时相当于while(true)语句
13)方法:将功能模块进行封装,减少重复代码,提供代码复用性
格式:[修饰符]返回值类型 方法名([形式参数列表]){程序代码;[return返回值;]}
注意:定义方法使用的参数为形参,调用方法传入的方法为实参,并且实际参数的类型、顺序和形参要对应上
14)方法的返回值:将数据返回给方法的调用者,return后必须跟着返回值,只能返回一个,返回值类型和定义方法返回值类型一致,如果方法的返回值为void,则不需要返回值,并且return可以用于停止方法的执行或者程序的执行
15)类和对象:是以具体的事物为单位,考虑的是它的特征(属性)和行为(方法)。对象是看得见摸得着的具体事物,类是抽象化的概念,可以说类是对象的模板/抽象化的概念,对象是类的实例。
16)构造方法:使用new关键字创建对象,类型 名字 = new 类型(),在创建对象的时候 根据参数调用对应的构造方法。构造方法的特征,没有返回值、方法名同类名一致、隐式调用。注意:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个无参构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。并且同一个类中,可以有多个构造函数,通过参数列表来区分。所以,一个类中如果出现多个构造函数是以重载体现的
17)static:static可以修饰属性、方法、代码块,不可以修饰类和构造方法,静态方法随着类的加载而加载,在静态方法区内的东西只有一份,所有的对象共享这一份空间,只要有一个对象对属性进行修改,所有的对象调用都是修改后的数据,所以被static修饰的成员通过类名打点访问。代码块的执行顺序:静态代码块>主方法>构造代码块{}>构造方法>普通方法
18)实例成员:也就是没有被static修饰的属性、方法。在访问实例成员时,需要实例化创建对象才可以打点访问。
19)this和super:this代表对象,就是所在函数所属对象的引用,this也可以用在构造函数中,但是必须放在第一行,只能调用一次。super指代父类对象,可以调用父类的构造方法并且调用构造方法时候必须放在第一行
20)成员变量和静态变量:成员变量所属于对象。所以也称为实例变量。静态变量所属于类。所以也称为类变量。成员变量存在于堆内存中。静态变量存在于方法区中。成员变量随着对象创建而存在。随着对象被回收而消失。静态变量随着类的加载而存在。随着类的消失而消失。成员变量只能被对象所调用 。静态变量可以被对象调用,也可以被类名调用。所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。
21)final:final可以修饰类、方法、变量。final类不能被继承,没有子类,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。final不能用于修饰构造方法。
22)值传递和引用传递:值传递:实参会把它的值传递给形参,引用传递:传递的是对象,形参和实参指向同个存储单元
23)“==”与“equals”:“==”用来比较两个变量的值是否相等,如果一个变量指向的是对象(引用类型),就有两块内存。对象本身占用一块内存(堆内存),变量也占用一块内存。比如String s = new String(“AAA”)。变量s所对应的内存中存储的数值就是对象占用那块内存的首地址。如果想看两个变量是否指向同一个对象,即要看他们对应内存中的数值(首地址)是否相同。而equals比较的不是引用,而是数值内容,即比较的是AAA。
24)break、continue、return:Break 用于直接强行跳出当前循环,不执行剩余代码;Continue 用于停止当次循环,回到起始处进行下次循环;Return 跳转 用来表示从一个方法中返回
25)数组:存储相同类型的一组数据。数组的元素可以是任何数据类型,包括基本类型和引用类型,定义数组有两种形式,定义空间的形式:数据类型[] 数组名称 = new 数据类型[数组长度] ,数组定义与为数组元素分配空间和赋值的操作分开进行。另外一种初始化的方式:数据类型[] 数组名称 = { 初始化数据 },在定义数组的同时就为数组元素分配空间并赋值,当然也可以数据类型[] 数组名称 = new 数据类型[] {初始化数据}。对于数组的操作,其实就是读写两个字,不论是读还是写,均离不开数组的下标,切记数组的下标从0开始。
26)封装:封装的目的是为了代码的安全性,我们将属性和方法聚在一起封装成类也是封装,狭义的封装是将属性私有化,然后加入公共的get/set方法提供对外访问的接口,最后根据需要在get/set方法中加入控制语句用来提高代码的安全性和合理性。
27)继承:继承的目的是提高代码的复用性,减少重复代码。特点:1、子类可以继承父类非私有的属性和方法,不能继承构造方法和私有的属性和方法;2、子类在继承父类的各种属性和方法时,也可以有自己的属性和方法;3、一个子类只能有一个父类,java只能单继承,不能多继承,但是可以多实现;
28)多态:多态前提条件:必须有子父类关系。其实多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。具体实现表现为父类类型 变量名=new 子类类型()父类引用指向子类对象。注意:多态的转型分为向上转型和向下转型两种,向上转型:多态本身就是向上转型格式:父类类型 变量名=new 子类类型();向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型使用格式:子类类型 变量名=(子类类型) 父类类型的变量;转型过程中可以通过instanceof关键字来判断某个对象是否属于某种数据类型。
29)抽象类:关键字abstract,抽象类作用提高代码的复用性。特点:1、如果一个类里有抽象方法,那么这个类必须声明成抽象类;2、一个类里面可以没有抽象方法,可以有非抽象方法;3、类继承抽象类子类重写父类的抽象的方法;4、抽象类可以有构造方法,但是不可以创建对象
30)接口:关键字interface,作用规范了代码,提高代码的拓展性。特点:1、接口中只有全局常量和抽象方法;2、接口在实现的同时去继承,extends在implement前面;3、接口可以多实现,实现的也必须是接口;
31)重写和重载:1、重写是在继承关系中, 重载是在同一个类中2、重写是方法名、参数列表和父类相同 ,重载,同一个类中方法名相同,参数列表不相同(个数、类型、顺序)3、重写返回值类型和父类相同,重载和返回值无关4、重写访问权限修饰符不能比父类更加严格,重载没有要求
32)异常:所有异常都是从Throwable继承而来的,Throwable有两个子类,Error和Exception。其中Error是错误,对于所有的编译时期的错误以及系统错误都是通过Error抛出的。这些错误表示故障发生于虚拟机自身、或发生在虚拟机试图执行应用时,如Java虚拟机运行错误等;Exception,是另外一个非常重要的异常子类。它规定的异常是程序本身可以处理的异常。异常和错误的区别是,异常是可以被处理的,而错误是没法处理的。
33)异常处理:Java中有两种异常处理方式,1、抛出异常 产生异常的位置不去处理异常,由调用此方法的调用者去处理异常,在方法声明后面通过关键字throw抛出异常;2、捕获异常,try{]catch(){}finally{},其中try代码块为可能会出现异常的代码快,catch可以有多个,为捕获异常的代码块,finally一般用于资源释放。无论是否发生异常,finally 代码块中的代码总会被执行。
34)集合:Java实J用类库提供了一套相当完整的容器类来解决存储生命周期和数量不确定的对象,其中最基本的类型是 List、Set、Queue和 Map。这些对象称为集合类,并且所有的 collection 都可以使用 foreach 语法遍历。也可以使用 iterator 迭代器进行遍历
35)List集合:元素是有序的,元素可以重复。ArrayList子类:类似数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。LinkedList:链表数据结构。特点:增删速度很快,查询稍慢。Vector:数组数据结构,线程同步,已经被ArrayList替代了。
36)Set集合:元素是无序,元素不可以重复。|HashSet子类:哈希表。线程不同步。 TreeSet:可以对Set集合中的元素进行排序。默认按照字母的自然排序。
37)Map集合:该集合存储键值对,并且键值唯一Hashtable:哈希表数据结构,不可以存入null键null值。线程同步的,效率低。HashMap:哈希表数据结构。允许使用null键null值,该集合是不同步的,效率高。 TreeMap:二叉树数据结构。线程不同步。