继承
基本概述
概念: 所谓的继承,就是生活中的继承. 比如"子承父业","儿子继承父亲的财产". 在Java中指的是"子类继承父类的代码"
格式:
public class 子类 extends 父类{
}
注意:
1.Java只支持单继承,不支持多继承,但支持多层继承.
2.继承必须是逻辑能讲得通的继承
3.构造方法不能被继承
优缺点
优点:
1.提高了代码的复用性(少写代码了).
2.提高了代码的维护性(修改起来更方便了)
缺点:
1.增强了耦合性,降低了子类的独立性.
2.继承就必须全继承,不能部分继承.
成员特点
成员变量: 遵循就近原则. 子类局部变量 -> 子类成员变量 -> 父类成员变量
成员方法: 遵循就近原则. 子类成员方法 -> 父类成员方法
构造方法: 子类构造方法默认会调用父类无参构造方法.如果父类没有无参构造,则报错.
super
代表含义: this代表本类 super代表父类
成员变量: this.成员变量 super.成员变量
成员方法: this.成员方法 super.成员方法
构造方法: this(...) super(...)
方法重写Override
概述: 当父类和子类出现一模一样的方法,那这两个方法之间的关系,就称之为"方法重写".又叫做"方法覆写,方法覆盖".
特点: 子类中出现和父类一模一样的方法.
场景: 对父类方法不满意时,重写父类方法.
访问修饰符
权限修饰符
private: 只能在本类内部访问,出了当前类,就不能用了.
缺省(不写): 在同一个包中可以访问.
protected: 在同一个包中,或在子类中,可以访问.
public: 在任何地方都可以访问.
状态修饰符
final: 最终
static: 静态
abstract: 抽象
final
概述: 最终的,不可改变的.可以用来修饰"类,成员方法,成员变量".
特点:
修饰类: 该类是最终类,不能被继承,
修饰方法: 该方法是最终方法,不能被重写.
修饰变量: 该变量是常量,不允许被再次赋值.
注意:
修饰基本数据类型变量: 变量中记录的值不允许改变.
修饰引用数据类型变量: 变量中记录的地址不允许改变.
static
概述: 表示静态,可以修饰"成员变量,成员方法".
特点:
1.被static修饰的成员变量,被类的所有对象共享.
2.被static修饰的成员方法,可以被"类名.成员方法"调用.
3.静态只能访问静态.
多态
概述
概念: 所谓的多态,指的就是"多种形态",简单来说,就是"一种事物,在不同的环境下,表现出不同的状态".
特点:
1.有继承或实现关系(多态的前提).
2.有方法重写(多态的意义)
3.有父类或父接口引用指向子类对象(多态的核心)
访问
访问成员变量: 编译看左边(父类),运行看左边(父类)
访问成员方法: 编译看左边(父类),运行看右边(子类)
优缺点
优点: 提高了代码的扩展性(把父类当作方法的参数,调用方法时,可以传递任意的子类).
缺点: 不能使用子类特有的功能.
转型
向上转型: 其实就是自动类型转换,一般是"父类引用指向子类对象".
向下转型: 其实就是强制类型转换.一般是"把父类引用转为子类引用"
instanceof
格式: boolean result = 对象 instanceof 类型;
运算:
如果"对象"是该"类型"的对象,则返回true.
如果"对象"不是该"类型"的对象,则返回false.
抽象
概述
概述: 抽象在Java中使用abstract表示,abstract关键字可以修饰"方法,类".
概念:
被abstarct修饰的类,被称之为抽象类.
被abstarct修饰的方法,被称之为抽象方法.
特点
抽象类:
1.抽象类不能实例化.
2.抽象类的子类,必须重写抽象类中的所有抽象方法,除非子类也是抽象类.
抽象方法:
1.抽象方法所在类必须是抽象类
2.抽象方法可以看作是一种规则,子类必须重写
接口
概述
概述: 接口是一种比抽象类更加抽象的类层次的结构,定义的一种规范.
语法:
定义接口: public interface 接口名{}
实现接口: public class 子类 implements 接口名{}
注意
1.实现接口的子类,必须重写接口中的所有抽象方法.除非子类也是抽象的.
2.类和接口的关系是实现关系,使用implements关键字实现.
成员
变量: 只能是静态常量.默认修饰符是 public static final
方法: 只能是抽象方法.默认修饰符是 public abstract
构造: 没有构造方法.
相关扩展
类和接口关系
类和类之间: 继承关系,只能单继承,不能多继承,但可以多层继承.
类和接口之间: 实现关系,可以单实现,也可以多实现,还可以在继承的同时实现接口.
接口和接口之间: 继承关系,可以单继承,也可以多继承.
接口和抽象类
内容:
抽象类: 成员变量,成员方法,构造方法,静态常量,抽象方法
接口: 静态常量,抽象方法.
意义:
抽象类: 抽象类是一个类,定义的是一个类别.抽取的是子类的共有内容.
接口: 接口不是类,抽取的是"共有的功能/规则"
场景:
抽象类: 如果类中包含抽象方法,则该类定义为抽象类.
接口: 如果类中只有抽象方法,则该类就可以变成接口
接口新特性
① 默认方法
格式:
public default void 方法名(){
方法体
}
作用:
子类可以重写该方法,子类也可以不重写该方法.
注意:
JDK8之后才能用.
② 静态方法
格式:
public static void 方法名(){
方法体
}
作用:
可以直接通过"接口名.方法"来调用.
注意:
JDK8之后才能用.不建议使用.
③ 私有方法
格式:
private void 方法名(){ 方法体 }
private static void 方法名(){ 方法体 }
作用:
静态私有方法是抽取"静态方法的公共部分". 非静态私有方法是抽取"默认方法的 "
注意:
JDK9之后才能用.不建议使用.
内部类
基本概述
概述: 定义在"类的内部"的类,就称之为"内部类".
分类:
局部内部类: 放在方法内部的"内部类",就是局部内部类
成员内部类: 方法类中方法外的"内部类",就是成员内部类.
常规内部类
① 成员内部类
概述: 成员内部类是放在"类中方法外"的内部类.
格式: 外部类.内部类 对象名 = new 外部类().new 内部类();
注意:
1:实际开发中,一般不用成员内部类
2:如果要用,一般也会把内部类私有化
② 局部内部类
概述: 局部内部类是放在"方法中"的内部类
作用: 放在方法中的内部类,方法执行完毕之后,就会被销毁,可以节省内存.
匿名内部类
概述: 匿名内部类,就是"局部内部类"的简化格式.
格式:
new 父类/父接口(){
//重写方法
}
注意:
匿名内部类 -> 本质上是一个"实现类父类或父接口的子类的对象"
Lambda表达式
基本概述
概述: Lambda表达式就是"匿名内部类"的简化格式. 依据"可推断可省略"原则,进行优化.
快捷: 鼠标点击灰色区域 -> Alt + 回车 -> 回车
格式: (参数) -> { 方法体代码 }
语法特点
语法要求:
1:父层次必须是"接口"
2:父接口中"有且仅有一个抽象方法"
省略规则:
1:参数类型可以省略.
2:如果参数只有一个,则()可以省略.
3:如果代码只有一句,则"{},分好,return"都可以省略
Lambda和匿名内部类的区别
所需类型:
Lambda: 只能是接口
匿名内部类: 啥都行.
要求不同:
Lambda: 接口"有且仅有一个抽象方法"
匿名内部类: 没要求.
编译不同:
Lambda: 编译后不会产生class文件(会在内存中产生class文件,用完之后立即销毁).
匿名内部类: 会产生class文件,文件名"外部类$xxx.class"
API
概念:
API: API指的是"Java提前做好的那些类".
API文档: 指的是"Java提前做好的类的说明书."
操作:
1.打开API文档
2.在左边索引位置下边的搜索框中,填写"你要找到类的名称",找到之后,点击回车
3.看右边,类的说明
4.看右边构造方法(有了构造方法才能创建对象)
5.看普通方法(普通方法就是该类提供的功能)
Math
概述: Math类中,定义了"和数学运算有关系的功能"
方法:
public static int abs(int a)
public static double ceil(double a)
public static double floor(double a)
public static int round(float a)
public static int max(int a,int b)
public static int min(int a,int b)
public static double pow(double a,double b)
public static double random()
System
概述: 里边包含了一些和系统有关系的方法.
方法:
public static void exit(int status);
public static long currentTimeMillis();
public static void arraycopy(数据源, 开始位置, 目的地, 目标位置, 拷贝个数);
Object
概述: Object是一切类的父类,所有的类都继承自Object.
方法:
public String toString();
public boolean equals(对象);
Objects
概述: 专门用来操作对象的工具类
方法:
public static boolean isNull(Object obj);
public static boolean nonNull(Object obj);
BigDecimal
概述: BigDecimal是一个高精度的double类型数据.专门用于double类型的高精度运算.
构造:
public BigDecimal(double d);
public BigDecimal(String s);
方法:
public BigDecimal add(另一个BigDecimal对象)
public BigDecimal subtract(另一个BigDecimal对象)
public BigDecimal multiply(另一个BigDecimal对象)
public BigDecimal divide(另一个BigDecimal对象)
public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式)
public BigDecimal setScale(精确几位,舍入模式)
补充:
BigDecimal.ROUND_UP
BigDecimal.ROUND_FLOOR
BigDecimal.ROUND_HALF_UP
包装类
概述
概述: 就是基本数据类型对应的"引用数据类型形式",一般用于"基本数据类型和String之间的相互转换"
组成:
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
char -> Character
boolean -> Boolean
注意:
所有包装类,除了类名不一样之外,其功能和操作方式几乎一模一样.
补充
装箱: 把"基本数据类型"变为"与之对应的包装类"
自动装箱: 指的就是自动发生的装箱操作 -> JDK5
拆箱: 把"包装类"变为"与之对应的基本数据类型"
自动拆箱: 指的就是自动发生的拆箱现象 -> JDK5
Integer
概述: Integer是int类型的包装类
转换:
int num = Integer.parseInt("数字类型字符串");
String s = 数字 + "";
String s = String.valueOf(数字);
Arrays
概述: 专门操作数组的工具类.
方法:
public static String toString(int[] arr);
public static void sort(int[] arr);
public static int binarySearch(int[] arr, int key);
递归
概述: 递归指的是"方法自己调用自己的现象".
步骤:
1.先定义方法(参数是不固定的n)
2.在方法中,书写规则(规律).
3.用"已完成的方法",修复"语法性错误".
注意:
1.递归必须要有结束的标记.
2.递归次数不能太多