一、类和对象加载
1.1 类加载时机
-
先找到class文件,执行文件中的内容,把对类的描述信息加载进内存
-
加载时机:
- 创建对象
- 创建子类对象
- 调用静态变量、方法
- Class.forName(类名)
1.2 对象创建流程【无继承】
-
静态数据
- 静态变量、方法、代码块
-
实例数据
- 实例属性、方法
-
构造
- 构造代码块、构造器
1.3 对象创建流程【有继承】
- 父类的静态数据
- 子类的静态数据
- 父类的实例数据、构造代码块、构造器
- 子类的实例数据、构造代码块、构造器
Human
package com.shine.load;
public class Human {
// 属性
String name = "Human-name";
static String info = "Human-info";
// 静态代码块
static {
System.out.println("Human静态变量"+info);
System.out.println("Human-静态代码块");
}
// 动态代码块
{
System.out.println("Human实例变量"+name);
System.out.println("Human-动态代码块");
}
// 构造器
public Human() {
System.out.println("Human-构造器");
}
// 方法
}
Student
package com.shine.load;
public class Student extends Human {
// 属性
String name = "Student-name";
static String info = "Student-info";
// 静态代码块
static {
System.out.println("Student静态变量:" + info);
System.out.println("Student-静态代码块");
}
// 动态代码块
{
System.out.println("Student实例变量:" + name);
System.out.println("Student-动态代码块");
}
// 构造器
public Student() {
System.out.println("Student-构造器");
}
// 方法
}
二、final
2.1 概述
- final意为最终的不可修改的
- 可以修饰类、方法、变量
2.2 final类
-
使用final修饰的类成为最终的类,不能被继承,没有子类
-
比如
- Math
- String
- System
- ... ...
2.3 final方法
- final修饰的方法成为最终的方法,可以被继承,不能被重写
- Cannot override the final method from MyMath
package com.shine.final666;
public class Demo01 {
public static void main(String[] args) {
MyNewMath math = new MyNewMath();
double sum = math.sum(3355, 5566);
System.out.println(sum);
}
}
/**
* final修饰的类成为最终的类,不能被继承,没有子类
*/
// class MyMath extends Math{}
class MyMath {
public final double sum(double a,double b) {
return a+b;
}
}
class MyNewMath extends MyMath{
public final double sum(double a,double b) {
return a+b;
}
}
2.4 final变量【掌握】
-
final修饰的变量只能赋值一次
-
基本类型
- 数值不能改变
-
引用类型
- 地址值不能改变
-
局部常量
- 直接赋值
-
实例常量
- 对象创建完成之前赋值【直接赋值、构造代码块、构造器】
-
静态常量
- 类加载完成之前赋值【直接赋值、静态代码块】
基本和引用类型常量
package com.shine.final666;
public class Demo02 {
public static void main(String[] args) {
/**
* final修饰变量
* final修饰的变量只能赋值一次
* final修饰的基本类型变量数值不能修改
* final修饰的引用类型变量地址值不能修改
*/
int num = 10;
System.out.println(num);
num = 20;
System.out.println(num);
final int i = 100;
System.out.println(i);
// i = 200; final修饰的变量只能赋值一次
// 引用类型
final Dog dog = new Dog();
dog.name = "道哥";
dog.age = 2;
System.out.println(dog.name + "===" + dog.age);
System.out.println(dog);
dog.name = "道哥666";
dog.age = 3;
System.out.println(dog.name + "===" + dog.age);
System.out.println(dog);
// dog = new Dog();
}
}
实例和静态常量
package com.shine.final666;
public class Cat {
// 静态常量在类加载完成之前赋值
static final String INFO;// = "猫猫";
static {
INFO = "小猫猫";
}
// 实例常量在对象创建完成之前赋值
final String TYPE;// = "猫咪";
{
// TYPE = "小猫咪";
}
public Cat() {
TYPE = "小猫咪";
}
}
三、接口
3.1 概述
- 使用interface修饰的内容成为接口
- 接口表示一种规范、能力、约定
- 接口没有具体实现,需要实现类来执行具体的操作
3.2 接口中内容【掌握】
属性
- 接口中的属性默认使用public static final修饰
- 接口的属性都是公开静态常量
方法
- 接口中的方法默认使用public abstract修饰
- 接口中的方法都是公开抽象方法
package com.shine.inter;
/**
* 使用interface声明的内容是接口
*/
public interface USB {
// 属性都是公开静态常量,默认使用public static final修饰
String USB_VOLTAGE = "5.0V";
public static final String USB_VERSION = "Version 2.0";
// 方法默认都是公开抽象方法,默认使用public abstract修饰
void usbPower();
public abstract void usbTransfer();
}
3.3 接口的创建和使用
package com.shine.inter02;
public class Demo01 {
public static void main(String[] args) {
/**
* 接口
* 游泳的能力
* 跳跃的能力
* 飞翔的能力
* 抽象类
* Animal
* 子类
* Dog
* Bird
*/
Dog dog = new Dog();
System.out.println(dog);
Swimable swimable = new Dog();
}
}
interface Swimable{
void swim();
}
interface Jumpable{
void jump();
}
interface Flyable{
void fly();
}
abstract class Animal{
String type;
String color;
int age;
String info;
public abstract void eat();
public abstract void sleep();
}
/**
* Dog类
* 继承Animal 获取到Animal中所有的属性和方法
* 实现了Swimable和Jumpable 获取到接口中的属性和方法
*/
class Dog extends Animal implements Swimable,Jumpable{
@Override
public void jump() {
}
@Override
public void swim() {
}
@Override
public void eat() {
}
@Override
public void sleep() {
}
}
/**
* Bird类
* 继承Animal 获取到Animal中所有的属性和方法
* 实现了Flyable 获取到接口中的属性和方法
*/
class Bird extends Animal implements Flyable {
@Override
public void fly() {
}
@Override
public void eat() {
}
@Override
public void sleep() {
}
}
3.4 接口和类的关系
类和类的关系
- 继承,单继承,多级继承
接口和接口的关系
- 继承,多继承
接口和类的关系
- 实现,多实现
3.5 练习
接口
TypeC
HeadPhone
Mic
Board
HDMI
SD
RJ45 网线接口
VGA
抽象类
Computer
实现类
MiComputer
MacBook
测试类
创建子类对象调用方法
3.6 接口的多态【掌握】
- 接口可以声明为引用类型,更自然的使用多态
- 接口声明的引用类型只能调用接口中的方法,不能调用实现类中独有的方法和属性
package com.shine.inter02;
public class Demo01 {
public static void main(String[] args) {
/**
* 接口
* 游泳的能力
* 跳跃的能力
* 飞翔的能力
* 抽象类
* Animal
* 子类
* Dog
* Bird
*/
/**
* 正常创建对象,把Dog对象看做是Dog类型的变量:把狗当做狗
* 能使用Dog中和Dog继承得到的所有属性和方法
*/
Dog dog = new Dog();
/**
* 多态方式创建对象
* 把Dog对象看做是Animal类型的变量:把狗当做动物
* 只能使用Animal中声明的属性和方法
* 如果Dog重写了方法,展示重写之后的效果
*/
Animal a = new Dog();
/**
* 多态方式创建对象:接口的多态
* 把Dog对象看做是会游泳的对象
* 只能调用Swimable中声明的属性和方法
* 如果Dog重写了方法,展示重写之后的效果
*/
Swimable swimable01 = new Dog();
/**
* 动态方式创建对象:接口的多态
* 把Bird对象看做是会游泳的对象
* 只能调用Swimable中声明的属性和方法
* 如果Bird重写了方法,展示重写之后的效果
*/
Swimable swimable02 = new Bird();
}
}
interface Swimable{
void swim();
}
interface Jumpable{
void jump();
}
interface Flyable{
void fly();
}
abstract class Animal{
String type;
String color;
int age;
String info;
public abstract void eat();
public abstract void sleep();
}
/**
* Dog类
* 继承Animal 获取到Animal中所有的属性和方法
* 实现了Swimable和Jumpable 获取到接口中的属性和方法
*/
class Dog extends Animal implements Swimable,Jumpable{
@Override
public void jump() {
}
@Override
public void swim() {
}
@Override
public void eat() {
}
@Override
public void sleep() {
}
}
/**
* Bird类
* 继承Animal 获取到Animal中所有的属性和方法
* 实现了Flyable 获取到接口中的属性和方法
*/
class Bird extends Animal implements Flyable,Swimable{
@Override
public void fly() {
}
@Override
public void eat() {
}
@Override
public void sleep() {
}
@Override
public void swim() {
}
}
3.7 接口和抽象类的异同
相同点
不同点
3.8 常量接口
package com.shine.inter03;
public interface Constant {
// 公司相关
String COMPANY_NAME = "XXX有限责任公司";
String COMPANY_ADDRESS = "";
// 域名 && 服务器
String URL = "http://www.xxx.com";
// 转发重定向
String DORWARD = "forward";
String REDIRECT = "redirect";
}
3.9 接口回调【熟悉】
1、Boss调用Worker.work方法
传入自己这个对象 + 任务信息
2、工人调用Boss监听的方法
boss.giveWork --> worker.work --> boss.onWorkFinish
OnWorkFinishedListener
package com.shine.inter04;
/**
* 监听工作完成情况
*/
public interface OnWorkFinishedListener {
void onWorkFinish(String info);
}
Boss
package com.shine.inter04;
/**
* Boss类
* 管理者
* 调用工人工作的方法
* 被调用监听的方法
*/
public class Boss implements OnWorkFinishedListener {
// 工人
private Worker worker;
/**
* 有参数的构造器
* @param worker
*/
public Boss(Worker worker) {
super();
this.worker = worker;
}
/**
* 给工人分配工作【调用工人工作的方法】
* @param workInfo
*/
public void giveWork(String workInfo) {
worker.work(this,workInfo);
}
@Override
public void onWorkFinish(String info) {
System.out.println("收到工人"+worker.getName()+"反馈信息:" + info);
}
}
Worker
package com.shine.inter04;
/**
* 工人
* 工作
* 给Boss反馈信息【调用Boss中监听的方法】
*
*/
public class Worker {
private String name;
public Worker(String name) {
super();
this.setName(name);
}
/**
* 工人工作的方法
* @param boss 分配任务的人
* @param workInfo 分配的任务
*/
public void work(OnWorkFinishedListener boss, String workInfo) {
System.out.println(this.name + "接到任务:" + workInfo + ",开始努力工作...");
// 反馈信息--回调
boss.onWorkFinish(workInfo + "已经完成25%");
boss.onWorkFinish(workInfo + "已经完成50%");
boss.onWorkFinish(workInfo + "已经完成75%");
boss.onWorkFinish(workInfo + "已经完成100%");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Demo01
package com.shine.inter04;
public class Demo01 {
public static void main(String[] args) {
/**
* 测试类
* Demo01
* 接口
* 监听工作完成状态【实现了接口的对象是管理者】
* 类
* Worker
* work 干活
* Boss【实现接口】
* 分配工作【调用工人工作的方法】
* 监听工作完成情况【被工人调用】
*/
// 创建对象
Worker worker = new Worker("张三");
Boss boss = new Boss(worker);
// 分配任务并监听任务情况
boss.giveWork("挖坑埋自己");
}
}