1.定义一个抽象类
2.抽象类与普通类的区别
1.抽象类不能实例化一个对象

2.但是抽象类可以向上转型

3.抽象类可以定义与普通类一样的成员变量
4.抽象类内被重写的成员方法可以不写具体代码

或者用abstract修饰成员方法

3.抽象方法必须在抽象类中;抽象类中不是必须有抽象方法

4.当一个普通类继承了抽象类,那么子类必须重写抽象类中的所有抽象方法(注意:是所有的)
以下两张图中draw方法都是抽象方法

缺点:子类没有重写父类的抽象方法,那么在发生多态时调用的就一直是父类的方法
———————————————————————————————————————————

优点;编译器会提示
5.总结

6.不能修饰抽象类的修饰符
1.final不能修饰abstract

2.static不能修饰abstract

3.private不能修饰abstract

7.抽象类的作用
增加了一层编译器的校验
——————————————————————————————————————————
8.接口
1.概念

2.定义

3.接口的特点
1.接口内的变量默认类型为public static final


2.方法默认的是抽象方法


3.接口无法实例化对象

4.因为接口内的方法和属性都有默认修饰符,所以为了保证代码的简洁性,接口内的方法和属性前不要加任何修饰符
5.接口是一个引用类型,但是不能new对象
6.接口中的方法不能有具体的实现,只能在实现接口的类中实现
7.接口中的每一个方法都是被public abstract修饰的抽象方法,也只能被public abstract修饰
8.重写方法时,访问权限必须是public,并且不能省略,否则编译失败

9.接口中可以有成员变量

10.接口中不能有静态代码块和构造方法
11.接口虽然不是类,但是接口.java——>生成字节码文件——>.class
12.类如果没有实现接口中的所有抽象方法,那么类必须设为抽象类;抽象类可以不实现接口中的方法
13.在接口中被default修饰的方法可以有具体的实现(在jdk8下)
!!!default的方法可以被重写,也会发生多态

4.接口内的方法可以有具体的实现
1.只被static修饰
2.只被default修饰

5.类实现接口

类实现一个接口,所以实例化一个接口对象可以使用如下方法(向上转型):

接口也能发生动态绑定



接口也是.Java文件,所以在编译后也会生成一个对应的字节码文件

9.接口——类:实现笔记本电脑使用usb键盘,usb鼠标的例子

10.Java中不能多继承,但可以实现多个接口;并且可以同时实现类与接口
注意!!!必须先继承后实现接口,否则会报错

11.一个接口继承多个接口
1.之前一个类继承多个接口是这样写的:

2.现在用一个接口继承其他接口,也可以实现接口的功能:
IAmphibious接口继承了Iswimming,Irunning接口的功能

3.新接口内如果有抽象方法,在类内也要重写

12.Java官方提供的几个接口
1.comparable
两个类的引用不能像整型那样比较大小,Java官方提供的comparable接口,用户需要重写comparable方法


如果没有<>和类名,那么编译器会默认生成Object类(所有的Java文件都直接或间接来源于.java.long.Object)

2.comparator
比较年龄大小

3.comparable比较字符串大小

String引用由编译器提供,String类实现了comoparable接口,实现了String的大小比较功能


4.引用类型排序
引用类型如果重写了toString方法,调用Arrays.toSting可以打印引用数组,如下图:

没有重写打印的是地址:

但是不能使用Arrays.sort();

原因:

Arrays.sort()的源码如下:

解决方法:实现Comparable接口,再重写compareTo方法




Arrays.sort内部调用compareTo方法
4.引用类型排序法二
Arrays.sort()是一个重载方法
运用Arrays.sort(类,类[比较器])能更方便的比较想要的类别
编译器会根据比较器的类别进行比较排序

5.用comparable接受实现了Comparable接口的数组元素,实现冒泡排序
Comparable[] 为何能接受 Person[]
接口是一种引用类型,当一个类实现了一个接口,那么该类就能被“向上转型”为接口类型
不能接受没有实现接口的类的数组元素,
原因:不能发生向上转型,Person类数据也就不能被Comparable类接受

6.实现自己的冒泡排序,参数为(数组+比较器)

