标签:实例 单实例 向下转型 new 声明 增加 事物 nat 形参
1.抽象类的定义
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
2.简单实例
Shape类
package 抽象类; /* 题目: 建立一个Shape抽象类,代表形状,求面积和周长两个方法 建立一个正方形类, 长方形 ,圆类 作为抽象类的子类, 通过抽象类来求面积和周长 */ public abstract class Shape { public abstract double getArea();//抽象方法 public abstract double getPan(); }
Square类
package 抽象类; public class Square extends Shape{ protected double len; Square(double len){ this.len = len; } public double getArea(){ return len*len; } public double getPan(){ return 4*len; } }
Circle类
public class Circle extends Shape{ private double r; Circle (double r){ this.r = r; } public double getArea(){ return Math.PI*r*r; } public double getPan(){ return Math.PI*r*2; } }
Demo_Test2类
package 抽象类; public class Demo_Test2 { public static void main(String[] args) { //求正方形的面积和周长 Square square = new Square(3); double area = square.getArea(); double zc = square.getPan(); System.out.println("正方形的面积:"+area); System.out.println("正方形的周长:"+zc); } }
3.总结:
1. 抽象类不能被实例化
2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
3. 抽象类中的抽象方法只是声明,不包含方法体。
4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
4.接口的概念
接口是只有全局常量和公共抽象方法的一种特殊类,由于在java中只能使用单继承的方式,所以增加接口类型,可以让类实现多个接口。
弥补单继承机制的不足。在接口中所有的常量都默认修饰public static final,所有的方法默认修饰public abstract(JDK1.8之前)。
补充:JDK1.8中对接口增加的特性:
(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;
(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。
5.接口与抽象类的异同
相同点:(1)接口与抽象类都不能直接实例化.
不同点:(1)接口中的方法全部是抽象方法,抽象类中的方法不全是。
(2)一个类可以实现多个接口,但是一个子类只能继承一个父类。
(3)接口中的成员权限都是public,抽象类中不一定。
(4)接口强调特定功能的实现,而抽象类强调所属关系。
(5)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
(6)接口是对行为的抽象,抽象类是对一类事物的抽象。
6.简单示例
AnimalAction接口,代表动物行为
package 接口实例; public interface AnimalAction { //吃 void eat(); //public void eat(); //喝 void drink(); }
AnimalLove接口,代表动物的求偶方式
package 接口实例; public interface AnimalLove { //求偶方式 void LoveType(); }
AnimalSleep接口,代表动物的作息方式
package 接口实例; public interface AnimalSleep { //作息方式 String sleep(); }
Bird类
package 接口实例; public class Bird implements AnimalAction,AnimalLove,AnimalSleep{ @Override public String sleep() { String string="我是鸟,白天觅食,晚上睡觉"; return string; } @Override public void LoveType() { System.out.println("我是鸟,求偶方式是修房子"); } @Override public void eat() { System.out.println("我是鸟,喜欢吃虫子"); } @Override public void drink() { System.out.println("我是鸟,喝水啄着喝"); } }
Cat类
package 接口实例; public class Cat implements AnimalAction,AnimalSleep,AnimalLove{ @Override public void LoveType() { System.out.println("我是猫,求偶方式是抓老鼠"); } @Override public String sleep() { String string="我是猫,白天睡觉,晚上活动"; return string; } @Override public void eat() { System.out.println("我是猫,喜欢吃鱼"); } @Override public void drink() { System.out.println("我是猫,喝水很斯文"); } }
Test类,用于测试
package 接口实例; public class Test { //可以用接口创建的引用作为方法的形参 public void BuruAnimal(AnimalAction action) { if (action instanceof Cat) { Cat cat1 = (Cat) action; cat1.eat(); } if (action instanceof Bird) { Bird bird = (Bird)action; bird.eat(); } } public static void main(String[] args) { //向上转型,自动的 AnimalAction action = new Cat(); action.eat(); action.drink(); //The method sleep() is undefined for the type AnimalAction //action.sleep(); action = new Bird(); action.eat(); action.drink(); //向下转型,强制转换的 Bird xBird = (Bird)action; xBird.LoveType(); System.out.println(xBird.sleep()); } }
运行结果:
参考文章:
https://blog.csdn.net/ahuan08/article/details/86606056
https://zhuanlan.zhihu.com/p/94770324
标签:实例 单实例 向下转型 new 声明 增加 事物 nat 形参
原文地址:https://www.cnblogs.com/YorkZhangYang/p/12741692.html