day10
一/多态
1.定义:事物的多种形态
2.多态的前提:要有父子关系,要有方法重写,要有父类引用指向子类对象
3.注意事项:可以做哪些工作看父类类型,实际做工作看子类对象;优点:提高了代码的扩展性,维护性,可以当做形参,用来接收任意类型的子类对象---缺点:不能使用子类的特有属性和方法
二/多态成员访问的特点
1.成员变量:编译看左边(父类) 运行看左边(父类) 静态绑定,一般情况使用极少,成员变量一般都是私有化
2.成员方法:编译看左边(父类) 运行看右边(子类) 动态绑定----子类中如果对父类的方法进行了重写,父类中的方法无论如何都无法被访问,这也是java动态绑定的结果---动态绑定会选择最优执行的方法,只要子类重写了父类的方法,无论在什么地方调用,都会先找到子类
3.静态方法:编译看左边,运行看左边(父类)
小结:所有多态成员访问的话,只有成员方法运行的时候会根据子类,其他都是根据父类来定
三/多态转型
1.向上转型:将子类对象看做是父类类型,也就是我们平时使用的多态形式,这种情况下,无法调用子类特有的功能
2.向下转型:将父类引用指向子类的对象在转回子类类型
Son son = (Son)father;
这种转型是有危险的,因为是强制性的,一旦转向的类型跟这个对象不匹配,就会报错java.lang.ClassCastException(类型转换异常,属于运行时异常)
四/final关键字
1.定义:final表示最终的,无法被修改的
2.final修饰的特点:修饰类,类不能被继承
修饰变量,变量就变成了常量,只能被赋值一次(初始化的时候赋值)
修饰方法:方法不能被重写
3,final修饰局部变量
基本数据类型,是值不能被改变;引用数据类型,是地址值不能被改变,对象中的属性可以被改变;final可以修饰形参
4.final修饰成员变量的初始化时机
必须手动赋值;初始化完毕之前;类初始化完成之前(静态)
五/抽象类
1.定义:抽象类没有具体的代码实现,只是为了规定方法的基本属性,然后由子类去实现具体的代码,抽象类主要是为了定义规则而存在的
2.特点:
<1:抽象类和抽象方法必须用abstract关键字修饰
<1>abstract class 类名{}
<2>abstract 返回值类型 方法名();
<2:抽象类不一定有抽象方法,但是有抽象方法一定是抽象类或者接口
<3抽象类不能实例化,必须由子类继承并重写抽象方法来实例化
<1>要么是抽象类,要么重写抽象类中的所有抽象方法(普通类)
3.抽象类成员方法的特点
抽象方法,强制要求子类做的事情,非抽象方法,子类继承的方法,提高代码的复用性
4.优点:
强制子类实现父类的方法功能
提高代码的扩展性,便于后期的维护
形成一套规范(*)
六/java值传递的三种方式
1.基本数据类型值的传递
基本数据类型传递的是值,也就是将具体的值赋给变量名,所以变量名代表的是具体的值
2.引用数据类型传递的是地址值
当一个对象赋值给一个对象名,是将这个对象在内存中的地址值传递给对象名---实例对象在堆内存中是有一个16进制的地址值
3.String值的传递
String比较特殊,他虽然是一个引用变量,但是传递的是具体的值,String首先是在堆内存汇总创建一个对象,对象里面封装的常量值,然后将数值放入到常量池中,在指向String
总结:基本数据类型传递的是值,引用数据类型传递的是地址
七/接口
1.定义:接口其实就是抽象类的升级版,接口里面都是抽象方法---从狭义上来说,接口就是java中的interface---从广义上来说,对外提供规则的都是接口
2.特点:
接口用关键字interface表示---interface 接口名{}--接口中方法上的abstract关键字可以省略
类实现接口implements表示---class类名 implements 接口名{}
接口不能实例化---接口按照多态的方法实例化
接口的子类:可以是接口,使用extends来继承,可以是抽象类,但意义不大,可以是实体类,要重写接口中的所有抽象方法(主要使用)
接口中的成员变量必须是静态的,最终的,公共的,也就是常量(static final关键字可以省略)
接口可以继承接口
八/类,接口之间的关系
1.类与类
继承关系,只能单继承,不能多继承,但是可以多层继承
多层继承,子类继承父类,父类继承祖父类
如果多个父类出现相同的方法,无法区别
2.类与接口
实现关系,可以单实现,也可以多实现,在继承类的同时,可以多实现
多个接口中出现了名称和参数列表相同的方法,但是返回值不同,会报错
3.接口与接口
继承关系,可以单继承,也可以多继承
如果多个父类出现了相同的,子类用谁的都可以
day11
一/设计模型之模板模型
1.定义
使用接口指定规则,然后子类根据实现布偶听的方法内部代码(子类根据规则,实现成不同功能的模板)
实现类暴露的可用方法必须和接口中相同
二/成员内部类
1.定义:内部类就是在类的内部定义另一个类
2.使用:
内部类可以直接访问外部类的成员包括私有---外部类名.this.成员
外部类调用内部类方法,必须先创建对象
内部类名 对象 = 内部类对象
内部类 对象名= new 内部类()
如果别的类要访问内部类的成员,就必须创建对象
外部类名.内部类名 对象名 = 外部类对象,内部类对象
外部类.内部类 对象名 = new 外部类().new 内部类()
Outer.Inner inner = new Outer(). new Inner();
inner.innerMethod();
3.内部类的权限
内部类的权限和成员方法一样,可以有private默认 protected public
外部类只能是public 和默认的
private效果等同于私有化方法,别的类无法直接调用,但是外部类可以调用,可以通过方法return回去
我们完全可以把内部类当做是一个类中的方法来看待
内部类同时具有方法和类的所有权益
三/静态内部类
1.定义:使用static关键字修饰内部类
2.使用:调用静态内部类内部的非静态方法
外部类名.内部类名 对象名 = new 外部类名.内部类名();
调用静态内部类内部的静态方法:外部类名.内部类名.方法()
静态内部类调用外部类的非静态方法
必须先new出外部类然后才能调用
3.注意事项
内部类中如果有静态方法,那么内部类就必须也是静态的
内部类是静态的,并不意味着内部类的方法就都是静态的,只是说明我们可以绕过外部类对象直接找到内部类来使用
四/局部内部类
1.定义:定在类中的方法中的内部类叫做局部内部类(用的很少)
2,使用:
局部内部类的作用范围仅限于本方法中国
局部内部类在访问他所在方法中的局部变量必须用final修饰
因为当调用这个方法时,局部变量如果没有用final修饰,他的声明周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,既使方法弹栈,常量池的常量还在,也可以继续使用
jdk1.8取消的这个定义,,其实不是取消了,是设置为了隐式的
五/匿名内部类
1.定义
匿名内部类局势内部类的简写形式,相当于是一个没有名字的子类
匿名内部类用于定义接口的或者类的子类
2.使用
前提是必须存在一个类,或者接口
这里的类可以是具体的类也可以是抽象类
相当于是有一个没有名字的子类继承或者实现一个类或者接口,然后从写里面的方法,本质是一个继承了该类或者实现了改接口的匿名子类对象
多用于规则简单,子类使用很少的接口应用中
格式:new 类名或者接口名(){
重写方法
}
六/异常
1.定义:异常是指java程序在运行过程中出现的问题
2.分类
error错误 致命的错误,比如数据库崩溃服务器宕机
exception异常 局部行的错误
编译时异常---因为语法不规范,对待吗没有进行预制处理导致的异常,编译器可以检查出来,如果不处理,编译器无法通过
运行时异常,导致程序停止运行---编译时期不报错,运行时报错 ; 常见的角标越界,空指针等都是运行时异常,也就是只有运行起来才发现的,这是程序员犯得错误
七/异常的处理
1.jvm是如何处理异常的
运行时出现异常,jvm打印异常信息,并停止运行
2.手动处理异常的两种方式
抓取异常并处理,对异常进行处理后,程序依然可以继续执行
手动抛出异常,程序会在抛出异常的点上停止运行并将异常信息抛出
3.抛出异常方式
使用throws关键字在方法声明后抛出异常---接收到异常的方法要么抛出要么处理---方法声明的异常类型必须大于等于程序中出现的异常诶下才能抛出
4.注意事项
多个catch处理异常时,遵循从上往下的原则,上面如果有catch可以处理,西面将不在执行,所以我们应当将小的异常放在上面,大的异常放下面
无论什么情况,只要try...catch体系执行了,final中的代码一定会执行,除非虚拟机退出,System.exit(0)
final主要是释放资源
day12
一/二维数组
1.定义:所谓二维数组就是数组中存放数组,外层数组中存储的是数组的引用
2.初始化
静态初始化:
现制定数组中的内容,长度有jvm判断
数据类型[][] 数组名 = new 数组类型[][]{{},{}}
数据类型[][] 数组名 = new {{},{}}
动态初始化:
现制定数组的长度,jvm会给数组附上默认值
数据类型[][] 数组名 = new 数组类型[数组的长度][数组的长度]
二/权限修饰符
1.什么是权限修饰符
权限修饰符是为了确定类或者类成员的使用范围
2.java中权限修饰符
private 类中
默认(什么都不写) 类中 包下
protected 类中 包下 别的包的子类(子父类调用)
public 类中 包下 别的包的子类 其他包
三/java中的包
1.定义
其实就是路径,和电脑中的文件夹是一个意思,java中的类名前面要加上包名才是完整的类的路径,记住,java主程序运行的地方就算作根路径
java程序想要从硬盘上找类文件,就会从当前位置找 包名+类名(最外层包所在的路径)
2.导入包
我们写程序的时候,一般都是直接写类名,编译器会默认给我们加上当前类的包名,如果发现当前包下没有这个类的话,或者这个类不是我们需要的,那么就需要我们手动添加包名
有两个方式:在类的前面写上包名;使用import关键字在类的上方导入
注意:如果是用*号引入包的话,当前类和导入的包下有相同的类,默认使用本包下的
3.注意:
程序中不能出现两个包名类名都相同的类
无法使用import关键字导入两个名称相同的类,因为编译器无法分清到底要使用哪一个
四/Objcet类
1.定义:
所有类的基类,所有的类都是直接或者间接继承Object类
2.常用方法
<1 hashCode()
public int hashCode()
返回该对象的哈希码值,默认情况下,该方法会根据对象的地址来计算
不同对象的,hashCode()一般来说不会相同,但是,同一个对象的hashCode()值一定相同
<2 toString()
public String toString()
返回该对象的字符串表示
默认的方法返回的数据一般对我们没有意义,建议重写
javaBean中一定要去重写,别的类中重写的概率很低
<3 equals()
比较当前对象和指定对象内容是否"相等"
默认情况下比较的地址值是否相等
在我们日常逻辑总弄个,比较地址值是否相等没有意义,建议重写(重写之后比较的就是类中的成员变量的值是否一样)
<4 ==和equals的区别
==是一个比较运算符,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值
equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Objcet类中的equals方法,equals方法和==号比价引用数据类型无区别,重写后的equals方法比较的是对象中的属性
equals相等的两个对象hashCode一定相同,(默认二者同步重写) equals不等的两个对象,hashCode也有可能相同
建立在equals和hashCode同步重写的情况下
<5 getClass()
public final Class getClass()
返回此对象的类,可以借字节码获取到类所有的基础结构属性
五/String类
1.定义
String类代表字符串,java程序中所有的字符串字面值(如"abc")都为此类的实例实现.我们可以将字符串看做是String,但是严格上来说,String还是一个类,只是比较特殊罢了
2.特殊性
String类型的变量可以引用地址---String类型的变量可以直接指向常量---String对象的长度是不可变的,如果两个字符串拼接长一个字符串,其实是创建了一个新的字符串对象
3.常用的构造方法
public String();空构造
public String(byte[] bytes) 把字节数组转成字符串
public String(byte[] bytes ,int index,int length) 把字节数组的一部分转成字符串
public String(char[] value);把字符数组转换成字符串
public String(char[] value,int index,int count)把字符数组的一部分转换成字符串
public String (String original)把字符串常量值转成字符串
4.常用的判断方法
boolean equals (Object obj):比较字符串的内容是否相同,区分大小写
boolean equalsIgnoreCase(String str):比较字符串的内容 是否相同,忽略大小写
boolean contains(String str) 判断大字符串中是否包含小字符串
boolean startsWith(String str) 和endsWith(String str):判断字符串是否以某个指定的字符串开头或者结尾
boolean isEmpty():判断字符串是否为空
5.常用的获取方法
int length:获取字符串长度
char charAt(int index)获取指定索引位置的字符
int indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引,ch是字符的码表值
int indexOf(String str )返回指定字符串在此字符串中第一次出现处的索引
int indexOf(int ch,int fromIndex),返回指定字符在此字符串中从指定位置后第一次出现处的索引
int indexOf(String str,int fromIndex)返回指定字符串在此字符串中从指定位置后第一次出现处的索引
int lastIndexOf同上
String substring(int start)从指定位置开始复制字符串,默认到末尾
String substring(int start,int end)从指定位置到结束位置复制字符串
6.常用的转换方法
*byte[] getBytes():把字符串转换成字节数组
*char[] toCharArray()把字符串转换成字符数组
*static String valueOf(char[] chs)把字符数组转换成字符串
*static String valueOf(int i)把int类型转换成字符串
*注意:String类的valueOf方法可以把任意类型的数据转换成字符串
- String toLowerCase():把字符串转成小写(了解)
- String toUpperCase():把字符串转成大写
- String concat(String str):把字符串拼接
7.替换方法
*String replace(char old,char new)将字符串中的一部分字符用新的代替
*String replace(String old,String new)将字符串中的第一部分字符串用新的代替
8.切割方法
*String[] split(String regex)按照规则来切割字符串
*String[] split(String regex,int limit)按照规则切割字符串,limit表示总共切成几段(也就是数组的长度)
9.其他常用的方法
*trim();去除字符串前后的空格
*int compareTo(String anotherString):按字典顺序比较两个字符串(大小写)
*int compareToIgnoreCase(String str):按字典书序比较两个字符串(忽略大小写)