抽象类和接口及内部类

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.匿名内部类

即临时创建出来的内部类。
至此本文结束,谢谢大家观看。
  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值