java基础篇--抽象类与接口

一、简答概述

1、什么是抽象类?抽象类可以实例化吗?为什么?

抽象就是将拥有共同方法和属性的对象提取出来,提取后,重新设计一个更加通用、更加大众化的类,就叫抽象类。抽象类不能实例化,即不能用new生成实例对象。

1)抽象类可以有具体的方法,或者全部都是具体方法,但一个类中只要有一个抽象方法,那么这个类就是抽象类,并且必须用abstract修饰类。
2)抽象类可以被继承,则子类必须实现抽象类中的全部抽象方法,否则子类也将是抽象类。抽象类也可主动继承实体类。


2、什么是接口?接口有什么规范?
interface 差不多 = = abstract class
1)接口是继承体系之外的,用于功能扩展!想扩展就实现,不想就不用实现。
2)接口中只能声明抽象方法和常量且声明格式固定,
成员变量默认都public static fianl,成员方法默认都是public abstract属性。

3)具体类实现了一个接口,则必须实现全部的抽象方法,若没有全部实现,则该类为抽象类。所以说,接口约定了具体类的方法,约定了类的外部行为。
4)具体类可以同时实现多个接口,就是多继承现象。

多重继承:class Cat implements Hunter , Runner   //Cat 既是Hunter 也是 Runner。

5)接口用 implements 表实现,实际是继承关系,可有多个接口(实现),继承用 extends 只能有一个继承关系。
一个类既可以继承的同时,又“实现”接口:class A extends B implements C , D
类与类之间是继承关系,类与接口之间是实现关系,接口与接口之间是继承关系,且只有接口之间可以多继承,即:interface A{},interface B{},interface C extends A , B 

接口多继承时要注意,要避免A、B接口中有方法名相同、参数列表相同,但返回值类型不相同的情况,因为被具体类实现时,不确定调用哪个方法


3、抽象类与接口有什么区别?

声明方法的存在而不去实现它的类叫做抽象类,它主要用于要创建一个体现某些行为的类,并为其声明方法,但不能在该类中实现该类;

接口是抽象类的变体,新型多继承性可通过实现这样的接口而获得,接口中所有方法都是抽象的,所有成本员变量都是public static fianl属性的。

1)从语法角度:抽象类可以有自己的成员变量和成员方法、抽象方法,而在interface中一般不定义成员变量或者是public static fianl属性的,所有的方法都是abstract。
2)从编程的角度:abstract class在java语言中是单继承的,一个子类只能有一个父类,实现抽象类时可以只实现其中的一部分方法;而接口表示的是多继承关系,一个类可以实现多个interface,要实现一个接口的话则要实现这个接口中所有的抽象方法。
3)从问题域角度:abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。
类与类之间是继承关系,类与接口之间是实现关系,接口与接口之间是继承关系,且只有接口之间可以多继承


二、实例

1、抽象类单继承

package home;

abstract class Animal {
	abstract void eat();//抽象出Animal的共性

//	public void catchMouse() {//这是Cat向上转型使用的	
//	}

}

class Cat extends Animal {
	public void eat() {
		System.out.println("我是貓,我喜歡吃鱼!");
	}
	//扩展父类Animal特性,不仅会吃还会有自己能力
	public void catchMouse() {
		System.out.println("我還會抓老鼠哦!");
	}
}

class Dog extends Animal {
	public void eat() {
		System.out.print("我是狗,我喜歡吃骨头!");
	}

	public void kanJia() {
		System.out.print("我還會看家哦!");
	}
}

class DuoTaiDemo {
	public static void main(String[] args) {
		Animal a = new Cat();// 向上转型、实例化,可是与下面Dog有什么区别呢
		a.eat();
	//	a.catchMouse();	//要实现抓老鼠这个技能,那么Animal也要有这个方法声明才好哦
		
		Dog c = new  Dog();// 实例化
		c.eat();
		c.kanJia();
	}

}

结果:


2、接口实例(看书、暂略)







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值