A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Eclipse快捷键

Alt + ↓ or ↑ 移动代码
Alt + / 内容辅助
Ctrl + D 删除整行
Ctrl + N 新建
Ctrl + 2,L 补全代码
Ctrl + Shift + F 格式化(调整格式)
Ctrl + / 注释单行
Ctrl + Shift + / 注释多行(选中状态) ; Ctrl + Shift + \ 取消注释多行(选中状态)
Ctrl + Shift + O 导包
Shift + Tab 代码前进
Alt + Shift + M 快速构造方法(选中代码)
Idea快捷键

Alt + Enter 导入包,自动修正代码
Ctrl + Y 删除光标所在行
Ctrl + D 复制光标所在行的内容,插入到光标位置下面
Ctrl + Alt + L 格式化代码
Alt + Ins 自动生成代码,如toString,get,set等方法
Alt + Shift + 上下箭头 移动当前代码行
Ctrl + / 注释单行或取消
Ctrl + Shift + / 注释多行或取消
Alt + 4 打开上一次运行的控制台
Shift + Tab 选中状态下的代码前进一个制表符
判断条件.循环关键词 可以快速生成一个循环语句
数组名称.fori 快速生成一个正序遍历数组的for循环
数组名称.forr 快速生成一个倒序遍历数组的for循环
Shift + Enter 向下插入一个空行
按住Ctrl + 左右方向键 跳转到上一个或下一个的代码的首尾处
按住Ctrl + 上下方向键 光标位置不动,上下移动滚动条
Ctrl + Alt + M 选中代码自动抽取并放入一个新创建的方法
Shift + F6 统一重命名(变量或文件)
Ctrl + N 查找并进入一个类
Java常用

\t 隔开一个tab键的距离
\r\n 回车
MS-DOS(Disk Operating System)

命令提示符(cmd)可以在windows中模拟DOS里绝大多数的功能
启动:Win+R,输入cmd
切换盘符:盘符名称:
前进:cd 下一级或多级路径名可以使用tab进行自动填充或切换
后退一级:cd ..
后退到根路径:cd \
显示当前文件夹目录:dir(directory)
清屏:cls
此电脑界面只是一个用户界面,在dos窗口中并不存在
黑马10基础重要图解

04.06Java中的内存分配图解
04.09两个数组指向同一个地址的内存图
07.08一个对象的内存图
07.09方法共用的内存图
07.10两个引用指向同一个对象的内存图
09.02对象数组内存图
10.09FileReader读取数据的两种方式图解
基础概念

Day01

计算机存储单位

1 Byte字节 = 8 bit位(代表一个0或1)
每逢8位是一个字节,这是数据存储的最小单位
1KB = 1024 Byte
JVM(Java Virtual Machine)

Java虚拟机

JRE(Java Runtime Environment)

Java运行环境,包含JVM以及核心类库

JDK(Java Development Kit)

Java开发工具包,包含JRE以及开发工具(编译工具Javac,运行工具Java等),提供给开发人员使用

面向对象三大基本特征

封装
继承
多态
访问修饰符

public 公共的
private 私有的
protected 受保护的
关键名词

class类;method方法;变量;Integer整数的包装类

强制转换

类型 变量名 = (类型)(被转数据);

导入

import -- General -- Existing Projects into Workspace

标识符

在程序中自定义的名称
英文字母,数字,$,_
不能以数字开头
不能是关键字
类名:所有首字母大写
变量名和方法名:首字母小写,后面所有首字母大写
字符

字符参与加减法运算时,拿字符的ASCⅡ码值进行运算
字符串参与运算时,变成字符串的拼接
命名规则

常见的命名规则 见名知意;

包:就是一个文件夹,用于分类管理文件; 全部小写,多个单词,之间用点隔开; 通常是公司域名倒着写; com.itcast.demo; com.baidu.demo;
类: 一个单词,首字母大写; Student Person 多个单词,每个单词首字母大写; HelloWorld
方法和变量: 一个单词,全部小写; age, add(); 多个单词,从第二个单词开始,首字母大写; maxAge; getAge(); getMax();
常量:字符串常量,整数常量,浮点数常量,字符常量,布尔常量,空常量
final int NUMBER = 10; final int NUMBER_MAX = 10; 一个单词,全部大写; 多个单词,全部大写,每个单词之间用下划线隔开;
基本数据类型

整数型,浮点型,字符型,布尔型
浮点数类型使用科学计数法,更省空间
数值范围与内存占用(字节数)不一定相关,
浮点型为近似值,非精确值
浮点数类型中默认类型为double,使用float时要加后缀F
整数型默认类型为int,使用long时要加后缀L
引用数据类型

