接口 内部类

抽象类

//不管是抽象类还是接口它都可以向上转型
在这里插入图片描述
1**.abstract关键字用来修饰类的话,我们就认为该类为一个抽象类
2.被abstract修饰的方法称为抽象方法
抽象类中可以包含抽象方法,【抽象方法】:我们不想让它有具体的实现
//抽象类中不一定有抽象方法,而有抽象方法的类一定是抽象类
3.如果一个类中有抽象方法,那这个类一定是一个抽象类,要用abstract修饰
PS:区别:抽象类不能实例化
4.抽象类不能实例化,所以它的主要作用就是
被继承**
5.当一个普通类继承抽象类后,这个普通类一定要重写抽象类中的所有抽象方法
6.final和abstract不能同时存在
7.当一个抽象类A不想被普通类B继承时,我们要将普通类B变成抽象类,当普通类C去继承抽象类B时,C要记得重写A和B中所有的抽象方法
在这里插入图片描述
虽然抽象类不能实例化,但是它也具有构造函数,它的构造函数是用来让子类调用,帮助这个抽象类初始化自己的成员(即初始化父类的成员变量)
抽象类几不能
1.抽象类不能实例化对象(和接口一样)
2.抽象类不能被private修饰(因为抽象类必须被继承,private修饰的不能被继承)
3.抽象方法不能被static和final修饰,因为抽象方法要被子类重写(must)
4.抽象类必须被继承
5.final和abstract一定不能一起使用,因为final修饰的方法一定不能重写,而abstract修饰的方法一定要重写

接口

接口的定义:(一般我们就用I开头)
在这里插入图片描述
1.用interface来定义一个接口
2.接口中常量默认为被final修饰,方法默认为被abstract修饰
3.接口当中不可以有普通方法
在这里插入图片描述
4…从Java8中开始,我们允许在接口中定义一个default方法,可以有具体的实现
5.接口当中的方法,如果是被static修饰的方法可以有具体的实现
在这里插入图片描述
6.接口中不可以通过new关键字进行实例化
7.可以通过关键字implement来实现接口
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。
public class 类名称 implements 接口名称{
// …
}

注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
8.接口也可以发生向上转型和动态绑定
在这里插入图片描述
在这里插入图片描述
public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}

override快捷键

在这里插入图片描述

接口特性

  1. 接口类型是一种引用类型,但是不能直接new接口的对象
  2. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)
  3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
  4. 重写接口中方法时,不能使用默认的访问权限
  5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
  6. 接口中不能有静态代码块和构造方法
  7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
  8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

一个类可以有多个接口,而一个类只能继承一个父类,这时候接口的好处就体现出来了,将输出放在接口里,子类在继承父类后可以同时调用多个接口

instanceof的使用

1.a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
2.如果 a instanceof A返回true,则 a instanceof B也返回true.其中,类B是类A的父类。
3.要求a所属的类与类A必须是子类和父类的关系,否则编译错误。

测试类

在测试类中,父类的方法(test1)必须要满足类型才能调用,而接口的方法(test2.3.4)只要满足这个特性就能调用
在这里插入图片描述

接口不能继承,但是接口可以拓展
在这里插入图片描述
此时接口D就实现了拓展功能,使其同时拥有了接口B和C的功能,而且还具有自己的功能

抽象类和接口之间的区别(把这三点融汇贯通)

【1】成员,接口中的成员我们默认是public static final的,而抽象类里的成员可以是普通的
【2】方法,接口中方法我们默认是publicfinal的,而抽象类里的方法可以是抽象的,也可以是普通的(PS:拥有抽象方法的一定是抽象类)
【3】继承,一个类可以继承一个类,同时实现多个接口,而接口和接口之间只能用extends来实现

Object类

是Java中所有类的父类(哪怕没有说,是系统默认的)

ToString(获取对象信息)

在这里插入图片描述

equals(比较字符串是否相同)

