1 final
1.1 概述: final是一个关键字,最后的,最终的.被final修饰的内容是不能再被改变的
1.2 可以修饰的内容
1.3 空白final
1.3.1 概述:指被声明为final但又未给定初值的域,但是无论什么情况,编译器都确保空白final在使用前必须被初始化(例如:将变量的赋值推迟到构造函数进行)
1.3.2 优点
空白final在final的使用上提供了更大的灵活性,因为一个类中的final域可以做到根据对象而有所不同,却又保持其恒定不变的特性
2 abstract:抽象的
2.1 概述:制定规则,具体的由子类实现
2.2 抽象类的功能
(1)节省代码
(2)可以制定一批规则
2.3 注意点
2.4 【比较】普通类和抽象类
2.5 其它
(1)子类继承到的抽象方法实现时,要与父类中对应的抽象方法返回类型、参数列表相同
2.6 【代码】
public class Demo4 {
public static void main(String[] args) {
/*
* 用抽象类实现---练习
* 求圆和矩形的面积
*/
Circular xry1 = new Circular();
System.out.println(xry1.getArea(2.0, 1.0));
Rectangle xry2 = new Rectangle();
System.out.println(xry2.getArea(4.0, 2.0));
}
}
abstract class Area{
abstract public double getArea(double a, double b);
}
class Circular extends Area{
final static double PI = 3.14;
public double getArea(double a, double b) {
return PI*a*a;
}
}
class Rectangle extends Area{
public double getArea(double a, double b) {
return a*b;
}
}
3 interface:接口
3.1 概述:使Java间接实现了多继承(一般接口中不写成员变量,只写方法–只写规则,又将接口称为方法列表)
3.2 构成
3.3 其它
(1)接口可以与父类同时存在
(2)一个子类只能由一个父类,但可以有多个接口
(3)一般父类中放的时主要功能,接口中放的是额外的功能,接口作为父类的补充
(4)接口不可以直接创建对象
(5)接口与接口之间可以存在继承关系(包括多继承)
(6)如果某个类继承的多个接口里面的重名方法已经实现,则在该类中必须重写该方法。
3.4 【代码】
public class demo01 {
public static void main(String args[]) {
WeChat xry1 = new WeChat();
System.out.println(xry1.Pay("xry", "OJ123456"));
Alipay xry2 = new Alipay();
System.out.println(xry2.Pay("xry", "OJ123456"));
}
}
interface pay{
public boolean Pay(String account, String money);
}
class WeChat implements pay{
public boolean Pay(String account, String money) {
System.out.println("WeChat Pay!");
return true;
}
}
class Alipay implements pay{
public boolean Pay(String accoutn, String money) {
System.out.println("Alipay Pay!");
return true;
}
}
4 设计模式
4.1 概述:前人总结出来的对一些常见问题的解决方案,后人直接拿来使用
4.2 常用的设计模式:单例、工厂、代理、适配器、装饰、模板、观察者等,一共有23种
4.3 单例
4.3.1 概述:一个类只允许有一个对象,建立一个全局的访问点,提供出去以供使用
4.3.2 分析:
(1)肯定要建立一个单例类来描述
(2)只允许有一个对象
(3)全局的访问点–通过static实现的
(4)提供出去以供使用
4.3.3 作用:
(1)传值
(2)作为全局的访问点(将一部分的功能从部分变成全局的(将功能全局化))
4.3.4 优点:
可以让两个对象在完全没有关系的前提下,实现值的传递,降低了耦合性,提高了内聚性
4.3.5 分类:
4.3.5.1 饿汉式
4.3.5.2 懒汉式
4.3.6 单例的内存
4.3.7 【样例】通过单例传值
4.3.8 Runtime类
5 多态
5.1 概述:一种事物的多种形态
5.2 多态存在的三个必要条件
(1)继承
(2)重写
(3)父类引用指向子类对象
Parent p = new Child();
5.3 【比较】继承、多态
5.4 其它
(1)父类的引用可以调用父类的方法,但是不能调用子类的方法
原因:编译阶段只能识别=号前面的引用类型,不会识别=号后面的对象
5.5 多态的优点、缺点
(1)优点:可以提高代码的扩展性,使用之前定义好的功能,后面直接拿来使用,不用再创建新的方法
(2)缺点:只能直接调用父类有的方法,不能直接调用子类特有的方法
(3)代码如下:
public class Demo9 {
public static void main(String[] args) {
//总结:优点:可以提高代码的扩展性,使用之前定义好的功能,后面直接拿来使用,不用再创建新的方法.实例在Demo9
Dog dog = new Dog();
Cat cat = new Cat();
Pig1 pig = new Pig1();
Animal animal = new Animal();
feedAnimal(dog);
feedAnimal(cat);
feedAnimal(pig);
}
//喂狗,喂猫,喂动物
public static void feedAnimal(Animal animal) {//animal = dog = new Dog() 多态
animal.eat();
}
}
class Animal{
public void eat() {
System.out.println("动物吃");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃");
}
}
class Pig1 extends Animal{
public void eat() {
System.out.println("猪吃");
}
}
5.6 向上转型、向下转型
5.6.1 概述
总结:向下转型是经过向上转型之后又转回来
Animal a = new Cat();
Cat c = (Cat)a;
5.7 instanceof运算符
5.7.1 构成:对象 instanceof 类/子类
5.7.2 作用:判断当前的对象是否是后面的类或者子类的对象,是则返回true,不是则返回false
5.7.3 应用:进行容错处理,增加用户体验
5.7.4 【样例】
5.7.5 其它
(1)instanceof前后必须要有继承关系
5.8 多态下成员的使用
5.8.1 概述
继承中子类与父类出现同名的属性,父类的会被覆盖掉
多态中子类与父类出现同名的属性,编译与运行都看父类
5.8.2 【样例】
6 Object类
6.1 概述
Object是所有类的父类,任何类都默认继承Object。Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的所有方法。
6.2 方法
6.2.1 equals():比较的是两个对象的地址
6.2.2 hashCode():获取的对象的哈希码值,在一个工程内,可以当做当前对象的身份证(唯一的标识)
6.2.3 toString():默认获取到的是包名+类名+@+哈希码值,当我们直接打印引用的时候,默认调用的时toString()方法
6.2.4 getClass():获取当前对象的字节码文件对象
6.2.5 clone():
7 Class类
7.1 概述
Class类的实例表示正在运行的Java应用程序中的类和接口。
7.2 使用
调用class属性得到对应的字节码文件(类名.class)
int.class
Child.class
8 内部类
8.1 概述:定义在一个类的内部的类,内部类的地位与外部类的成员变量、成员方法平等,内部类也可以看做是外部类的成员,成员之间可以相互调用
8.2 调用内部类成员的方式
8.3 功能
8.3.1 间接实现多继承
8.4 局部内部类
8.4.1 概述:定义在一个类方法中的类
8.4.2 作用范围:从定义开始到当前的方法结束
8.4.3 其它
8.5 静态内部类
8.6 匿名内部类
8.6.1 概述:除了 new Object()外所有的匿名都属于匿名内部类
8.6.2 创建匿名内部类对象注意点
(1)匿名内部类对象必须有父类或者父接口
8.6.3 匿名内部类对象的作用
(1)当只用到当前子类的一个实例对象的时候,定义好马上使用
(2)当不好起名字的时候
(3)可以更好的定义运行时的回调(知道即可)
8.6.4 匿名子类对象
8.6.5 匿名内部类基本形式
8.6.6 匿名对象、匿名内部类作为参数
8.6.7 匿名对象、匿名内部类作为返回值
8.7 内部类的作用