字符串,数组,枚举,类,接口,Lambda
Object

类 Object 是类层次结构的根类,每个类都使用Object作为超类
变量

在同一个作用域内,变量名不可以重复
变量在没有赋值之前不能使用
超出作用域的变量也不可以使用
Day02

数据类型转换

byte,short,char -- int -- long -- float -- double
byte,short,char可以直接进行数学运算,且在运算的时候,会先被提升成为int类型,再运算
规则是数据范围从小到大(与字节数不一定相关)
强制转换:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据;
强制转换有可能会导致数据溢出或精度损失
boolean类型不能发生数据类型转换
ASCII(American Standard code for Information Interchange)

美国信息交换标准代码
48-0
65-A
97-a
Unicode万国码
运算符

++ 与 --,在单独使用时,放前放后无区别
在混合使用的时候,放前面先加后用,放后面先用后加
对字符串String来说,加号代表字符串连接操作
只有变量才能自增自减运算,常量不可发生改变
复合赋值运算符,隐含强制转换,例如:a = (a的类型)(a + 10)
比较运算符

比较运算符中,如果进行多次比较,不可以连写使用
逻辑运算符

^(异或),不同为true,相同则为flase
逻辑运算:&&和&结果一样,||和|结果一样
当&&左边为false时,右边的表达式不再运算,具有短路效果(3>4 && a < 100,此时a不运行)
当||左边为true时,同样具有短路效果
只能用于boolean值
逻辑运算符如果有多个条件可以连续写
三元运算

数据类型 变量名称 = 条件判断 ? 表达式1 : 表达式2
方法

方法就是将一个功能抽取出来,把代码单独定义在一个大括号内
当需要使用这个功能的时候调用,增加了代码的复用性
方法的先后顺序不影响使用,方法的定义不能产生嵌套包含的关系
键盘录入(Scanner)

在一个类中的位置顺序:package > import > class; 导包快捷键:Shift + Ctrl + O

编译器的两点优点

对于赋值,如果右边没有超过左边的范围,编译器会隐含地帮我们补上一个强转
如果右侧超过了左侧的数值范围, 那么编译器会直接报错
编译器的常量优化:在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量,那么编译器javac将会直接将若干个变量表达式计算得到结果
Day03

switch

switch后面的表达式只能为四种基本数据类型:byte,short,int,char;两种引用数据类型:String字符串,enum枚举
case后面的数字(标签)不可以重复
case具有穿透效果,所以正常情况下要加break;
循环语句

基本结构:初始化语句,条件判断,循环体,步进语句
while循环标准格式:
while (条件判断) {
    循环体
}

while循环扩展格式:
初始化语句;
while (条件判断) {
    循环体;
    步进语句;
}

do-while循环拓展格式:
do {
    循环体;
    步进语句;
}while (条件判断);
凡是循环次数确定的场景多用for循环,否则多用while循环

关键字

break用在switch语句中,一旦执行,可以让switch语句结束;
break用在循环语句中,可以结束整个循环,中断
continue 表示结束本次循环,跳过当次循环剩余的内容,进行下一次循环
default 表示系统默认值
反复执行

利用

while(true) {
    循环语句
    if(判断条件) {
        语句题;
        break;
    }
}
来实现语句的反复调整执行

死循环

while (true) {
    循环体;
}

for(;;) {
    循环体;
}

死循环后面的语句无法执行,会直接报错
循环的区别

当你明确知道将要循环的次数时,用for循环;
当你不知道要循环多少次,就用while的死循环;然后再循环体里面去控制何时中断循环;break
break是跳出当前循环,如果要跳出外层循环,就需要在循环之前加标记,例如out: 然后在break后加标记名;
Day04

IDE

Integrated Development Environment 集成开发环境
用于提高Java开发效率的软件
IntelliJ IDEA
方法

方法的格式:

修饰符 返回值类型 方法名称(参数类型 参数名称,...) {
    方法体;
    return 返回值;
}
方法的三种调用方法:单独调用,打印调用,赋值调用
步骤:
找到方法
参数传递
执行方法体
带着返回值回到方法的调用处
一个方法中可以有多个return语句,但是要保证同时只有一个return语句会被执行到,两个return不能连写
return的两个作用:1.停止当前方法;2.将后面的返回值还给调用处
方法注意事项