7.Comparable与Comparator接口的比较与作用
作用:我们知道,自定义类不能直接进行加减运算。当Person类实现了这两个接口后,就具备了“可比较”的能力
比较:Comparator有两个参数,比Comparable更灵活;通过比较器可以灵活实现不同类别的比较
13.Cloneable接口和深拷贝

clone一个对象的本质:

克隆一份person1给person2,就需要用到克隆方法
!!!注意不是把person2指向person1所指向的对象
1.克隆接口是一个空接口

2.不需要重写方法

3.克隆接口的作用:标记Person类可以被克隆
4.如果要克隆Perosn方法,要重写clone方法;而Cloneable接口中没有方法,所以该clone方法来自Object

(native修饰说明):底层逻辑是C/C++

5.clone里的super指的是实现接口的类

没有实现接口也可以调用clone方法
浅拷贝:





深拷贝:


14.内部类
1.实例内部类
1.实例化一个 实例内部类

2.注意实例内部类对的字节码文件;内部类和外部类共用同一个.java文件,但是编译运行后的字节码文件不同

3.实例内部类可以访问外部类的同名成员变量(不同名直接访问)
访问方式:外部类名.this.外部对象名

4.总结
1.实例内部类也受public,private等的约束
2.实例内部类内可以直接访问外部类的成员
3.外部类也可以访问实例内部类,但前提是在外部类中创建一个内部类对象
4.实例内部类的非静态方法中都隐藏了一个this指针,指向外部类对象
5.同名外部类对象的访问:外部类名.this.成员名(如果外部类某对象是静态的,外部类名.成员名)
2..静态内部类
1.静态内部类

2.实例化一个静态内部类
实例化一个静态内部类对象不需要实例化外部类对象
静态成员用类名可直接访问

3.静态内部类中不能访问外部类的对象;如果要访问,就要在静态内部类中实例化外部类对象

访问方式:引用.外部类非静态对象

4.静态内部类没有指向外部类的this指针,但是有指向静态内部类的this指针
3.匿名内部类
匿名对象

1.定义一个匿名类

匿名对象创建后,可以重写其类的方法,如上图;注意匿名对象调用fun方法的代码。以及匿名类结尾的分号;
或者这样调用:

2.匿名内部类实现一个接口

3.匿名内部类实现Comparable/Comparator接口

1.匿名内部类可以当作”比较器“

匿名内部类重点在“匿名”。上图中,匿名类相当于实现了Comparable/Comparator/IA接口。接口的实现需要用到“类+implments+接口”,但是在这里不需要写implements,也不需要一个具体的类就可以是实现接口。
2.匿名内部类内可以定义成员变量;

3.匿名内部类中像其他正常类一样不能包含直接执行的语句

4.局部内部类

定义在外部类内的成员方法中的类,叫做局部内部类

注意:1.只能在方法内使用

因为局部内部类定义在方法中,所以它算一个局部变量,所以不能用public,static等修饰
15.Object类
Java中,除Object类以外,其他所有类都默认有继承关系,其他所有类都直接或者间接继承Object类。Object类相当于一个“父类”。
Object类中的toSting方法:

1.Object类可以接受所有的类
注意:
默认调用Object的toString方法(没有重写toString方法)

时,默认调用的是Object的toString方法,该方法如果没有重写,那么就会打印引用的地址
2.Object类中的所有方法

3.equals方法
1.Object中的equals方法:

2.String类中重写的equals方法

所以当String类型的引用调用equals方法时,会调用重写的equals方法

3.自定义类调用equals方法


自定义类里为什么可以用equals?
因为所有的类都继承Object类,而Object类里有equals方法;此时调用的是Object里的equals方法
4.子类重写equals方法后可根据需求判断两个引用是否相等
根据对象内容是否相等

根据类型是否相等


16.hashcode方法

1.hashCode方法在Object类中的源码

!!!!hashCode:如果两个引用的对象一模一样,那么调用hashCode方法返回的“地址”一样
hashCode返回的是哈希值——>类似于地址,但又与真实的引用地址不同
2.hashCode的源码返回的不是同一地址(在两个引用的对象一模一样的前提下)

3需要在自定义类中重写hashCode方法,才能实现想要的hashCode功能


注意是Objects

4.hashCode的作用



1233

被折叠的 条评论
为什么被折叠?



