Interface
是什么
interface 是定义接口的关键字
语法:Interface 接口名 {} 和定义class一样,就是把class换成了interface
接口的出现 解决了java 单继承带来的功能变弱问题
- 接口中只有常量没有变量, public static final 简称psf 并且可以省略
- 接口中没有构造方法,不能创建对象,但是依然可以发生多态
- 一个类只能继承一个类,但是可以实现多个接口,多个节口用逗号隔开
- 接口和接口之间是可以多继承的,多个用逗号隔开
- java1.7接口中只有抽象方法和常量
- java1.8开始.接口中可以编写静态方法和default方法(可以看做成员方法)
- 接口中的抽象方法,public abstract都可以省略
使用方式
interface A {
// 接口默认类型public static final不需要写
int a = 1;
public static final int b = 2;
// 常量一般名字全部大写
int MAX_VALUE = 13132311;
// 接口中方法默认是public abstract
void m11();
public void m13();
public abstract void m12();
}
public static void main(String[] args) {
B.m21();
Sub sub=new Sub();
sub.m22();
}
interface B {
// 接口名.方法名调用
public static void m21() {
System.out.println("静态方法");
}
// 需要通过子类对象调用
default void m22() {
System.out.println("默认方法等同于成员方法");
}
}
//implements 是实现,如果继承和实现都存在,则先写继承再写实现
//一个类实现一个接口,需要实现所有抽象方法
//一个抽象类实现一个接口,可以实现0~N个抽象方法
class Sub extends Object implements B, A {
}
//接口直间是多继承,多个用逗号隔开
interface C extends A, B {
}
@Override
public void m31() {
// 直接使用super找到的是继承的父类
// 接口的父类需要使用接口名.super.接口属性等进行调用
A1.super.m31();
}
总结
如果抽象类和接口都可以完成某个需求时,优先使用接口
因为类可以实现多个接口,但是只能单继承如果我们使用抽象类进行继承的话就不能继承其他类了
所以优先使用接口的母的是保留该子类的继承关系
Object
概述
Object是java中提供的根类,如果一个类没有显示继承,则默认继承Object
所有类都会直接或间接继承Object,所以Object中的方法是所有类都有的
Equals
== :比较基本类型时比较的是值的大小,比较引用类型时,比较的是内存地址
我们一般不会比较引用类型的地址,通常是比较其地址保存的的内容
equals方法设计目的:比较两个对象是否相同,但是Object方法中的equals方法默认比较该内存地址(return(this==obj)😉
所以我们需要根据需求来覆写该方法
String s21 = new String("abc");
String s22 = new String("abc");
System.out.println(s21 == s22);
// String 是引用类型,需要用equals比较
// String中覆写了equals方法,比较的是值不是地址
System.out.println(s21.equals(s22));
@Override
public boolean equals(Object obj) {
if (obj == this) {//假如内存地址相同则内容肯定相同
return true;
}
if (obj instanceof Student) {//判断时候是同类
Student s=(Student)obj;//是则强转
if(s.id==this.id&&this.name.equals(s.name)){//这里的equals是Object下的,并非这个覆写后的
return true;
}
}//不同类则没必要比较
return false;
}
Finalize
JVM特性:面向对象,跨平台,多线程,自动垃圾回收
垃圾:当没有任何引用可以找到他的时候就会被当做垃圾
finalize方法是在垃圾回收时自动调用,但是本身并没有垃圾回收的功能
如果对象销毁时需要做一些操作可以写在finalize中,一般是销毁资源等操作
@Override
protected void finalize() throws Throwable{
//JVM特性: 面向对象,跨平台,多线程,自动垃圾回收
//finalize(垃圾回收)方法是自动调用的
//程序员可以建议进行垃圾回收System.gc();
System.out.println("回收垃圾:");
}
toString
toString代表对象的字符串表示形式
输出一个引用类型对象的时候,会自动调用该对象的toString方法
User user=new User("张三", 19);
//user是引用类型
//当User输出的时候会自动调用toString方法
//我们可以对该方法进行覆写,使toString返回我们想要的数据,如下
System.out.println(user);
class User {
@Override
public String toString() {
//输出一个引用类型的时候,会自动调用该对象的toString方法
//toString默认打印内存地址(包名.类名@十六进制的哈希值)
//return super.toString();
return "User[name="+name+",age="+age+"]";
}
String name;
int age;
public User(String nameString,int age){
this.name=name;
this.age=age;
}
}