写方法时需要先明确:A.返回值类型 ; B.参数列表(明确有几个参数,参数的数据类型)
有明确返回值的方法调用:A.单独调用,无意义 ; B.输出调用,有意义,但是不一定要把结果输出 ; C.赋值调用,推荐方式
没有明确返回值的方法调用:A.void类型方法的调用 ; B.只能单独调用
方法中的数据改变不影响其他方法中的数据
基本数据类型作为方法中的参数,形式参数的改变不会影响实际参数
引用数据类型作为方法中的参数,传递的是一个地址值,形式参数的改变将直接影响实际数据
形式参数:用于接收实际参数的变量
实际参数:实际参与运算的参数(变量)
选中代码,Alt + Shift + M,快速构造方法
遇到使用数组作为形参的方法首先要进行一次非空判断: if (arr == null) { }
void

void修饰没有明确返回值类型的方法,只能单独调用此方法
无返回值的方法中可以用return,目的是为了提早结束方法
局部代码块

用于限定局部变量的生命周期

重点:为了使while循环里的id能被外面访问到,就把id定义在循环的外面,然后在循环内直接使用
方法的重载与重写

方法重载(overload):同一个类中,方法名相同, 参数(参数个数,参数类型,多类型参数顺序)不同,与返回值类型.参数名称无关;
方法重写(override): 在子父类关系中,两个参数列表和返回值类型完全相同的方法,就叫方法的重写;
Day05

数组

int[] array;定义了一个int类型的数组,数组名为array
int array[];定义了一个int类型的变量,变量名为array[]
编号的专业叫法:索引, 数组名[索引]
数组初始化

动态初始化先指定数组的长度,但是内容还没填
静态初始化指定内容,直接将内容填入
内存分配

栈(Stack):存储局部变量:方法的参数或方法{}内部的变量 ; 用于执行方法,执行完之后,立刻回收 ; (局部变量:定义在某个方法或类中的变量)
堆(Heap):存储声明(new)出来的对象(实体),堆内存中的东西都有一个地址值(16进制),堆内存的中的数据都有默认值
方法区(Method Area):存储.class(字节码文件)相关信息,包含类中的信息,(面向对象)(类以及类里面的成员变量和成员方法)
本地方法栈(Native Method Stack):与操作系统相关
寄存器(PC Register):给CPU使用
堆内存中数据类型的默认值

byte,short,int ,long :0
float,double :0.0
char:'\u0000'
boolean false
引用数据类型 null
程序退出

System.exit(0); //JVM退出
或者return;
数组

引用数据类型,如数组new出来后得到是一个地址值,指向堆中的一个内存区域
引用数据类型的赋值实际上是将地址值赋值过去
数组中的两个异常:
ArrayIndexOutOfBoundsException: 数组索引越界异常(原因:访问了不存在的索引)
NullPointerException: 空指针异常(原因:因为引用变量不在指向堆内存中的对象);解决方案:做非空判断
数组名称.length;//获取数组的长度
数组一旦创建,长度无法改变,想要改变只能重新new
数组的反转通过一个临时变量作为倒手进行反转
数组作为方法的参数,实际上是将地址值传递过去
数组作为方法的返回值,实际上也是讲地址值传递返回
定义一个数组1,将数组1赋值给数组2,会将地址值传递过去,此时重新定义数组1,得到一个新的地址值,但不会影响数组2的地址值,且重新定义数组2,得到新地址值,也不会影响数组1的地址值
数组的遍历

数组的遍历是为了拿到所有元素,不仅为了打印

引用数据类型

类,接口,数组等 ; 常量中的特殊,空常量--null,可以赋值给引用数据类型,且引用类型的默认值为null
引用数据类型不管是作为方法的参数还是返回值,实际上都是传递的地址值,并且的在方法中进行改变时,都会影响实际的数据
利用纯数组和循环去重思路

先遍历判断重复,重复的元素全部变0,只留第一个
然后定义一个计数变量,遍历数组判断不为零的元素有多少个
然后定义新数组,定义一个卡位置的int数,然后遍历新数组,内嵌套遍历老数组,判断不为零的元素,并赋值给新数组,同时在每次内循环都卡位置的数加一,防止重复,赋值的时候同时打印
引用数据

当参数为引用数据类型时,第一件事即为做非空判断
Day06

类的基础概念

类是一组相关属性和行为的集合
类中含有成员变量和成员方法,相当于事物的属性和行为
对象是某类事物的具体体现
成员变量:与变量的定义一样,但位置不同,一般在类中,方法外,不需要给初始值
成员方法:与方法的定义一样,但不需要static关键字
使用一个类就是使用该类的成员(成员变量与成员方法)
想要使用一个类的成员,要拥有该类的对象
引用数据类型的赋值实际上是将地址值传递给新的变量
类的注意事项

