首先先来说说泛型
public interface IProfile<T> extends IIdentifyable<T>
public interface Tagable<T> {
AbstractDrawerItem<T, VH extends RecyclerView.ViewHolder> implements IDrawerItem<T, VH>, Selectable<T>, Tagable<T> {
image.png
看到这些迷糊没。这些都是泛型
当然<> 里面的
知识点
Java泛型中的标记符含义:
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的java类型
S、U、V - 2nd、3rd、4th types
Object跟这些标记符代表的java类型有啥区别呢?
Object是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。
说白了 泛型就是给你的对象一个限制条件,当你调用这个对象的时候 你需要给这个调用对象一个限制。
public interface A<T> {
void a();
T B();
}
public abstract class B<T> implements A<T>{
@Override
public void a() {
}
@Override
public T B() {
return null;
}
}
public class c extends B implements A{
}
先来给新手一点小的需要注意的地方。 在你写抽象类的时候 B的这个泛型是一个要给的<T> 要不编译不过去。这个是因为你的接口A中泛型不知道去哪里寻找你给B一个泛型,他就可以找到。或者还可以在写B的时候你直接就给A一个固定的比如
implements A<String> 也是可以的
另外小知识点
B是一个抽象类 大家注意听
image.png
抽闲类B中实现接口中的方法。那么C中调用了接口A也是不用实现具体方法的。 因为在父类B中已经调用了A的方法。
另外再说几个知识点
抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
下面要注意一个问题:在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。但是正常人不会那么去写
抽象类和接口 是不能实例化的,这个大家都清楚。实现接口就要实现全部方法。继承抽象类就是实现抽象方法。他的存在就是为了别人去继承。抽象类本身就是大部分就是继承别的类。这个其实就是多继承。因为继承只能一次。所以这种情况抽象类在继承别的类。在继承抽象类就相当于继承多个类。
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
在其他方面,抽象类和普通的类并没有区别。
抽象类和接口的区别和作用
1.语法层面上的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
作用?
为什么会出现这个两种
抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
具体例子 人和动物
interface 行为{
public abstract void 吃饭();
public abstract void 睡觉();
}
这就是接口、“”有没有“” 关系。 人和动物都有行为这接口的行为。实现接口后去实现个子的方法
abstract class 人{
public abstract void 走();
public abstract void 跑();
}
后续出现的男人女人等 是不是 人, 他是一个 “”是不是的关系“”,是的话就去继承
所以大家稍微有点影响了吧、 接口和抽象类的大致区别
一个是有没有公共的行为(接口)
是不是同一个对象(抽象类)
下面转圈圈
image.png
还是上面的几个类哦~~~
public class c extends B<String> implements A<String>{
这个不报错
}
~~~~~~~~~~~~~~~~~~~~~
public class c extends B implements A{
这个不报错
}
~~~~~~~~~~~~~~~~~~~~~
public class c extends B<> implements A<c>{
这个报错
}
~~~~~~~~~~~~~~~~~~~~~
public class c extends B<c> implements A{
这个报错
}
~~~~~~~~~~~~~~~~~~~~~
public class c extends B<c> implements A<c> {
这个不报错
为什么?
}
public abstract class B<T> implements A<T>{
@Override
public void a() {
}
@Override
public T B() {
return null;
}
}
因为在抽象类B 中你的定义 AB 是要一样的 在c中不一样。 那是肯定会报错的。
哦对了。当一个类实现的接口中父类也实现的话。那么在子类或者父类中实现一次就好
网友评论