抽象类和接口

1 篇文章 0 订阅
1 篇文章 0 订阅

抽象类和接口

使用多态时我们知道,父类引用指向子类对象,对象调用的方法是子类重写过的父类的方法。例如:

Class Person{
    public void name(){
        System.out.println("我有自己的名字");
    }
}
Class Boy extends Person{
    public void name(){
        System.out.println("我自己的名字叫lds");	
    }
}
Class Test{
    public static void main(String[] args){
        Person p = new Boy();
        p.name();  //这里输出的是子类Boy的方法体内容出来
    }
}

多态一般用处都是调用子类的方法,那么父类的方法显得就有点多余,但是一般的类中的方法不能没有方法体,所以就有了抽象类和接口两个概念出来。

抽象类(接口 常用)

什么是抽象类,顾名思义类中就是抽象出来的方法。虽然没有方法体,但是却可以重写里面的所有的方法。可以提高代码的复用性。

类的格式为: 修饰符 abstract class 类名 如:public abstract class Person{}

方法的格式为: public abstract void name();

特点

  • 因为抽象类(接口)的中的方法没有方法体(即使抽象类可以有方法体),有对象调用没意义,所以规定,抽象类(接口)是没有对象的。

  • 正因为抽象类没有对象,那如何调用抽象类中的方法并且让其有意义呢?解决方法就是通过一个普通类去继承这个抽象类,然后重写抽象类里面的方法,然后用这个普通类生成一个对象去调用重写的方法即可

    /*定义一个抽象类*/
    abstract class Person{
        public abstract void name();
    }
    /*定义普通类去继承这个实现类*/
    Class Boy extends Person{
        public void name(){
            System.out.println("我自己的名字叫lds");	
        }
    }
    Class Test{
        public static void main(String[] args){
            Person p = new Boy(); //这里格式允许这样 但是不可以Person p = new Person();
            p.name();  
        }
    }
    
  • 一个方法中的形参可以是抽象类,也就是说如:public void show(Person p){} ,当你看到方法为抽象类的时候,传入的是这个抽象类的子类的对象,因为抽象类无法生成对象。(接口也是如此原因就不赘述

    /*定义一个抽象类*/
    abstract class Person{
        public abstract void name();
    }
    /*定义普通类去继承这个实现类*/
    Class Boy extends Person{
        public void name(){
            System.out.println("我自己的名字叫lds");	
        }
    }
    Class Test{
        public static void main(String[] args){
           Person p = new Student();
            show(p); //编译成功
        }
        
       /*定义一个普通方法*/
        public static void show(person p){//这里为什么用static,因为在同一个类中,静态方法无法直接调用非静态方法,非静态方法可以直接调用静态方法(除了main方法)
            System.out.println("展示");
        }
    }
    

接口和抽象类的区别

相同点:抽象类和接口都是可以有未实现的方法。

不同点:①抽象类中的方法如果没有加 abstract 的话可以是已经实现的方法;而接口必须是未能实现的方法,也就是抽象方法。②抽象类的修饰符和接口的修饰符不一样,子类继承父类的修饰符也不一样。

/*定义一个抽象类*/
abstract class Person{
    public abstract void name();
     public void show(){
        System.out.println("展示");
    }
}
/*定义一个接口*/
public interface Student {
    public void show();
}
/*定义普通类去继承这个实现类*/
Class Boy extends Person{
    public void name(){
        System.out.println("我自己的名字叫lds");	
    }
    public void show(){
        System.out.println("展示aaa");
    }
}
/*定义普通类去实现这个接口*/
Class Girl implements Student{
    public void show(){
        System.out.println("我自己的名字叫chx");	
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值