1.抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,
如果
一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
2.接口
1.概念
接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用
。
在
Java
中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
2.使用方法
interface用来创建接口
implements用来使用接口
3.接口比抽象类更抽象,所以也支持向上转型。
4.instanceof可以保证安全的向下转型
5.static和default在接口中的作用(java8之后)
这个地方public static不能被重写,可以直接用ITest.
出来直接使用,而default修饰的可以被使用接口后不重写直接使用,例如testDemo.defaultMethod().
6.实现多个接口
一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类
。
继承和使用接口的顺序不能颠倒!继承在前,使用接口在后。
7.接口可以解决多继承问题!
首先为什么我们不能讲各种不同的功能放入类中呢?再继承这些类不就可以了吗?
可是Java不支持多继承!
而接口就可以帮我们解决这个问题!
例如下面,虽然狗,鸭子,青蛙都是动物,但是不是每个都会飞,跑,游。
所以我们在继承了动物类之后,还可以搭配的继承接口,达到一个多继承的效果。
8.接口之间也可以拓展
9.接口使用实例
按照我们之前的理解
,
数组我们有一个现成的
sort
方法
,
能否直接使用这个方法呢
?
Arrays
.
sort
(
students
);
System
.
out
.
println
(
Arrays
.
toString
(
students
));
//
运行出错
,
抛出异常
.
Exception in thread
"main"
java
.
lang
.
ClassCastException
:
Student cannot be cast to java
.
lang
.
Comparable
仔细思考
,
不难发现
,
和普通的整数不一样
,
两个整数是可以直接比较的
,
大小关系明确
.
而两个学生对象的大小关系
怎么确定
?
需要我们额外指定
.
让我们的
Student
类实现
Comparable
接口
,
并实现其中的
compareTo
方法
在
sort
方法中会自动调用
compareTo
方法
. compareTo
的参数是
Object ,
其实传入的就是
Student
类型的对象
.
然后比较当前对象和参数对象的大小关系
(
按分数来算
).
如果当前对象应排在参数对象之前
,
返回小于
0
的数字
;
如果当前对象应排在参数对象之后
,
返回大于
0
的数字
;
如果当前对象和参数对象不分先后
,
返回
0;
再次执行程序
,
结果就符合预期了
10.Clonable
接口和深拷贝
Java
中内置了一些很有用的接口
, Clonable
就是其中之一
.
Object
类中存在一个
clone
方法
,
调用这个方法可以创建一个对象的
"
拷贝
".
但是要想合法调用
clone
方法
,
必须要 先实现 Clonable
接口
,
否则就会抛出
CloneNotSupportedException
异常
如上代码,我们可以看到,通过
clone
,我们只是拷贝了
Person
对象。但是
Person
对象中的
Money
对象,并 没有拷贝。通过person2
这个引用修改了
m
的值后,
person1
这个引用访问
m
的时候,值也发生了改变。这里 就是发生了浅拷贝。那么我们想一下如何实现深拷贝呢?
其实也就是自己再创建一个变量,然后对值进行浅拷贝,然后更换引用即可!
11.对象比较
equals
方法
在
Java
中,
==
进行比较时:
a.
如果
==
左右两侧是基本类型变量,比较的是变量中值是否相同
b.
如果
==
左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.
如果要比较对象中内容,必须重写
Object
中的
equals
方法,因为
equals
方法默认也是按照地址比较的:
结论:比较对象中内容是否相同的时候,一定要重写
equals
方法
12.内部类
内部类的定义
内部类的实例化,要先实例外部类。
9.1.2
静态内部类
被
static
修饰的内部成员类称为静态内部类。
【
注意事项
】
1.
在静态内部类中只能访问外部类中的静态成员
如果确实想访问,我们该如何做?
2.
创建静态内部类对象时,不需要先创建外部类对象
}
public class OutClass {
private int a;
static int b;
public void methodA(){
a = 10;
System.out.println(a);
}
public static void methodB(){
System.out.println(b);
}
// 静态内部类:被static修饰的成员内部类
static class InnerClass{
public void methodInner(){
// 在内部类中只能访问外部类的静态成员
// a = 100; // 编译失败,因为a不是类成员变量
b =200;
// methodA(); // 编译失败,因为methodB()不是类成员方法
methodB();
}
}
public static void main(String[] args) {
// 静态内部类对象创建 & 成员访问
OutClass.InnerClass innerClass = new OutClass.InnerClass();
innerClass.methodInner();
}
}
3.匿名内部类
即临时创建出来的内部类。
至此本文结束,谢谢大家观看。