成员变量是直接定义在类中,方法外
成员方法不要写static关键字
类的使用

导包:import 包名称.类名称;对于和当前类属于一个包下的类,可以不用导包
创建:类名称 对象名=new 类名称();
使用:成员名.成员变量名;成员名.成员方法名(参数);
对象的内存使用

进栈也叫压栈,先调用的方法的在下面,后调用该的方法在上面
出站也叫弹栈,栈内存中的方法执行完立即消失
当一个对象赋值给另一个对象时,实际上是将地址值赋值过去了,修改数据时对两个对象都产生影响
当一个对象作为参数,传递到方法中去的时候,实际上是传递的是对象的地址值
作为返回值时也是传递对象的地址值
成员变量与局部变量的区别

位置不同:
成员变量在类中,方法外
局部变量在方法内或方法声明上(形式参数).
初始化值不同:
成员变量有默认初始化值
局部变量没有初始化赋值,先定义再赋值
作用范围不同:
成员变量整个类中都可以使用
局部变量只有在方法中才可以使用,出了方法不能再用
在内存中的位置不同:
成员变量在堆内存中
局部变量在栈内存中.
生命周期不同:
成员变量随对象而存在,随对象被垃圾回收而消失
局部变量随方法调用进栈存在, 调用完毕弹栈则消失
封装

封装的原则:将不需要对外暴露的细节隐藏,把成员变量隐藏,对外提供间接的访问方式
方法和关键字private都是一种封装
将代码用方法进行封装,提高代码的复用性和安全性
private

通过关键字private修饰成员变量,并通过方法控制成员变量使用与修改,提高代码的安全性
被private修饰的成员在本类中可以随意访问,但超出本类范围不能直接访问
间接访问private成员变量,就定义一对Getter/Setter方法
如果返回值是boolean类型,Getter的名称的get要改为is
Java的修饰符

修饰符分为访问控制修饰符和非访问控制修饰符
public:表示公有的,可以修饰类,属性和方法,如果被public修饰,则可以被包内的其他类,对象一级包外的类和对象访问
private:只能修饰成员变量和成员方法,被修饰后只能在所在的类中使用
protected:表示受保护,只能用来修饰成员变量和成员方法,访问权限是类本身,包内的所有类和它的所有子类(包括同包的和不同包的)
默认修饰符:默认访问控制成员可以被这个包中其他类访问,称之为包访问特性
final:
就近原则

如果有局部变量名和成员变量名相同,在局部使用的时候,采用的是就近原则
this

this代表所在类的对象引用(方法被哪个对象调用,this就代表哪个对象)
构造方法

名称必须和类名完全一样
无返回值类型,也不写void
无具体的返回值
可以写return,作用是用来结束方法
注意:不写构造方法时系统会默认提供一个无参构造,但是写了构造方法以后系统不提供
构造方法侧重于初始化,初始化后不可再调用
标准类

一个标准的类也叫Java Bean,有以下四个组成部分:
所有成员变量用private修饰
为每一个成员变量编写Getter和Setter方法
无参构造方法
有参构造方法
类名

类名作为形式参数,则需要该类的对象
类名类名类名作为返回值,返回该类的对象
断点

移除多个断点的办法,再Debug视图中,找到Breakpoints,Remove All Breakpoints
Day07

API(Application Programming Interface)

Application Progaramming Interface,应用程序编程接口,是JDK中提供的使用的类的说明文档
导包

在使用不是Java.lang包下的类需要先利用import导包
Scanner

System.in代表从键盘进行输入
sc.next();获得键盘输入的一个字符串,以空格为结束
接收字符串数据:
String s = sc.nextLine();
Scanner.nextInt();并不是用回车作为结束标记,所以如果下面有一个nextLine()会被直接接到,需要用一个nextLine()接收回车
匿名对象

new 类名称().调用;
匿名对象只能使用唯一的一次,下次必须重新再创建
匿名对象可以作为参数也可以作为返回值
Random

使用Randum中的有参构造,可以得到一个左闭右开区间,可取左不可取到右
对象数组

对象数组实际上是将对象类的地址值传递进去
和数组一样,长度不可变
ArrayList<E>(对象的集合)

集合的优势是可以随意改变长度,是大小可变的数组的实现,初始化长度为10
<E>:泛型,是指装在集合当中的所有元素,全部统一的什么类型;泛型只能是引用类型,不能是基本类型,因为集合里面保存的都是地址值
泛型是JDL1.5后出现的类型,但实际上这个类型并不存在,实际使用中还是需要用其他的数据类型填入
使用:在出现E的地方我们使用引用数据类型替换即可,从JDK1.7以后开始,右侧的尖括号里面可以不写内容,但是<>本身还是要写的
学集合,使用集合的成员方法,用方法先创建对象,创建对象先了解构造方法
空集合直接打印,会打印一对[],当有多元素时,会用逗号分隔
如果new一个ArrayList对象,同时不给泛型,则该集合可以添加不同类型的元素
ArrayList常用方法

