java学习笔记之抽象类和接口

java学习笔记之–抽象类

@()[抽象类|java|super用法|强制转换|abstract|接口]

最近正在学习java,遇到抽象类,看书有些问题还是没有理解,这里通过网上资料详细说明:

  • 1 :[抽象类不能被实例化,实例化的工作应该交由它的子类去完成,它只需要一个引用即可][3];
  • 2 :[抽象方法必须由子类进行重写][3];
  • 3 :[抽象类中可以包含具体的方法,当然也可以不包含抽象方法][3]。
  • 4 :[只要包含一个抽象方法的抽象类,该方法必须定义成抽象类,不管是或否还包含其他方法][3]。
  • 5 :[子类中的抽象方法不能与父类的抽象方法同名][3]。
  • 6 :[abstract不能与final并列修饰同一个类][3];
  • 7 :[abstract 不能与private、static、final或native并列修饰同一个方法][3]。

抽象类

抽象类是如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类

代码块

  • 1 定义一个抽象类
@代码一
package abstractClass;

public abstract class Person //抽象类
{
    /**
     * Person是个抽象类,它除了自己定义抽象方法之外,
     * 还可以自己定义一般方法,getName() 和 抽象方法getDescription()
     */

    public Person(String n)
    {
        name = n;
    }

    public String getName()
    {
        return name;
    }

    public abstract String getDescription();// 这是抽象方法
    private String name;
}
  • 2 写一个student类,继承person类,重写getDescription()方法;
@代码二
package abstractClass;

public class Student extends Person {

    private String major;

    public Student(String n,String m){

        super(n);
        major = m;
    }

    @Override
    public String getDescription(){
        return "a student majoring in "+major;
    }
}
  • 3 定义Employee部分,重写getDescription()方法
@代码三
package abstractClass;

import java.util.Date;
import java.util.GregorianCalendar;

public class Employee extends Person {

    private double salary;
    private Date hireDay;

    public Employee(String n,double s, int year,int month,int day)
    {
        super(n);
        salary = s;
        GregorianCalendar calendar = new GregorianCalendar(year,month-1,day);
        hireDay = calendar.getTime();
    }

    public double getSalary()
    {
        return salary;
    }

    @Override
    public String getDescription()
    {
        return String.format("an employee with a salary of %.2f",salary);
    }
    public Date getHireDay()
    {
        return hireDay;
    }

    public void reaiseSalary(double byPercent)
    {
        double raise = salary * byPercent/100;
        salary+=raise;
    }

}
  • 4 main()函数部分,实例化变量Employee和student部分,对people[0]强制转换,调用其他实例化方法
@代码四
package abstractClass;

public class Persontest {
    /**
     * 这个程序是抽象类的说明
     */
    public static void main(String[] args){
        Person[] people = new Person[2];

        people[0] = new Employee("bruce",5000,1989,10,10);
        people[1] = new Student("harry","compute science");

        for(Person p:people)
            System.out.println(p.getName()+" ,"+p.getDescription());
        //下面定义的就是强制转换的类,把people[0]强制转换成为e,然后进行下一步对e的方法来操作。
        Employee e = (Employee)people[0];

        System.out.println(e.getHireDay());
        System.out.println(e.getSalary());
        System.out.println(e.getDescription());

    }
}

接口

在现实生活中,当我们想起某个用具的时候,往往想到的是该用具的功能性接口。比如手电筒,我们优先想到的是开关和电池没电的时候需要充电,而不是考虑手电筒的内部复杂的电路结构,以及手电筒的价格等其他因素。也就是说,一定程度上,用具的接口等同于用具本身。

接口使用中注意的几个方法

  • 1 [接口中不存在实现的方法][3]
  • 2 [实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现][3]
  • 3 [在实现多接口的时候一定要避免方法名的重复][3]

代码块

  • 1 cup接口定义
interface cup {
    void addWater(int w);
    void drinkWater(int w);
//    void playMusic();
}
  • 2 增加一个音乐播放的功能接口
interface MusicPlayer {
    void play();
}
  • 3 在类MusicCup中实施接口


public class MusicCup implements cup,MusicPlayer {

    // --------------------------------- 接口函数实现部分 --------------------------------
    public void addWater(int w)
    {
        this.water = this.water + w;
        System.out.println(this.water);

    }

    public void drinkWater(int w)
    {
        this.water = this.water - w;
        System.out.println(this.water);
    }


    public int waterCount()
    {

        return this.water;
    }

    public void play()
    {
        System.out.println("快使用双节棍嘿嘿哈嘿^_^");
    }
    //------------------------------------------------------------------------------------


    //main 函数
    public static void main(String args[]){

        MusicCup a_cup = new MusicCup();
        a_cup.addWater(10);
        a_cup.drinkWater(9);
        a_cup.play();
    }



    private int water=0;
}

/**
 *
 * public water 只要一改变,就都会改变,第一次计算是10,后来用10来接着计算后面的数值
 * 接口的实现,可以用很多个接口,然后是implements
 *
 * 定义的接口是在cup和MusicPlay函数中,它是接口的定义。
 *
 * 接口是封装的一种延伸,就是当我们用手电筒的时候,不需要的或者是内部的电路结构一般
 * 是要封装起来的,接口就是从类的具体定义中剥离出来,定义杯子,能加水,喝水,就是接口,接口一定程度
 * 等同于用具本身,内部细节的思考过程被摒弃。我们一般会定义一个接口的原型,然后告诉具体原型的使用方法,
 * 凡是定义的原型,必须在使用方法中具体实现。在实施接口中可以出现接口中没有的函数,比如noOfLegs函数。
 * 这里的接口很像C++里面的函数原型一样

 */

接口与抽象类的区别

抽象类方式,可以有任意范围的成员数据,同时也可以有自己的非抽象方法。但是接口,仅仅只能有静态、不能修改的成员数据,实现接口的非抽象类必须要实现该接口的所有方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值