目录
一、引言
1.1 什么是抽象
似是而非的,像却又不是;具备某种对象的特征,但不完整。
二、abstract
2.1 生活中的抽象
2.2 不该被创建的对象
- 程序是用来模拟现实世界、解决现实问题的;
- 现实世界中存在的都是“动物”具体的子类对象,并不存在“动物”对象,所以,Animal不应该被独立创建成对象。
三、抽象类、抽象方法【重点】
3.1 抽象类
应用:abstract修饰类,此类不能new对象。
- 被abstract修饰的类,称为抽象类。
- 抽象类意为不够完整的类、不够具体的类,
- 抽象类对象无法独立存在,即不能new对象。
3.2 抽象类的作用
作用:
- 可被子类继承,提供共性属性和方法。
- 可声明为引用,更自然的使用多态。
经验:
- 抽象父类,可作为子类的组成部分。
- 依附于子类对象存在。
- 由父类共性+子类独有组成完整的子类对象。
3.3 不该被实现的方法
需求:
- Dog中的eat()应输出“狗在吃骨头”。
- Cat中的eat()应输出“猫在吃鱼”。
方法声明必要,方法实现多余。
3.4 抽象方法
package com.qfedu;
// abstract 抽象
// 1. 修饰类: 不能进行new
// 1.1 可以写普通属性和普通方法
// 1.2 必须使用多态
// 2. 修饰方法: 只做声明
// 2.1 如果方法是抽象方法,那么类,必须是抽象类
// 2.2 抽象方法必须被子类重写 @Override
public abstract class Animal {
//品种
String breed;
//年龄
int age;
//性别
String sex;
//2.修饰方法,不需要方法体: 抽象方法
public abstract void eat();
public abstract void sleep();
public abstract void love();
//普通方法
public void printAnimal() {
}
}
package com.qfedu;
public class Dog extends Animal {
@Override
public void eat() {
}
@Override
public void sleep() {
}
@Override
public void love() {
}
}
package com.qfedu;
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
}
}
使用技巧: 我们重写时,并不需要所有的方法进行重写!
package com.qfedu;
public abstract class A {
public abstract void add();
public abstract void update();
public abstract void delete();
public abstract void selectAll();
public abstract void selectByKey();
}
package com.qfedu;
public class A1 extends A {
@Override
public void add() {
}
@Override
public void update() {
}
@Override
public void delete() {
}
@Override
public void selectAll() {
}
@Override
public void selectByKey() {
}
}
package com.qfedu;
//只实现查询的功能,不涉及其它 add delete update
public class A2 extends A1 {
@Override
public void selectAll() {
super.selectAll();
}
@Override
public void selectByKey() {
super.selectByKey();
}
}
四、静态属性
4.1 实例属性
实例属性是每个对象各自持有的独立空间(多份),对象单方面修改,不会影响其他对象。
4.2 静态属性
静态属性是整个类共同持有的共享空间(一份),任何对象修改,都会影响其他对象。
4.3 什么是静态
概念:
- 静态(static)可以修饰属性和方法。
- 称为静态属性(类属性)、静态方法(类方法)。
- 静态成员是全类所有对象共享的成员。
- 在全类中只有一份,不因创建多个对象而产生多份。
- 不必创建对象,可直接通过类名访问。
4.4 案例
统计一个类的对象被创建过多少次?
package com.qfedu.test04;
//功能: 统计一个类的对象被创建过多少次?
public class Test05 {
//静态属性 : 用来计数
static int count =0;
public Test05() {
count++;
System.out.println("我被创建了");
}
public static void main(String[] args) {
Test05 t1 = new Test05();
Test05 t2 = new Test05();
Test05 t3 = new Test05();
Test05 t4 = new Test05();
System.out.println(Test05.count);
}
}
五、静态方法、类加载
5.1 静态方法
5.2 静态的特点
- 静态方法允许直接访问静态成员。
- 静态方法不能直接访问非静态成员。
- 静态方法中不允许使用this或是super关键字。
- 静态方法可以继承,不能重写、没有多态。
5.3 动态代码块
运行结果:
实例属性
动态代码块
构造方法
5.4 静态代码块
运行结果:
静态属性
注:方法只有被调用才会执行。
六、final
6.1 什么是最终
概念:最后的,不可更改的。
final可修饰的内容:
- 类(最终类)
- 方法(最终方法)
- 变量(最终变量)
6.2 final类
- final修饰类:此类不能被继承。
- String、Math、System均为final修饰的类,不能被继承。
- final修饰方法:此方法不能被覆盖。
- 意为最终方法,不支持子类以覆盖的形式修改。
6.3 final变量
final修饰变量:此变量值不能被改变(常量)。
所有final修饰的变量只能赋值一次,值不允许改变。
6.4 实例常量
- 实例常量不再提供默认值,必须手动赋予初始值。
- 赋值时机:显示初始化、动态代码块、构造方法。
- 注意:如果在构造方法中为实例常量赋值,必须保证所有的构造方法都能对其正确赋值。
6.5 静态常量
- 静态常量不再提供默认值,必须手动赋予初始值。
- 赋值时机:显示初始化、静态代码块。
package com.qfedu.finalTest;
public class Test3 {
// 如果 定义的是常量 常量名一般用 大写和_
//定义窗口出现的x y
public static final int X = 100;
public static final int Y = 100;
//窗口的大小
public static final int WID_WIDTH = 400;
public static final int WID_HEIGTH = 500;
//操作游戏的方向
public static final int KING_LEFT = 1;
public static final int KING_UP = 2;
public static final int KING_RITHT = 3;
public static final int KING_DOWN = 4;
}