Java抽象类、接口理解

        软件开发前,首先要对需求进行对模块进性划分,而模块划分最重要的就是把每个模块抽象成类。这也是面向对象编程的最基本思想——一切都看成类。而进行类的设计,最重要的是规定每个类中的属性和方法

        Java中可以用抽象类接口强制规定其子类必须实现的方法。

        例如:定义一个抽象类Person,其中有一个抽象方法getDescription(); Student继承了Person类,那么Student类中必须实现getDescription();方法,否则编译过不去。

abstract class Person {
	public abstract String getDescription();
}

public class Student extends Person{
	@Override
	public String getDescription() {
		return null;
	}
}

        再如:定义一个接口Describe,其中有一个方法getDescription(); Student实现了Describe接口,那么Student类中必须实现getDescription();方法,否则也编译过不去。

public interface Describe {
	public String getDescription();
}

public class Student implements Describe{
	@Override
	public String getDescription() {
		return null;
	}
}

        既然抽象类和接口的功能相同,那么为什么在Java中两者都存在呢?

        这是因为,Java只支持单继承。如果某一子类只有一个父类,那么用抽象类规定其子类必须实现的方法是没有问题的,但某一子类需要从两个父类继承下来,在Java中不能被实现。

        上例中,Student类继承了Person类,因为“学生”是“人”的子类,若Student类还要继承School类,School类中定义了学生成绩、班级等一些属性和方法。这在Java中是无法实现的。

abstract class School {
	public abstract String getClassRoom();
	public abstract String getScore();
}

        解决的方法是将School声明为接口:

public interface School {
	public abstract String getClassRoom();
	public abstract String getScore();
}

        则Student类如下,即必须实现接口Describe中的方法,也必须实现接口School中的方法。

public class Student implements Describe, School{
	@Override
	public String getDescription() {
		return null;
	}
	@Override
	public String getClassRoom() {
		return null;
	}
	@Override
	public String getScore() {
		return null;
	}
}

        综上,抽象类和接口都是规定其子类必须实现的方法。在只有一个父类时,抽象类和接口的作用基本相同。接口是为了解决Java中不支持多继承的问题


其他一些问题:

1.父类与子类引用的问题:

        父类的对象可以引用一个子类的对象。例如Person类,Student是其子类。

        Person p;

        p = new Student ();

        因为p为Person的对象,它具有Person中的属性和方法,而Student类继承了Person类,也就是说Student包括了Person类中所有的属性和方法,在p.method()时,Student类中的方法,在Person中肯定是有的,所以可以将new Student() 赋给p。而反过来却不行,Student s; s = newPerson();  s.method() 时,Person类中有Student类中没有的方法。s.method()可能调用不到方法。

2. 接口变量

        经常看到这种写法  List<String> list = new ArrayList<String>();

        List是个接口,ArrayList是实现了List接口的类。因为接口不是类,不能使用new运算符实例化一个接口 list = new List(); 但却能声明接口变量 List list; 接口变量必须引用实现了接口的类对象 list = new ArrayList();

        这样做的好处是:调用接口中的方法、而非类中的实现方法。编写程序时,经常会用到第三方的类库,在类库中会返回一个列表(List),但未必会返回一个ArrayList,那么用这种方式就不需要了解是什么实现类,把它当List接收过来就可以了。这提高程序的透明性,让底层的实现对上层使用者封装。这是面向接口的编程

        面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法。

        面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现。

 

欢迎批评指正!微笑

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值