在这里插入图片描述
谁调用equals谁就是this,而a.equals(b)中,a就是调用equals的
如果以后是自定义类型,一定要重写equals方法
在这里插入图片描述
重写方法使用Java系统自带的equals and hashcode 一直点击next,自动生成重写

hashCode初步理解

hashcode方法源码:
public native int hashCode();
该方法是一个native方法,底层是由C/C++代码写的。我们看不到。

我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们不能吧这两个对象放在同一个位置,但是当我们重写hashCode后就可以将两个对象放在一个位置了

三个接口

排序【Compable]接口——对类的入侵类不强

缺点:
在这里插入图片描述

我们现在想比较student的年龄,但是由于不是基本变量,不能直接比较,所以我们要创建一个接口来实现二者的比较,<>必须要写,里面写上你要比较的变量
在这里插入图片描述在这里插入图片描述
equals的返回值类型为true/flase,而compare的返回值类型为具体的数值
在这里插入图片描述
package student;

class Student implements Comparable{
private String name;
private int age;

public Student(String name,int age) {
    this.name=name;
    this.age = age;
}

@Override
public String toString() {
    return "Student{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}

@Override
public int compareTo(Student o) {
    return this.age-o.age;
}

}
class Test{
public static void main(String[] args) {
Student student1=new Student(“zhang”,15);
Student student2=new Student(“lisi”,16);
System.out.println(student1.compareTo(student2));
}
}

Q 克隆接口

在这里插入图片描述
如果引用父类的对象,那就需要调用super()的方法
protected可以修饰不同包里的子类

浅拷贝:将对象拷贝一次
深拷贝:将对象的对象也拷贝一次

//在后面讲序列化时也会讲到
在这里插入图片描述
深拷贝,浅拷贝看的就是代码的实现过程
在这里插入图片描述

内部类

在这里插入图片描述

我们当前的这个类定义在一个类的内部(四种)【静态内部类,实例内部类,匿名内部类,局部内部类】或者定义一个方法的内部(一般没什么作用)
//
//

静态内部类

内部类被static修饰

在这里插入图片描述
注意:被static修饰的内部类它就变成了不依赖于外部类的了,所以如果在内部类的方法中调用内部类没有的,但是外部类有的成员变量时,编译不通过,不能完成调用,但换言之,如果调用内部类外部类同时拥有的成员变量,但是所赋予的值不同,此时系统只调用内部类的成员变量
//
//
静态内部类只能访问外部类静态成员变量,但是如果你非要访问,那么就采用下面的方法
在这里插入图片描述
直接在内部类中将外部类进行实例化对象,然后通过对象引用
//
//

实例内部类

获取实例内部类对象时依赖于外部类对象

实例内部类中是包含外部类的this的
在这里插入图片描述
在这里插入图片描述

Q1:如何去获取实例内部类对象?【跟之前的比较起来变动较大,注意记忆】

在这里插入图片描述
//new 一定要调构造函数
在这里插入图片描述

Q2:在实例内部类当中是否能定义静态成员变量?

在这里插入图片描述
在这里插入图片描述
因为static修饰的成员变量是放在方法区,而不依赖于对象,在代码执行时最先被执行,但是内部类中的变量应该依赖于内部对象,内部对象再依赖于外部对象,所以在使用static时记得加上final一起使用啊

Q3:如果在内部类中定义一个与外部类中同名的成员变量,那么在输出时,代码会调用哪一个成员变量的值?

系统会优先去寻找内部类中的成员变量,只有当内部类中没有的时候,它才会去外部类中调用
在这里插入图片描述
外部类名.this.成员变量名
//
//
//

匿名内部类【是引入接口来实现的】

在这里插入图片描述

匿名内部类数据的访问限制

在这里插入图片描述
简而言之,就是在匿名内部类里面只能访问被final修饰的成员变量或者从来都没被修改过值的数据
//
//
//

在这里插入图片描述
//一个类一个字节码代码
//
//

局部内部类

不经常使用,因为受限很严重,只能在当前方法中使用
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值