类和接口
面向对象编程(OOP)现在即将结束。在这个总结中,我们将介绍两个重要的概念。
除了类,java中还有两个概念:抽象类和接口。有很多值得学习的东西。在我们理解和思考它们之前,让我们向您展示如何在java中定义抽象类和接口。
(1)抽象方法和抽象类的定义
一般方法:
public class Ani***l { public void eat(){System.out.println("Ani***l is eating.");}
抽象方法:
public abstract class Ani***l { abstract void eat();}
抽象void eat();移除方法体并添加抽象关键字是一种抽象方法。如果类中有抽象方法,abstract也必须添加到类的声明中,才能成为抽象类。我们要注意,抽象方法没有方法体,所以不能直接调用。正是因为抽象方法没有方法体,所以我们不能直接构造一个抽象类。
其实值得我们思考的问题是,没有方法体的方法有什么用?答案是【同意】。
我们不能【直接构造抽象类】,但是子类可以继承抽象类,必须重写抽象方法,除非子类也是抽象类。这样,所有的子类都会有共同的约束,父类已经实现的方法也可以被所有的子类重用。
顾名思义:
public abstract class Ani***l { abstract void eat();}
这个抽象方法用来约束子类,所以子类必须实现这个方法。除了抽象方法,抽象类还可以有普通方法。
public abstract class Ani***l { abstract void eat(); public void print(){ System.out.println("I'm an Ani***l!"); }}
抽象类不能直接实例化。当类被实例化时,意味着对象可以调用类中的属性或方法。但是抽象类中有抽象方法,抽象方法没有方法体,没有方法体就不能调用。既然方法不能调用,那么如何生成实例化的对象呢?
像其他类一样,抽象类也可以有自己的成员变量:
public abstract class Ani***l { private String name;}
既然有成员变量,我们可以大致猜测抽象类是可以构造的,因为属性必须通过new分配给memory 空才能赋值。
然后抽象类中一定有构造方法,实例化的过程就是属性赋值的过程!
看一下下面的例子:
public abstract class Ani***l { // 但是我们不能直接new public Ani***l(){ System.out.println("ani***l has created!"); } abstract void eat(); public void print(){ System.out.println("I'm an Ani***l!"); }}public class Cat extends Ani***l { public Cat(){ System.out.println("cat has created!"); } @Override void eat() { System.out.println("cat is eating!"); } public static void ***in(String[] args) { new Cat(); }}结果:ani***l has created! cat has created!
这个过程说明了在创建子类的时候,父类还是会被创建,抽象类只有在创建子类的时候才会被创建。
【小问题】:抽象类可以final声明吗?
抽象类的目的是允许子类继承。当一个职业被final修饰时,它就失去了这个能力。结果当然是不行了。
总结
1.抽象方法必须是公共的或受保护的(因为如果是私有的,就不能被子类继承,子类也不能实现这个方法)。默认情况下,它是公共的;
2.抽象类不能直接实例化,需要子类以向上转化的方式处理;
3.抽象类必须有子类,这些子类由扩展继承。子类只能继承一个抽象类;
4.子类(如果不是抽象类)必须覆盖抽象类中的所有抽象方法(如果子类没有实现父类的抽象方法,子类也必须定义为抽象类。);
(2)接口的定义
事实上,接口是比抽象类更高级的抽象。当然,抽象类是比类更高级的抽象。接口中只能有方法的定义,而不能有实现:
public abstract class Ani***l { /** * 呼吸的方法 */ public abstract void breath(); /** * 吃的方法 */ public abstract void eat();}
我们可以更优雅地表达它:
public inte***ce Ani***l { /** * 呼吸的方法 */ void breath(); /** * 吃的方法 */ void eat();}
不需要Abstrac,但是我们需要使用关键字inte***ce,我们称之为[inte***ce]。
抽象方法可以在接口中定义,但是不能有实例字段,也不能有方法实现(静态)。在java8之后,可以在接口中定义默认方法。这个先说一会儿。编写接口的目的是规定和标准化类的一些能力。接口不能实例化,也没有构造函数。
接口中的方法默认是公共的,我们也推荐使用默认的,也就是我们定义接口的时候,不需要写它的权限修饰符。但是因为接口是契约,是子类必须具备的某种能力,需要子类来实现,所以在写借口的时候,我们推荐使用javadoc来注释接口。
接口是多实现的。一个类可以实现多个接口,但它只能继承一个类。接口也可以相互继承。
(1)深刻理解
我们学习了几天面向对象。
这是一种遗传,狗是一种动物。人也是人.
实现了能做关系,这反映了一个类的能力。通过实现多个接口,可以聚合多种功能。
举个例子:
鸟会飞,飞机也会飞。它们有功能性品质吗?不完全是。那时候,他们都能飞了。
我们可以在设计中设置一个接口,接口有一个Y方法定义。
接口可以用很多方法实现,所以除了飞行接口,鸟和飞机还可以实现很多其他接口。这意味着他们可以做很多事情。
类是模板设计,而接口是契约设计。
当设计一个抽象类时,相同的实现方法通常在父类中被抽象,而子类独立地实现那些不同的实现。
【做好顶层设计】
中央和我规划好蓝图,做好顶层设计,做好具体落实,只要走党的路线就行。
再举个例子,比如食物链。动物会吃其他动物,也会被其他动物吃。
//动物public inte***ce Ani***l { /** * 吃的方法 */ void eat(Ani***l ani***l); /** * 获取名字 * @return */ String getName();}//老虎public class Tiger implements Ani***l { @Override public void eat(Ani***l ani***l) { System.out.println(this.getName() + "吃了" + ani***l.getName()); } @Override public String getName() { return "tiger"; }}//狼public class Wolf implements Ani***l { @Override public void eat(Ani***l ani***l) { System.out.println(this.getName() + "吃了" + ani***l.getName()); } @Override public String getName() { return "wolf"; }}//羊public class Sheep implements Ani***l { @Override public void eat(Ani***l ani***l) { System.out.println(this.getName() + "吃了" +ani***l.getName()); @Override public String getName() { return "sheep"; } public static void ***in(String[] args) { Ani***l tiger = new Tiger(); Ani***l wolf = new Wolf(); Ani***l sheep = new Sheep(); wolf.eat(sheep); tiger.eat(wolf); }}结果://wolf吃了sheep//tiger吃了wolf
在公司内部,牛逼的人写界面。接口更多的是设计,实现更多的是搬砖。
本文来自清杉投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/523703.html