目录
1. Abstract
1.1 是什么
是修饰符, 表示抽象的, 用来修饰抽象类和抽象方法
1.2 使用语法
abstract修饰的类是抽象类, 并且抽象类不能创建对象, 而且抽象类一般主要是用于被继承.
子类如果继承了抽象类, 那么需要实现所有的抽象方法, 否则该子类就需要使用abstract修饰
普通类继承抽象类需要实现所有的抽象方法
抽象类继承抽象类, 需要实现0~N个抽象方法
abstract修饰的方法时抽象方法
子类继承父类的方法时,可以用abstract修饰父类中的方法,使其变成抽象方法(该方法没有方法体),
只定义功能,不定义实现, 用于让不同子类去实现(覆写), 子类中若没有覆写抽象方法则会报错.
抽象方法必须在抽象类中, 而抽象类中可以没有抽象方法
抽象类可以被看做是特殊的类, 类可以做的他都能做, 只不过不能创建对象, 只有抽象方法而已.
注: abstract(用于被继承) 和 final(不能被继承)不能同时出现
public class Abstract_02 {
public static void main(String[] args) {
//抽象类不能创建对象
//Sup a = new Sup();
}
}
//报错The class A can be either abstract or final, not both
//abstract 和 final不能同时出现
//abstract final class A{}
abstract class A {
public A(){
}
public abstract void m1();
}
2. Interface
2.1 是什么
Interface : 定义接口的关键字
JDK1.8 之前,接口是完全抽象的,只允许出现抽象方法和常量(psf)
1.8 开始, 可以出现静态方法和默认方法(等同看成成员方法)
接口中, 没有变量只有常量(可以有局部变量), 并且psf可以省略, 接口中, 权限默认是公共的(public)
并且抽象方法abstract可以省略
接口不能创建对象, 没有构造方法, 但是能发生多态 语法: 父接口 变量 = new 子类();
2.2 使用方法
类和接口之前不再是继承关系(extend), 而是实现关系(implement), 并且是多个实现关系
多个实现用 , 逗号隔开
一个普通的类实现接口, 需要实现(覆写)所有的抽象方法
一个抽象类实现接口, 需要实现0~N个抽象方法
接口和接口是直接继承关系, 并且是多继承, 用 , 逗号隔开
继承和实现同时出现的话先写继承后写实现
如果接口和抽象类都能实现某个功能, 优先使用接口
因为类和接口是多实现的关系,如果使用接口这样会保留类继承,拓展性更强
注: 接口最好接小接口, 不要将带有没用功能的大接口接入方法, 导致代码冗杂
public class Interface_01 {
public static void main(String[] args) {
D.m4();
}
}
interface D {
// 公共的常量
int age = 2;
public static final int aa = 1;
public static int aa1 = 1;
public int aa2 = 1;
// 公共的抽象方法
void m1();
public void m2();
public abstract void m3(int age);
// 静态方法
public static void m4() {
System.out.println("静态方法");
}
// 默认方法,就是成员方法,需要创建子类对象进行调用
default void m5() {
int a = 2;
System.out.println("默认方法");
}
}
interface B {
}
interface C extends D, B {
}
// 继承和实现可以同时出现,也可以不同时出现
// 如果同时出现,则需要先写继承,后写实现
class Sub_1 extends Object implements D, B, C {
@Override
public void m1() {
}
public void m2() {
}
@Override
public void m3(int age) {
}
}
3. Object
3.1 概述
是java提供的根类, 所有类都直接或间接继承Object
java.lang.Object; 在java.lang包下, 这个包是核心包, 用该包下所有的类都不需要导入, 可以直接使用
3.2 toString
toString: 该方法代表了该对象的字符串形式的描述方式
输出一个引用类型的时候,会自动调用该对象的toString方法, 默认的toString方法时打印内存地址
如果打印不要内存地址,或者需要以特定格式打印输出,则需要我们自己覆写该方法
public String toString(){
return "里面是需要的格式";
}
@Override
public String toString() {
return "我叫" + name + ",我今年" + age + "岁了";
}
//等同于
System.out.println("我叫" + user.getName() + ",我今年" + user.getAge()
+ "岁了");
3.3 equals
equals方法的设计目的: 比较两个对象是否相等. 但是默认的equals比较的是内存地址
== : 比较基本类型是比较的值的大小, 比较引用类型,比较的是内存地址
如果我们要比较某些属性值的话, 需要我们根据需求覆写(重写)
//重新定义equals的方法
public boolean equals(Object obj) {
// 判断是不是同一个对象
if (this == obj) {
return true;
}
// 判断是否是相同类型,不同类 没有可比性
if (obj instanceof User) {
User u2 = (User) obj;
if (this.no == u2.no && this.name.equals(u2.name)) {
return true;
}
}
return false;
}
3.4 Finalize
JVM: 跨平台, 多线程, 面向对象, 自动垃圾回收
面向对象: 封装,继承,抽象,多态
垃圾: 没有任何引用指向该对象的时候, 则该对象为垃圾数据
就是堆内存中有个对象,但是谁也找不到它
垃圾在被回收的时候,会自动调用该对象的finalize方法, 是在对象生命周期要结束的时候被调用, 所有它适合做一些关闭资源等操作
finalize是没有回收功能的,只是要被回收之前被自动调用, 我们也可以手动调用finalize方法 ,但就是方法调用而已