增加:
public boolean add(E e);//将指定的元素添加到此列表的尾部。
void add(int index, E element);//将指定的元素插入此列表中的指定位置,原来的元素会自动往后移
对于ArrayList集合来说,add添加动作一定是成功的,但是对其他集合来说,add添加动作不一定成功

删除:
public E remove(int index);//根据索引删除元素,返回被删除的元素

查:
public E get(int index);//返回集合中指定索引处的元素
public int size();//获取集合的长度,返回值是集合中包含的元素个数
public boolean contains(Object o)//如果此列表中包含指定的元素,则返回 true
修改:
set(int index ,Object obj);//修改指定位置上的元素
list.set(index,list.get(index2));//将一个元素替换另一个元素
Collections.shuffle(ArrayList<E>);//将集合中的元素打乱顺序
ArrayList的扩容机制

ArrayList具有长度可变和自动扩容的特点,其扩容机制为设置一个增长因子,当达到集合长度0.75倍时,就将老数组的长度增加到原来的1.5倍,把老数组中的数据通过System.arrayCopy()方法复制到新数组中去
基本数据类型的包装类

如果希望往集合中储存基本数据类型,就必须使用基本数据类型的包装类
int --Integer
char -- Character
其他都是首字母变大写
从JDK1.5+开始,支持自动装箱,自动拆箱,即基本类型<-->包装类型
String s = Integer.toString(int i);//将int类型的数据转为String类型
int i = Integer.parseInt(String s);//将String类型的数据转为int类型
int类型的包装类

ArrayList.add(1);这里增加的整数1,并不是基本数据类型,实际上是int的包装类型integer
Day08

String(字符串)

程序中所有的双引号字符串都是String类的对象
字符串被创建出来后不可改变,是一个常量
字符串效果上相当于char[]字符数组,底层是byte[]字节数组
字符串的常量池

字符串不可改变,所以可以被安全的共享使用
程序中直接写上的双引号字符串就存储在堆内存(JDK1.7以前在方法区)的字符串常量池里,是为了方便字符串的重复使用(其他的构造方法的new出来的对象,地址值不同)
而new出来的对象是先在堆内存中开辟空间后,再将字符串存储在方法区常量池中 String类型中方法,如果返回值是String,那么必须定义变量接收,否则为无意义
int类型转为String类:Integer.toString(int i);
数据的比较

基本数据类型:==代表比较基本数据类型的值是否相同
引用数据类型:==代表比较地址值是否相同
String类的构造方法(常用)

public String;//创建一个空白字符串
public Stirng(char[] array);//将字符数组转换为字符串
public String(byte[] array);//将字节数组转换为字符串
String类的功能方法

无论是拼接,截取,原字符串都不会改变,因为字符串不会改变,当字符串被重新赋值时,实际上直接将对象保存的地址值改变了
判断:
public boolean equals(Object obj);//进行内容比较(区分大小写)
public boolean equalsIgnoreCase(String str);//忽略大小写(指英文中的大小写),进行内容比较
boolean starsWith(String str);//判断字符串对象是否以指定的str开头
boolean endsWith(String str);//判断字符串是否以指定的str结尾
equals使用注意事项:任何对象都能用Object接收;equals方法具有对称性,即a.equals(b)和b.equals(a)效果相同;比较一个常量和一个变量,将常量字符串写前面,避免空指针异常
获取:
public int length();//获取字符串的长度,即字符的个数
public String concat(String str);//将当前字符串与参数字符串拼接为一个新的字符串
public char charAt(int index);//获取指定索引位置的单个字符
public int indexOf(String str);//获取str在字符串首次出现的索引,如果没有则返回-1
public int indexOf(int ch, int fromIndex);//返回在此字符串中第一次出现指定字符处的索引,并从指定的索引开始搜索
public String substring(int start);//从start处开始截取字符串
public String substring(int start,int end);//从start开始,end结束截取字符串(截取结果包括左边 不包括右边)
转换:
public char[] toCharArray();//将字符串拆成字符数组返回
public byte[] getBytes();//获得字符串底层的字节数组
public String toLowerCase();//把字符串转换为小写字符串
public String toUpperCase();//把字符串转换为大写字符串
public String replace(CharSequence oldString, CharSequence newString);//用newString字符串替换所有的oldString,并以新串返回,利用这个功能可以实现删除字段
字节数组在IO流常用到
分割:
public String[] split(String regex);//按照指定符号分割字符串(. ? + * 不能随意作为分割符号,如要用必须加\\,意为转义)

