Java基础语法
注释
平时我们编写的代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要注释了。注释并不会被执行,是给我们写代码的人看的书写注释是一个非常好的习惯java中的注释有三种:
单行注释多行注释文档注释
标识符
关键字
Java所有的组成部分都需要名字。类名、变量名以及方法名都称为标识符
标识符注意点
所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始
首字母之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或者数字的任何字符组合
不能使用关键字作为变量名或者方法名
标识符是大小写敏感的
可以使用中文,但是一般不建议这样使用,也不建议使用拼音很Low
数据类型
强类型语言
要求变量的使用要严格符合规定,所有变量都必须先定义后使用
弱类型语言
Java的数据类型分为两大类
基本类型(primitive type)
引用类型(reference type)
变量
变量:可以变化的量
Java是一种强类型语言,每个变量都必须声明其类型。
Java变量时程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
type varName
[=value
] [{,varName
[=value
]}];
注意事项
每个变量都有类型,类型可以是基本类型,也可以是引用类型。变量名必须合法的标识符。变量声明是一条完整的语句,因此每一个声明都必须以分号结束。
常量
常量(Constant):初始化(initialize)后不能改变的值!不会变动的值。
所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。
final 常量名
= 值
;
final double PI
= 3.14;
常量名一般使用大写字符。
变量的命名规范
所有变量、方法、类名:见名知意类成员变量:首字母小写和驼峰原则局部变量:首字母小写和驼峰原则常量:大写字母和下划线类名:首字母大写和驼峰原则方法名:首字母小写和驼峰原则
运算符
Java语言支持如下运算符
算术运算符:+,-,*,/,%,++,–赋值运算符:=关系运算符>,<,>=,<=,==,!=,instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>条件运算符:?扩展赋值运算符:+=,-=,*=,/=
JavaDoc
javadoc命令是用来声称自己API文档的参数信息
@author 作者名@version 版本号@since 指明需要最早使用的jdk版本@param 参数名@return 返回值情况@throws 异常抛出情况生成javadoc命令: javadoc-encoding UTF-8 -charset UTF-8 xxx.java
Scanner对象
java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特性,我们可以通过该类来获取用户的输入。
基础语法
Scanner s
= new Scanner(System
.in
);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
next()
一定要读取到有效字符后才可以结束输入。对输入有效字符之前遇到的空白,next()方法会自动将其去掉。只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。next()不能得到带有空格的字符串。
nextLine()
以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。next()不能得到带有空格的字符串。
nextLine()
以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。可以获得空白。
顺序结构
JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。
顺序结构是最简单的算法结构
语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。
选择结构
if单选择结构
我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示 语法:
if(布尔表达式
){
}
if双择结构
语法:
if(布尔表达式
){
}else{
}
if多分支结构
语法:
if(布尔表达式
1)
{
}else if(布尔表达式
2)
{
}else if(布尔表达式
3)
{
}else{
}
嵌套的if结构
语法:
if(布尔表达式
1)
{
if(布尔表达式
2)
{
}
}
switch多选择结构
多选择机构还有一个实现方式就是switch case 语句。switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支switch语句中的类型可以是:
byte、short、int或者char从JavaSE7开始switch支持字符串String类型同时case标签必须为字符串常量或字面量 语法:
switch(expression)
{
case value
:
break;
case value
:
break;
default:
}
循环结构
while循环
while是最基本的循环,它的结构为:
while(布尔表达式)
{
}
do…while循环
对于while语句而言,如果不满足 条件,则不能进入循环,但有时候我们需要即使不满足条件,也至少执行一次do…while循环和while循环相似,不同的是,do…while循环至少会执行一次
do{
}while(布尔表达式);
while和do..whiel的区别:
while先判断后执行,do..while先执行后判断
do..while总是保证循环体会被至少执行一次!这是两者的主要差别
for循环
for(初始化
;布尔表达式
;更新)
{
}
在java中引入了一种主要用于数组的增强for循环(JavaSE5开始引入)
for(声明语法
:表达式)
{
}
break continue
break在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句,(break语句也在switch语句中使用)continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环体的判定。关于goto关键字
goto关键字早就在程序设计语言中出现,尽管goto仍是java的一个保留字,但并未在语言中得到正式使用;Java没有goto,然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子—带标签的break和continue。“标签”是指后面跟一个冒号的标识符,例如:lable:对Java来说唯一用标签的地方是在循环语句之前,而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,他们就会中断到存在标签的地方。
何谓方法
Java方法时语句的集合,我们在一起执行一个功能。
方法时解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样利于我们后期的扩展。
方法的定义
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
修饰符:修饰符,是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。返回值类型:方法可能会有返回值。returnValueType是方法返回值的数据类型,有些方法执行所需操作,但没有返回值。在这种情况下,returnValueType是关键字void。方法名:是方法的实际名称。方法名和参数表共同构成方法签名。参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。形式参数:在方法被调用时用于接收外界输入的数据。实参:调用方法时实际传给方法的数据方法体:方法包含具体的语句,定义该方法的功能。
修饰符 返回值 方法名(参数类型 参数名)
{
...
方法体
...
return 返回值
;
}
方法调用
调用方法:对象名.方法名(实参列表)Java支持两种调用方法的方式,根据方法是否返回值来选择。当方法返回一个值得时候,方法调用通常被当做一个值。例如:
int larger
= max(30,40);
若果方法返回值为void,方法调用一定是一条语句。
System
.out
.println("Hello,JerrryLau!");
方法的重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数。方法的重载的规则:
1.方法名称必须相同。 2.参数列表必须不同(个数不同、或类型排列顺序不同等)。 3.方法的返回类型可以相同也可以不相同。 4.仅仅返回类型不同不足以成为方法的重载。
实现理论
方法名称相同时,编辑器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
可变参数
JDK1.5开始,Java支持传递同类型的可变参数给一个方法。在方法声明中,在指定参数类型后加一个省略号(…)。一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声明。
递归
A方法调用B方法,我们很容易理解!递归就是:A方法调用A方法!就是自己调用自己利用递归可以用简单的程序来解决一些复杂的问题,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量,递归的能力在于用有限的语句来定义对象的无限集合。递归包括两部分:递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。递归体:什么时候需要调用自身方法。
数组的定义
数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。
数组声明创建
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType
[]arrayRefVar
;
或
dataType arrayRefVar
;
Java语言使用new操作符来创建数组,语法如下:
dataType
[] arrayRefVar
= new dataType[arraySize
];
数组的元素是通过索引访问的,数组索引从0开始。获取数组长度:
arrays
.length
内存分析
java内存分析
三种初始化
静态初始化
int[] a
= {1,2,3}
Man
[] mans
= {new Man(1,1),new Man(2,2)};
动态初始化
int [] a
= new int[2];
a
[0] = 1;
a
[2] = 2;
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量的方式被隐式初始化。
数组的四个基本特点
其长度是确定的,数组一旦被创建,它的大小就是不可改变的。其元素必须是相同的类型,不允许出现混合类型。数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。数组变量属于引用类型,数组也可以看做事对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他类型,数组对象本身是在堆中的。
数组的边界
下标的合法区间:[0,length-1],如果越界就会报错;ArrayIndexOutOfBoundsException:数组下标越界异常!小结:
数组是相同数据类型(类型可以是任意类型)的有序集合数组也是对象,数组元素相当于对象的成员变量数组的长度是确定的,不可改变的。如果越界,则报出索引越界异常。
数组使用
For - Each 循环数组方法入参数组作为返回值
多维数组
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个以为数组。二维数组
int a
[][] = new int[2][5]
解析:以上二维数组a可以看做一个两行五列的数组。
Arrays类
数组的工具类java.util.Arrays由于数组对象本身并没有什么方法可以提供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。Arrays类中的方法都是static修饰的静态方法,在使用时候可以直接使用类名进行调用,而“不用”使用对象来调用(注意:是“不用”而不是“不能”)具体以下常用功能:
1.给数组赋值:通过fill方法。 2.对数组排序:通过sort方法,按升序。 3.比较数组:通过equals方法比较数组中元素值是否相等。 4.查找数组元素:通过binarySearch方法对排序好的数组进行二分查找法操作
面向过程&面向对象
面向过程思想
1.步骤清晰简单,第一步做什么,第二步做什么… 2.面向过程适合处理一些比较简单的问题
面向对象思想
1.物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索 2.面向对象适合处理复杂的问题,适合处理需要多人协作的问题! 3.对于复杂的事物,为了从宏观上把握、从整理上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
什么是面向对象
面向对象编程(Object-OrientedProgramming,OOP)面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。抽象三大特性:
1.封装 2.集成 3.多态
从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象。从代码运行角度考虑是先有类后有对象,类是对象的模板。
类与对象的关系
类是一个种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。动物、植物、手机、电脑…Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为对象是抽象概念的具体实例
1.张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。 2.能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。
创建与初始化对象
使用new关键字创建对象使用new关键子创建的时候,除了分配内存空间之外,还给创建好的对象进行默认的初始化以及对类中构造器的调用。类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有一下两个特点:
1.必须和类的名字相同。 2.必须没有返回类型,也不能写void。 3.定义有参构造之后如果想用无参构造,显示的定义一个无参构造。
封装
该露的露,该藏的藏我们程序设计要追求"高内聚,低耦合"。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。封装(数据的隐藏)
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
记住这句话就够了:属性私有,get/set
继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。extends的意思是“扩展”。子类是父类的扩展。JAVA中类只有单继承,没有多继承!继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。继承关系的两个类,一个为子类(派生类),一个为父类(基类)。自雷继承父类,使用关键字extends类表示。子类和父类之间,从意义上来讲应该具有"is a"的关系。
super注意点:
super调用的父类的构造方法,必须在构造方法的第一个。super必须只能出现在子类的方法或者构造方法中!super和this不能同时调用构造方法!
this
代表的对象不同:
this:本身调用者这个对象 super:代表父类对象的引用 前提: this:没有继承也可以使用 super:只能在继承条件才可以使用 构造方法: this():本类的构造 super():父类的构造!
重写
需要有继承关系,子类重写父类的方法!
1.方法名必须相同 2.参数列表必须相同 3.修饰符:范围可以缩小,但不能扩大 4.抛出的异常:范围可以被缩小但不能扩大
重写,子类的方法和父类必须要一致;方法体不同!为什么要重写:
1.父类的功能,子类不一定需要,或者不一定满足!
多态
即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。多态存在的条件:
1.有继承关系 2.子类重写父类方法 3.父类引用指向子类对象
注意:多态是方法的多态,属性没有多态性。instanceof 判断一个对象是什么类型
抽象类
abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类。抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。抽象类不能用new关键字来创建对象,它是用来让子类继承的。抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
接口
普通类:只有具体实现抽象类:具体实现和规范(抽象方法)都有!接口:只有规范!自己无法写方法~专业的约束!约束和实现分离:接口就是规范,定义的是一组规则,体现了现实世界中"如果你好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。"接口的本质是契约,就像我们人间的法律一样,制定好后大家都遵守。OO的精髓,是对象的抽象,最能提现这一点的就是接口。声明类的关键字是class,声明接口的关键字是interface。
内部类
内部类就是在一个类的内部再定义一个类,比如:A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对于B类来说就是外部类了。成员内部类静态内部类局部内部类匿名内部类
什么是异常
异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的。在Java等面向对象的编程语言中异常属于对象。软件程序在运行过程中,非常可能遇到异常问题,我们叫异常,英文是:Exception,意思是例外,这些,例外情况,或者叫异常,它们让我们写的程序做出合理处理。而不至于程序崩溃。异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常发生在程序运行期间,它影响了正常的程序执行流程。
简单分类
异常的三种类型:检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的,例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。运行时异常:运行时异常是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时被忽略。错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
Error
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。Java虚拟机错误代码(VirtualMachineError),当JVM不再有继续执行操作所需要的内存资源时,将出线OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般都会选择线程终止;还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为他们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状态。
Exception
在Exception分支中有一个重要的子类RuntimeException(运行时异常)
1.ArrayIndexOutOfBoundsException(数组下标越界) 2.NullPointerException(空指针异常) 3.AirthmeticException(算数异常) 4.MissingResourceException(丢失资源) 5.ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这些异常的发生;Error和Exception的区别:Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
异常处理机制
抛出异常捕获异常异常处理的五个关键字:
try、catch、finally、throw、throws
自定义异常
使用Java内置的异常可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需要继承Exception类即可。在程序中使用自定义异常类,大体可分为以下几个步骤:
1.创建自定义异常类。 2.再方法中拖过throw关键字抛出异常对象。 3.如果在当前抛出的异常的方法中处理异常,可以使用try-catch语句来捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。 4.在出现异常方法的调用者中捕获并处理异常。