java接口与抽象类,java接口和抽象类
相信大家都有这种感觉:抽象类和接口的异同太多了。通常,这两者都会让初学者感到困惑。无论是实际编程还是面试,抽象类和接口都特别重要!希望大家看完这篇文章,能冷静的理解他们两个。
我所理解的抽象类
1、抽象类和类的相样韵味
1)抽象类和类一样,可以用来继承。
2)一个类可以拥有的组件,抽象类可以拥有的【包括构造方法,静态静态修饰符等。]
2、抽象方法
抽象方法:在讲述不同的魅力之前有必要了解清楚:
1)抽象方法没有方法体。
2)抽象方法必须用抽象关键字修饰。
3)有抽象方法的类一定是抽象类。
4)抽象方法必须是公共的或受保护的,默认是公共的。
3、抽象类和类的异样韵味
1)、抽象类必须用abstract关键字修饰,用abstract修饰的类就是抽象类!
2)、抽象类是可选的抽象方法。
3)抽象类虽然有构造方法,但不能直接用来创建对象实例。
4)抽象类不能用final或private来修饰。
5)外部抽象类不能用static修饰,内部抽象类可以用Static声明。这句话的理解代码如下:
//定义一个抽象类a。
抽象A类{
//定义内部抽象类b。
静态抽象类B{ //static定义的内部类属于外部类。
公共抽象void sa method();
}
}
C类扩展了A.B{
public void sa method(){
System.out.println (======执行的SAOMethod方法====);
}
}
公共类StaticDemo {
公共静态void main(String[] args) {
A.b ab=new C();//向上转换
ab . sa method();
}
}
运行结果:=====saoMethod被执行====有些童鞋傻。C延伸A.B是一种什么操作,还能这么玩?是的,当用static声明的内部抽象类等价于外部抽象类时,类名以“外部类”的形式表示。内部类”。这种骚操作没错,但是稳。
4、掌握抽象类
类是为了继承而存在的。如果你定义了一个抽象类,但是没有继承它,那么创建的抽象类是没有意义的!
抽象类虽然有构造方法,但不能直接实例化。要创建的对象涉及向上转换,主要用来被它的子类调用。
还有一种说法是,抽象类可以没有抽象方法。这只是一个需要记住的重要概念。一定要记住!在实践中,抽象类一般都有抽象方法,否则抽象类就失去了意义,就像普通类一样!
如果一个普通类A继承了一个抽象类B,那么子类A必须实现父类B的所有抽象方法,如果子类A没有实现父类B的抽象方法,那么子类A也必须定义为一个抽象类,也就是抽象类。
我所理解的接口
接口可以说是抽象类的一个特例。抽象类和接口的异同太多了。相比之下,接口更像是行为的抽象!
1、接口特性
1)界面中方法默认为public abstract,界面中成员变量不写默认为public static final。
2)接口没有构造方法。
3)接口可以实现“多继承”,一个类可以实现多个接口。实现编写格式可以直接用逗号分隔。
2、接口必知
该接口只能包含公共静态最终变量。如果不写,默认为public static final。如果用private来修饰,编译会失败。
接口中的所有方法都将被隐式指定为公共抽象方法,并且只能是公共抽象方法。用其他关键字修改,比如private、protected、static、 final,会导致编译失败。
3、接口误区
很多网上文章都说接口里的方法都是抽象方法。博主回去研究发现,这其实不够严谨。只看一个简单的程序。
包接口。
接口AA{ //接口AA
默认void hh(){
system . out . println( 123 );
};
}
类实现aa {//实现接口。
}
公共类接口设计{
公共静态void main(String[] args) {
AA a=new BB();//通过实现类来创建实例
a . hh();
}
}
运行结果:123显然hh方法并不是一个抽象的方法,只是这样的设计失去了接口的意义。实际开发中不会有这样的代码,真的有点死胡同的魅力,所以我不否认网上的言论,但是我觉得不够严谨。我觉得大家关注一下比较好.如果面试官听到你这样的回答,可能会对你印象深刻,认为你是一个向往和探索知识,有个人想法的学习者。
抽象类和接口本质区别
抽象和接口的本质区别主要来自两个方面:语法区别和设计思想。
1、语法区别
2、设计思想区别
对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现(相当于写一个通用类的通用方法,添加方法体的实现代码),子类可以不变;但不用于接口。如果接口改变了,所有实现这个接口的类也必须相应地改变。这个应该很好理解。
从设计的角度来说,抽象类是一个类的抽象,抽象类抽象了整个类,包括属性和行为。接口是行为的抽象,而接口是类部分(行为)的抽象。从某种角度来说,接口更像是抽象的抽象!
如何理解上面这段话?
了解两种设计思路的区别,要从程序员宜春和卖花女(一只可爱的小母猪)的故事说起。程序员伊春每天过着3.1分的生活,不是吃饭就是睡觉,闲暇时还能敲代码。花姑娘很神奇,每天过着1.1分的生活,不是吃饭就是睡觉,闲暇时吃饭就是睡觉。程序员伊春和卖花女过着幸福安逸的生活。突然有一天,风起云涌,天拍~天变~,邪恶的产品经理来索求了。设计一个程序员宜春和卖花女的程序,要求用抽象类或者接口来设计。这个时候你会怎么设计?这里有两个设计方案。
方案一:用抽象类设计分别设计eat、sleep和qiaoDaiMa方法,具体代码如下:
抽象类Myclass{
公共抽象void eat();
公共抽象void sleep();
public abstract void qiaoDaiMa();
}方案二:用接口设计分别设计eat、sleep和qiaoDaiMa方法。具体代码如下:
接口Myclass{
公共抽象void eat();
公共抽象void sleep();
public abstract void qiaoDaiMa();
}显然,无论是哪个类继承了抽象类,还是实现了上述接口,都会出现同样的情况:重写它们的抽象方法。
如果宜春有100个程序员,以上设计都很好解决。但对卖花女不起作用。花姑娘不能敲代码的高端操作!百花女改写的乔代玛法毫无意义。显然这个设计有问题。
从上面可以看出,吃饭和睡觉对于乔代玛法来说,不是一个范畴的行为(方法)。其实我们可以这样设计:定义一个包含eat和sleep方法的抽象类,然后定义一个包含乔代玛方法的接口。具体代码如下:
抽象类Myclass{
公共抽象void eat();
公共抽象void sleep();
}
接口MyclassTwo{
public abstract void qiaoDaiMa();
}
宜春类扩展了Myclass实现了MyclassTwo{
@覆盖
public void eat() {
}
@覆盖
公共无效睡眠(){
}
@覆盖
public void乔代玛(){
}
}我们要做的就是让一百个程序员伊春继承抽象类,实现接口,而花姑娘直接继承抽象类。这个设计很完美。
同样,讲这个故事也是不负责任的。为什么要捏?因为你会发现,抽象类和这样设计出来的接口,似乎没有什么区别。只是现在抽象类换成接口,接口换成抽象类,实现效果是一样的。代码如下:
接口Myclass{
公共抽象void eat();
公共抽象void sleep();
}
抽象类MyclassTwo{
public abstract void qiaoDaiMa();
}于是,为了解释清楚设计思路的区别,程序员伊春和卖花女的故事不得不继续下去。
众所周知,可爱的小母猪一般都是粉色的吧?这时候我们产品经理又改了需求。什么?产品经理家的100只小猪中有一只是黑白相间的赛,嗯?
万恶的产品经理只会不合理的改变需求,但产品经理永远不会知道自己一味的逼迫程序员,程序员自己也不知道自己有多优秀!
众所周知,可爱的小母猪一般都是粉色的吧?这时候我们产品经理又改了需求。什么?产品经理家的100只小猪中有一只是黑白相间的赛,嗯?
万恶的产品经理只会不合理的改变需求,但产品经理永远不会知道自己一味的逼迫程序员,程序员自己也不知道自己有多优秀!
所以这一次,我们都知道,抽象类和接口都是可以有成员变量的,只不过接口比较苛刻只能是public static final正是因为这一点!抽象类和接口的设计精髓就在这里了,这一次我们这样设计:
接口Myclass{
公共抽象void eat();
公共抽象void sleep();
}
抽象类MyclassTwo{
String color= red
public abstract void qiaoDaiMa();
}让宜春班这样设计。
包抽象测试;
接口Myclass {
公共抽象void eat();
公共抽象void sleep();
}
抽象类MyclassTwo {
String color= red
public abstract void qiaoDaiMa();
}
宜春类扩展了我的类二实现了我的类{
@覆盖
public void eat() {
}
@覆盖
公共无效睡眠(){
}
@覆盖
public void乔代玛(){
}
}
公共类AbstractDemo {
公共静态void main(String[] args) {
宜春yc=新宜春();
}
}但是伊春可以忽略颜色的属性,当作不存在,除非伊春不嫌弃自己也是一个红赛派格哈哈哈。
还有花童们要注意了!然后让产品经理家里的100只小猪设计代码如下;
包抽象测试;
接口Myclass {
public abstract void qiaoDaiMa();
}
抽象类MyclassTwo {
String color= red
公共抽象void eat();
公共抽象void sleep();
}
猪班扩展我的二班{
@覆盖
public void eat() {
}
@覆盖
公共无效睡眠(){
}
}
公共类AbstractDemo {
公共静态void main(String[] args) {
猪p=新猪();
String color= blackWhite
system . out . println(color);
}
}剩下的99个花童不需要直接动,就是不需要String color= blackWhite在这段代码中,默认情况下它的颜色属性是红色。
这个时候抽象类和接口是不可替代的,所以抽象类和接口的设计思路是非常清晰的。你看怪不怪~
本文来自java入门专栏,欢迎学习!以上是为了深入理解java中抽象类和接口的细节。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。