其他功能:
public String trim();//去除字符串两端空格
字符数组与字符串

字符数组可以直接转为字符串

char[] chs = .....;
String ss = new String(chs);
static的特点

关键字,用于修饰成员变量和成员方法
成员变量被static修饰时,变量就属于所在类,被该类所有的对象共享
方法被static修饰成为静态方法,属于类,可以直接通过类名或接口名调用,也可以通过对象名调用
而且对于本类中的静态方法,可以直接省略类名调用
static的内存加载

static修饰的变量或方法在方法区的静态区里面加载
static随着类的加载而加载,优先于对象的加载,由于这个原因:
变量和方法都是静态的时候,可以不需要创建对象,直接调用
静态修饰的方法可以访问静态的成员变量和成员方法
静态方法中不可以访问非静态成员变量和成员方法,因为别人还没加载出来
静态方法在编译器中会相当于类名.方法名(),所以代表当前对象的this在静态方法中不可用
优点是可以节省堆内存空间,缺点是只能访问静态
static使用

可以在成员变量中定义一个计数器,每当new了一个新对象时,private static int Count,在构造方法中增加计数,并使用
代码块

静态代码块被static修饰,随着类的加载而加载,且只加载一次
用于一次性地对成员变量赋值,常用于JDBC
static {
    //静态代码块内容
}
构造代码块抽取类的共性,每次创建对象时,都会加载一次,优先于构造方法加载
局部代码块用于控制变量的生命周期(作用域)
数组工具类Arrays

java.util.Arrays是一个与数组相关的工具类,提供了大量的静态方法
public static String Arrays.toString(数组);//将数组变为变成字符串
public static Object Arrays.binarySearch(数组,Object o);//在数组中搜索是否有符合的内容,并返回索引
public static void sort(数组);//按照默认升序对数组的元素进行排序
使用sort方法时,如果是自定义类型的数组,那么自定义的类需要有Comparable或者Comparator接口的支持
数学工具类Math

java.util.Math数学相关工具类,提供大量静态运算相关方法
public static double abs(double num);//获取绝对值
public static double ceil(double num);//向上取整
public static double floor(double num);//向下取整,抹零
public static long round(double num);//四舍五入
Math.PI代表近似的圆周率常量
Day09

继承

继承是多态的前提
继承主要解决的问题:共性抽取
父类也称基类,超类;子类也称派生类
public class 子类名称 extends 父类名称{}
父子类中的方法使用问题:创建的对象是谁,就优先用谁,如果没有则向上找
继承的三个特点

Java语言只能有一个直接父类
Java语言可以多级继承
一个父类可以有多个子类
继承中的成员变量的访问特点

在父子类的继承关系中,如果成员变量重名,则创建子类对象时,有两种访问方式:
直接通过子类对象访问成员变量:看等号左边是谁,就优先用谁,没有则向上找
间接通过成员方法访问成员变量:看该方法属于谁,就优先用谁,没有则向上找
重写(Override)

方法名称一样,参数列表也一样,也称覆盖重写
将@Override写在方法前面,用来检测是不是有效的正确覆盖重写,可选
子类方法的返回值范围必须小于等于父类方法
子类方法的权限必须大于等于父类方法的权限修饰符
使用:在子类新的方法中覆盖重写父类的方法,并利用super调用父类的方法,子类再添加新的内容
子类中的重名变量

局部变量:在局部作用域中直接使用
本类中的成员变量:this.变量名
父类中的成员变量:super.变量名
super关键词

子类构造方法中默认隐含一个super(),super的父类构造调用,必须子类构造的第一个语句
访问父类的成员变量:super.变量名;
访问父类的成员方法:super.方法名();
在子类的构造方法中,访问父类的构造方法:super();
本类的构造方法中,访问本类的另一个构造方法:this.另一个构造方法名();这叫构造方法的重载构造==>this(...);调用必须是构造方法的第一语句,且不能与super同时调用只能唯一
实际上子类必定会调用父类的构造方法
抽象

如果父类当中的方法不确定如何实现{}方法体,那么这就应该是一个抽象方法
抽象方法:加上abstract关键字,去掉大括号,加分号结束
抽象方法所在的类必须是抽象类,同样加abstract修饰
不能直接创建new抽象类对象(实例化),因为抽象方法没有具体的方法体,创建没有意义
必须用一个子类来继承抽象父类,并且要覆盖重写父类中所有的抽象方法(去掉abstract,补上大括号)
抽象方法和抽象类的注意事项

