目录
22、StringBuffer 和StringBuilder
1、Java是面向对象的语言。
(1)通过JDK提供的javac.exe编译器将.java文件编译为.class文件
(2)通过JRE提供的java.exe解释器将.class文件解释为操作系统的字节码。
2、关于java命名
(1)项目名称使用纯小写的英文单词,多个单词间使用“_”分隔。
(2)包的命名:和项目命名相同规范
(3)类名称使用大驼峰命名法,从第一个单词开始首字母大写多个单词。
(4)定义方法或者变量使用小驼峰命名,第一个单词全小写,多个单词从第二个开始首字母大写。
(5)接口命名是用大写的I开头
3、Java中的注释
(1)单行注释://
(2)多行注释:/*...*/
(3)文档注释:定义在类和方法体上面。通过JDK提供的javadoc.exe将项目源文件中所有文档注释生成一个文档。
4、标识符
程序中给类、方法、变量起的名字都是标识符
(1)标识符只能包含字母、数字、下划线、$,不能以数字开头
(2)不能包含关键字。
5、将本地项目放到码云上
(1)在码云端创建空项目:新建仓库—>创建(建议仓库名称和本地项目名称一致)
(2)通过idea初始化本地仓库
- File—>Setting—>Version Control—>Git—>在Path to Git executable中选择电脑上安装好的git目录(具体为...\Git\bin\git.exe)(这一步点击确认)—>Create Git Repository(这一步创建本地仓库,本地仓库默认目录就是当前项目)
- 在idea中关联本地仓库和远程仓库:点击项目右键—>Git—>Manage Remotes—>填入远程仓库链接—>输入用户名和密码—>连接成功
- 将本地仓库推送到远程仓库:点击Git中commit将本地修改提交到本地仓库—>选择要提交的文件(只选择.java文件)—>点击commit and push 将代码上传码云
(3)关联远端仓库不成功:检查码云邮箱和本地提交的邮箱是否一致;(修改本地邮箱步骤。。。)
(4)提交时需要忽略某些文件的方法
- 在项目根目录下新建 .gitignore 文件(项目—>new—>File)
- 文件中写需要忽略的文件名称(如下图)
- 如果提交时已经将不需要的文件上传,则再写 .igitignore是无效的,需要使用命令清空当前缓存。(项目—>open in—>terminal—>命令:git rm -r --cached .)
6、数据类型划分
(1)8大基本数据类型:byte(1字节)、short、int(4字节)、long(8字节)(前四个默认值为0)、float(4字节)、double(8字节) (这两个默认值为0.0)、char(2字节)、boolean(布尔默认值为false)
(2)引用数据类型:数组、类、接口、字符串
注:(1)关于变量默认值,方法中定义的变量都是局部变量,必须赋值后使用。在类中定义的变量存在默认值。
(2)在任意方法中不能定义静态变量,静态变量必须定义在类中。
(3)基本数据类型保存的都是具体的值,引用数据类型保存的是对应对象的地址(堆内存地址)。
(4)引用和对象之间的关系:对象是实实在在存在的实体,通过new 关键字产生,保存在堆内存中。引用就是给对象起的名称,通过这个引用来访问对象。
(5)当一个引用数据类型的值为null时,表示该引用不指向任何的内存空间,因此无法使用该引用获取任何数值。
7、常量和变量
(1)常量:字面常量(直接写出来的值)和普通常量(用const关键字定义)
(2)变量:数据类型 标识符名称=初始值
声明长整型变量要在后面加”l“,浮点型变量要在后面加”f“。
8、类型转换
(1)只有有关系的类型才能转换,无关类型不能转换。
(2)隐式提升(小类型转换到大类型);显示转换(大类型转换为小类型,需要进行强制类型转换,可能会出现精度丢失问题)
(3)其他类型和String类型转换:(int—>String:直接用”+“)(任意类型—>String:使用String类提供的valueOf方法,具体用法String.valueOf(要转换的量))(String—>int:使用Integer.parseInt(str) )
9、运算符
(1)算术运算符:+, - , *, / , % , 加 减 乘 除 取余
(2)增量运算符:+= , -= , *= , /=,%=,++,--
(3)关系运算符:==,!=,<,>,<=,>=
(4)逻辑运算符:&&,||,!
(5)位运算符:& (两个二进制位都为1,则返回1),|(两个二进制位都为0,则返回0),^(两个二进制位不相同返回1,否则返回0),~(取绝对值(取绝对值就是加符号减一))
(6)移位运算:>> (右移), <<(左移), >>>(无符号右移)
(7)条件运算符
10、程序结构
(1)顺序结构
(2)分支结构
11、输入输出
(1)输出:
System.out.println( );
(2)输入:
Scanner sc = new Scanner();
int age = sc.nextInt();
sc.hasNextInt():判断输入数据是否为整型,一般用在循环中。
12、方法的定义和使用
(1)方法定义:
public static 返回值 方法名称(参数列表){ 方法体 }
(2)方法调用:直接使用方法名称(参数)即可。
(3)方法重载:在同一个类中,定义若干方法名称相同、参数个数或者类型不同、与返回值无关的一组方法称为重载方法。
(4)方法递归:方法在执行过程中自己调用自己
- 大问题可以拆分成若干字问题
- 子问题与原问题除了数据规模不同,解决思路完全相同
- 存在递归出口
(5)方法重写:发生在有继承关系的类之间,子类定义了和父类除了方法权限不同以外,其他完全相同的方法,子类的方法就称为重写方法。
13、数组
(1)数组初始化
动态初始化:数据类型 [ ] 数组名称 = new 数据类型 [数组长度]
静态初始化:声明并创建数组时就给对应位置元素进行赋值。
(2)数组转字符串:Arrays.toString(数组)
数组拷贝:Arrays.copyOf(数组,长度),使用该方法可以真正复制一个数组(在堆内存上产生新空间,并将原数组内容拷贝过来),可以完全拷贝和部份拷贝。
(3)二分查找时区间中间位置mid的计算:为了避免溢出,用mid=l+(r-1)/2
14、类和对象
(1)在java中定义一个类使用class关键字,使用 ”.“ 来访问对象的属性和方法。
class 类名称{
一系列属性
一系列方法
}
(2)在类中定义构造方法:方法名称和类名称相同;构造方法没有返回值的类型声明
当类中没有构造方法定义时,Java编译器在编译后会生成默认的无参构造,一旦提供构造方法,编译器就不会再生成默认的无参构造。
idea中生成构造方法:alt+insert
(3)关于this关键字:this修饰成员变量,表示直接从类中去寻找同名变量;this修饰成员方法,表示直接从当前类中寻找同名方法。
- this调用构造方法只能在构造方法中使用,不能在成员方法使用
- this调用其他的构造方法必须写在当前构造方法的首行
- this调用必须是线性的,不能成环。
15、static:与具体对象无关,和类本身相关
(1)static修饰属性,则该属性为静态变量,直接通过类名来调用,存储在JVM的方法区,该类所有对象共享此变量。
- static只存在类中,方法中不能定义静态变量
- 静态属性直接通过类名来访问,没有任何该类对象,这个属性也是存在的。
(2)static修饰方法,称为类方法/静态方法,和具体对象无关,通过类名称直接访问。
(3)static修饰的属性/方法,都称为类的静态域,静态域没有该类对象就能访问。(在静态方法中不能访问成员域;在成员域中可以访问静态域)
(4)static不能修饰类
(5)在静态方法中不能使用this关键字,this是成员域的一部分,修饰当前对象的属性/方法。
16、代码块
(1)使用 { } 括起来的一段代码
- 普通代码块:定义在方法中,直接用 { } 括起来的代码块,其作用域仅限于当前代码块内部可见
- 构造块:定义在类内部,不加任何修饰符的代码块。构造块优先于构造方法执行,有几个对象产生就执行几次构造块代码,一般用于构造方法之前按进行某些属性的默认值初始化。
- 静态代码块:定义在类中,使用关键字static修饰的代码块,在该类被JVM加载时执行一次,后面无论多少对象产生,都只在类加载时执行一次;若当前类中存在主方法,静态块还会优先于主方法执行。
17、面向对象开发的三大特性
(1)封装:体现的是易用性和保护性。
- private关键字实现属性封装,只在当前类的内部可见,对外部完全隐藏。要想在外部调用,需要使用getter和setter方法。
- default:包访问权限,其可见性只在当前包(同级目录)下的其他类内部可见
- protected:继承访问权限
- public:在当前项目中可见
- 关于包的导入:在Java中只能导入某个包下的某个具体类(不能导入整个文件夹);
- 包导入的两种方式:(1)产生对象时,使用类的全名称使用(java,.util.Date);(2)使用import语句导入
- 关于静态导入:将某个包下的某个类中所有静态域导入到当前类中(import static 包名.类名.*)
- 注意:当多个包下都是用通配符导入时,若多个包出现相同的类,就会发生冲突,这时需要使用类的全名称调用。
JDK中常用的包
- java.lang:常用基础类
- java.util:Java提供的工具类,整个Java集合框架都在此包中
- java.sql:数据库开发包
- java.net:网络编程开发包
- java.io:I/O开发包
(2)继承:共性抽取,代码复用
- 语法:访问修饰符 class 子类名称 extends 父类名称{ 子类代码 }
继承原则
- 关于构造方法,调用子类构造方法产生子类对象之前,默认调用父类构造方法先产生父类对象,而后产生子类对象。
- 不允许多重继承,一个类只能继承一个父类
- 父类中私有域,子类不能直接使用
- super修饰属性,表示直接从父类中寻找同名变量;子类构造方法首行必须使用super(参数),表示调用父类构造方法;如果父类不存在无参构造,则必须在子类构造方法首行显式调用父类有参构造。
- Java中所有类都默认继承Object类。
- Java中对于引用数据来说,”==“比较的是地址,如果要比较属性值,要使用equals()方法。
(3)多态:相同行为/方法,通过不同对象使用时,展现出不同的状态。
- 多态条件:a.必须在继承体系下实现多态。b.子类必须要对父类方法进行重写。c.必须通过父类引用来调用这些重写方法。
- 若要调用子类中独有的方法,需要向下转型,还原为子类对象。具体方法为:子类名称 子类实例=(子类名称)父类引用。
- 向下转型存在类型强转,必须发生在有继承关系的类之间,毫无关系的类,对象不能发生向下转型。
- 由于向下转型存在类型转换异常风险,引入 instanceof 关键字。用法:(引用名称 instanceof 类名称)返回布尔值。
- 注意:尽量避免在构造方法中调用实例方法。
18、final关键字
(1)final修饰的属性称为常量,被final修饰的变量一旦初始化之后值不能更改。
(2)被final修饰的引用类型地址不能更改。
(3)被final修饰的方法不能被重写
(4)final修饰的类不能被继承
19、抽象类
(1)抽象类是普通锅的超集,比普通类多一些抽象方法。
(2)抽象类和抽象方法用abstract关键字定义,抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
(3)抽象类必须有子类,抽象方法必须被子类覆写。
20、接口
(1)在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
(2)接口与类的区别:
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
(3)由于接口中只存在抽象方法和全局变量,以下关键字可以省略:a.public ;b.static final ;c.abstract
(4)JDK中常用的接口
- java.lang.Comparable接口,必须实现compareTo方法
- java.lang.Cloneable接口,JDK中的标记接口
- 在Java中一个类要实现Cloneable接口需要两步:打标记,JVM会将带Cloneable接口的子类赋予其可以拷贝的能力;在类中覆写Object类的clone方法。
- 浅拷贝:当前类若包含其他类的引用,克隆后的新对象不会产生新的内部对象,浅拷贝只是将原对象中的所有属性值复制一份。
- 深拷贝:产生的拷贝对象内部,包含的其它类对象也会复制一个新的对象产生。
21、String
(1)字符串对象的产生
- 直接通过字符串常量产生对象:String str = "1qsd";
- 通过构造方法产生:String str =new String( "1qsd");
- 使用字符数组产生字符串对象 char[] v = {'a','b','c'}; String str = String.valueOf(v);
(2)字符串对象比较:用equals;equalsIgnoreCase是不区分大小写的字符串对象比较。
(3)字符串对象大小比较:用compareTo方法
(4)字符串和数值转化:String.valueOf() , Integer.parseInt()
(5)String类涉及的一些方法 Java String 类 | 菜鸟教程 (runoob.com)
(6)关于字符串常量值
当字符串对象采用直接赋值法创建时,JVM会维护一个字符串的常量池,当字符串对象第一次产生时,就会产生该字符串对象,置入常量池中,当使用直接赋值法再次产生该对象,如果常量池中已经包含了该对象,直接复用常量池中的对象,并不会产生新的字符串。
(7)intern手工入池方法
- 如果常量池中已经包含当前对象,不会将当前对象置入常量池,而是返回常量池中原有对象的地址
- 如果常量池中没有包含当前字符串对象的内容,就把当前对象置入常量池中。返回的是当前对象的地址。
(8)关于字符串的不可变性
- 字符串对象一旦产生,其中保存的值不可改变。但是字符串引用可变。
22、StringBuffer 和StringBuilder
(1)StringBuffer是线程安全的类,性能较差,一般用于多线程并发修改内容
StringBuilder是线程不安全的类,性能较高,能满足大部分场景使用。
(2)StringBuilder类常用方法:增(append,insert)删(delete)改(setCharAt,replace)查(CharAt,indexOf,lastindexOf)转置(reverse)
23、异常
(1)在程序执行过程中发生的非预期行为,称为异常。Java 语言定义了一些异常类在 java.lang 标准包中。
(2)Error及其子类:这类异常一旦发生,当前程序无法解决。Error 用来指示运行时环境发生的错误。例如,JVM 内存溢出。一般地,程序不会从错误中恢复。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
(3)异常的处理
try.....catch.......finally:对异常进行捕获。一旦try中的代码发生异常,JVM就会寻找与之相关的catch块。
finally代码块:无论是否有异常产生,都一定会执行的代码块。如果finally代码块中存在return语句,无论是否有一场产生,finally中的返回值都会覆盖try或catch中的返回值。
- 如果try中出现异常,有与之相关的catch捕获,程序处理异常后恢复执行直到结束。
- 如果catch捕获的异常类与try中出现的异常不相同,程序还是会退出。
- 当try中有可能出现很多种异常时,且编码时也不确定到底有几种异常,可以用catch捕获Exception类型的异常。
- 如果出现多个catch块,程序之后进入一个catch块中处理。
- 可以调用printStackTrace方法输出异常的具体信息。
(4)异常抛出( throws 和 throw )
- throws用在方法声明,表示当前方法可能产生异常并且该方法不处理该异常。
- throw用在方法体内部,认为进行异常对象抛出,一般这个关键字搭配自定义异常类使用。
- 异常分为受查异常和非受查异常。受查异常是指程序编译阶段产生的异常,一旦产生必须进行异常处理。非受查异常在程序编译阶段碰到时,可以不进行异常处理,运行时出现问题再解决,RuntimeException及其子类都属于非受查异常。