java中的抽象类与接口
2021-02-08 18:18
标签:实例 单实例 向下转型 new 声明 增加 事物 nat 形参 1.抽象类的定义 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 2.简单实例 Shape类 Square类 Circle类 Demo_Test2类 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接口,代表动物行为 AnimalSleep接口,代表动物的作息方式 Bird类 Cat类 Test类,用于测试 运行结果: 参考文章: https://blog.csdn.net/ahuan08/article/details/86606056 https://zhuanlan.zhihu.com/p/94770324 java中的抽象类与接口 标签:实例 单实例 向下转型 new 声明 增加 事物 nat 形参 原文地址:https://www.cnblogs.com/YorkZhangYang/p/12741692.htmlpackage 抽象类;
/*
题目:
建立一个Shape抽象类,代表形状,求面积和周长两个方法
建立一个正方形类, 长方形 ,圆类 作为抽象类的子类,
通过抽象类来求面积和周长
*/
public abstract class Shape {
public abstract double getArea();//抽象方法
public abstract double getPan();
}
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;
}
}
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;
}
}
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);
}
}
package 接口实例;
public interface AnimalAction {
//吃
void eat();
//public void eat();
//喝
void drink();
}
AnimalLove接口,代表动物的求偶方式
package 接口实例;
public interface AnimalLove {
//求偶方式
void LoveType();
}
package 接口实例;
public interface AnimalSleep {
//作息方式
String sleep();
}
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("我是鸟,喝水啄着喝");
}
}
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("我是猫,喝水很斯文");
}
}
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());
}
}