抽象类中可以有构造方法,但是只由子类对象通过构造方法super();调用
抽象类中可以不用含有抽象方法,但是有抽象方法必须保证在抽象类中
没有任何抽象方法的抽象类,一般用于设计模式的适配器模式中
如果一个抽象类的子类想不全部重写父类所有的抽象方法,那就只能把自己也变成抽象类
此时要创建对象只能再由一个子类继承,而且最下面的子类同样会继承在直接父类中没写,但是其他父类中存在的方法
Day10

接口(Interface)

接口就是一种公共的规范标准
public interface 接口名称{//接口内容}
换成了关键字interface之后,编译生成的字节码文件仍然是.class文件
Java7接口可包含的内容:常量,抽象方法
Java8接口可包含的内容:默认方法,静态方法
Java9接口可包含的内容:私有方法
接口的抽象方法定义

接口中的抽象方法,修饰符只能用两个关键字:public,abstract
可以选择性的省略,但省略其实也还是public和abstract
不管写不写修饰符,接口中的方法都是抽象方法
接口同样需要一个实现类来使用
格式:public class 实现类名称 implements 接口名称{//...}
一般实现类可以起名为:接口名Impl
同样如果实现类不全部重写接口中所有抽象方法,自己就也需要是抽象类
接口中的默认方法

默认方法的格式:public default 返回值类型 方法名称(参数列表) {方法体}
public可省略但不可改为其他访问权限修饰符
接口的中的默认方法,可以解决接口升级的问题
接口中的默认方法可以被接口实现类对象直接调用
接口中的默认方法可以被接口实现类进行覆盖重写,优先调用本类中的方法,没有则向上找
Lambda表达式和函数式编程中,接口的默认方法可以拼接函数模型
接口中的静态方法

接口中的静态方法不可以被接口的实现类的对象调用
而是直接接口名.静态方法名();(接口实际上就是一个类)
public同样可省不可改
接口中的私有方法

Java9
接口中的私有方法主要是为了解决多个默认或接口方法之间重复代码需要抽取成一个方法,同时又不让外部访问的问题
分为普通私有方法:private 返回值类型 方法名称(参数列表) {方法体}
静态私有方法:private static 返回值类型 方法名称(参数列表) {方法体}
接口中的常量

接口中可以定义"成员变量",格式:public static final 数据类型 常量名称 = 数据值;相当于常量
三个修饰词可以省略但不可以改变
因为常量不可变,所以必须赋值
推荐命名规则:全部大写,并用_作为分隔
接口注意事项

接口中不能有静态代码块和构造方法
实现类可以同时实现多个接口,用逗号隔开即可,需要重写接口中所有的抽象方法,重复的只需要写一次
如果没有全部覆盖重写,则需要把自己也变成抽象类
多接口中如果存在重复的默认方法,则实现类一定要对冲突的默认方法进行覆盖重写
继承优先于接口实现:如果直接父类中的方法与接口中的默认方法产生了冲突,优先用父类当中的方法
接口之间的多继承

类与类之间只能单继承,直接父类只能有一个
一个类可以实现多个接口
接口可以同时继承多个接口
多个父接口中的抽象方法重复没关系
多个父接口中的默认的方法如果重复,那么子接口必须进行默认方法的覆盖重写,带default
多态(Polymorphism)

extends继承和implement实现,是多态性的前提
多态就是一个对象拥有多重形态
multi,多个
格式为:父类(或接口) 对象名 = new 子类(或实现类)名称();父类引用指向子类对象
意为一个子类可以被当做父类来看待(向上转型),而且同样是先调用子类中的成员方法
多态中的成员方法

多态中成员方法的访问规则是:看new的是谁就优先用谁
即编译时会先通过父类查找是否有该方法,而实际运行时会先从子类中开始找该方法运行
多态的好处

多态的好处是为了保证创建对象时左边名称的统一性,同时右边new需要的子类,具有灵活性
而且编译时会看父类或接口,但实际运行时会先从子类中或实现类开始
多态的向上转型

多态写法其实就是向上转型,右侧创建一个子类对象,把它当做父类来看待
向上转型一定是安全的,例如基本数据类型的自动转换,从小范围转向了大范围
但是向上转型的弊端是,无法调用子类原本特有的内容
多态的向下转型

为了解决向上转型的弊端,可以进行一个还原
格式:子类名称 对象名 = (子类名称) 父类对象;
必须保证对象本来创建时和还原时的子类对象类型一致,如果本身不是某个子类类型,还原时会发生ClassCastException,类型转换异常
为了保证还原的一致性,可以用instanceof关键字进行类型判断
格式:boolean result = 对象名 instanceof 类名称
StringBuilder类

StringBuilder是可变的字符序列,又称字符串缓冲区类,其内容可变(最大的用处也是为了做字符拼接)

常用成员方法:
public int capacity();//返回当前容量
public int length();//返回长度(字符数)
容量为理论值,长度为实际值
public StringBuilder append(任意类型);//追加任意类型的数据到该字符串中
public StringBuilder reverse();//将字符串翻转
StringBuilder与StringBuffer的区别

StringBuilder:非同步,可以多线程执行
StringBuffer:同步,每次只允许一个线程执行
其他部分相同
String与StringBuilder相互转换

StringBuilder(String s);//把String转成一个StringBuilder对象
toString();//把StringBuilder对象转成String对象
链式编程

例如

sb.append("Hello").append(",World!").append(true).append(123456);
IO流(IO流技术)

IO流是用来处理设备之间的数据传输,例如文件复制,上传文件和下载文件
IO流分为:输出流(File Writer)和输入流(File Reader)
对Java程序来说读数据是输入流,写数据是输出流
输出流写数据的步骤:A.创建输出流对象;B.调用输出流对象的写数据的方法;C.释放资源
创建输出流对象的时候做了哪些事情:A.调用系统资源创建了一个文件;B.创建输出流对象;C.把输出流对象指向文件
FileWriter(写数据,输出)

构造方法:
FileWriter(String fileName);//创建一个输出流对象,并指向fileName这个文件
FileWriter(String fileName, boolean append);//创建一个输出流对象,并指向fileName这个文件,是否追加数据
成员方法:
void write(String str);//往fw对象里写数据,但并没有直接写到文件,而是内存缓冲区
void flush();//写完数据后必须刷新才能成功,刷新后流对象还可使用
void close();//当语句执行后,可以通知系统释放和该文件相关的资源,并且close方法带有刷新的动作,但执行后流对象就不可以用了
数据的换行:windows系统中的记事本识别的换行为\r\n;(linux:\n;mac\r)
数据的追加写入:FileWriter(String fileName, boolean append),系统默认状态为false
FileWriter写数据的五个方法

void write(String str);//写一个字符串数据
void write(String str,int index,int len);//写一个字符串中的一部分数据
void write(int ch);//写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值.'a',97;
FileWriter的write方法可以自动将int类型的转换为字符,会保持原来的数据

void write(char[] chs);//写一个字符数组数据
void write(char[] chs,int index,int len);//写一个字符数组的一部分数据
读写文件--复制文本文件

方式一:利用int类型一次读写一个字符会将int型转换为char类型
注意,读取文件时的所有数据为字符类型;同时虽然void write(int)会将int转成char类型,但是由于是一个一个读,一个一个写的,所以对源文件的内容不会产生影响
方式二:利用char[]类型一次读取一个字符数组
实际开发中,定义字符数组时,数组长度一般定义为1024或1024的整数倍.
FileReader(读数据,输入)

成员方法:
int read();//一次读一个字符数据
int read(char[] arr);//一次读一个字符数组,返回读取到的字符有效个数
如果读取的数据值是-1,就说明没有数据了,这也就是循环的结束条件

复制文件

读取数据源
选择目的地,选择目标文件(若没有文件则会新建文件)
利用循环将数据写到目标文件中
Buffered(字符缓冲流)

字符缓冲流的底部也是使用基本流
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入;
BufferedWriter的构造方法只能用write类,例如
BufferedWriter bw = new BufferedWriter(new FileWriter("文件名.格式"));
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
同理,BufferedReader的构造方法也只能用Reader类
BufferedReader br = new BufferedReader(new FileReader("文件名.格式"));
缓冲流的特殊功能

BufferedWriter
对于IO流中Writer的写入功能,其实质是将原来文件中的数据全部清空后写入
也就是说IO流的使用离不开中介容器
如果要不清空原来的数据在文件中进行追加,要用后面加true的构造方法
FileWriter(String fileName, boolean append);//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
void newLine();//写一个换行符,这个换行符由系统决定
BufferedReader
Stirng readLine();//一次读取一行数据,但是不读取换行符
复制文本文件的五种方式

如果一个方法本身抛出了异常,那么调用时也需要先抛出异常
首先为源文件名和目标文件名定义一个变量
读写同一文件

当操作同一个文件的时候,读和写要分开,先读取并储存在容器中,再声明方法,将数据写进去

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马