黑马程序员--抽象类和接口
来源:互联网 发布:unity3d obj 文件导入 编辑:程序博客网 时间:2024/06/07 02:36
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1.使用抽象类
1). 抽象方法和抽象类
由abstract修饰的方法为抽象方法,抽象方法即只有方法的定义,没有方法体实现,用一个分号结尾。即方法五要素中,抽象方法缺少了一个要素(即:方法体)。也可以将抽象方法理解为不完整的方法。
若将抽象方法包含在类中,则该类也应该为抽象的,可以理解为,该类也不完整。抽象类由abstract关键字声明。
抽象类是不能实例化对象的,而一个类不能实例化是没有意义的,所以,需要定义类来继承抽象类,而如果一个类继承了抽象类,则其必须重写其抽象方法(变不完整为完整),除非该类也声明为抽象类。看下面的代码,定义了抽象方法和抽象类:
abstract class Shape { private double c; public Shape(double c) { this.c = c; } public abstract double area();}
通过上面的代码可以看到,area()方法没有方法体(连大括号也不存在),由abstract修饰,此为抽象方法。而Shape方法也由abstract修饰,即为抽象类。
2). 抽象类不可以实例化
抽象类不可以实例化,若Shape是抽象类的话,下面的代码是错误的:
Shape s1 = new Shape();
即使一个类中没有抽象方法,也可以将其定义为抽象类,同样,该类不可以实例化。
需要注意一点:abstract和final关键字不可以同时用于修饰一个类,因为final关键字使得类不可继承,而abstract修饰的类如果不可以继承将没有任何意义。两者放在一起,会起冲突。
3). 继承抽象类
一个类继承抽象类后,必须实现其抽象方法,不同的子类可以有不同的实现。看下面的代码,Square类与Circle类都继承自Shape类,并分别实现了重写的area()方法,只是其具体实现的代码不同:
class Square extends Shape { private double c; public Square(double c) { super(c); } public double area() { return 0.0625*c*c; }}class Circle extends Shape{ private double c; public Circle(double c) { super(c); } public double area() { return 0.0796*c*c; }}
4). 抽象类的意义
定义抽象类的意义在于:
为其子类提供一个公共的类型(父类引用指向子类对象);
封装子类中的重复内容(成员变量和方法);
定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。(子类需要实现此抽象方法)。
看如下的代码:
Shape[] sArr = {new Circle(100), new Square(100), new Circle(200), new Square(150) };for(int i=0; i<sArr.length; i++) { Shape shape = sArr[i]; System.out.println(shape.area());}
通过上面的代码可以看出,以Shape类型的引用访问其子类,所有子类都会有area方法,只是其具体的实现各不一样。
2.使用接口
1). 定义一个接口
接口可以看成是特殊的抽象类。即只包含抽象方法和常量的抽象类。可以通过interface关键字来定义接口。看如下代码:
interface Runner { public static int DEFAULT_SPEED = 100 public void run(); }
注意,run()方法,此处可以省略public abstract。因其默认就是public abstract的。
2). 实现接口
与继承不同,一个类可以实现多个接口,实现的接口直接用逗号分隔。当然,该类需要实现这些接口中定义的所有方法;
一个类可以通过implements关键字”实现”接口。一个类实现了某个接口后必须实现该接口中定义的所有方法。看下面的代码,类实现了接口并实现了方法:
class AmericanCurl implements Runner , … { public void run() { System.out.println("run..."); } }
另外需要说明的一点,接口可以作为一种类型声明变量,一个接口类型的变量可以引用实现了该接口的类的对象;通过该变量可以调用该接口中定义的方法(具体的实现类提供了方法的实现)。代码如下所示:
Runner runner = new AmericanCurl();
此句代码为,一个接口类型变量,引用了子类的对象。调用时,调用的是子类对象的具体的实现。
3). 接口的继承
接口间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口。子接口继承了父接口中定义的所有方法。代码如下所示:
interface Runner { public void run();}interface Hunter extends Runner { public void hunt();}class AmericanCurl implements Hunter { public void run() {… … …} public void hunt() {… … …} }
说明:AmericanCurl实现了Hunter,必须实现Hunter接口中的hunt方法以及其父接口Runner中的run方法。.
- 黑马程序员-----抽象类和接口
- 黑马程序员_抽象类和接口
- 黑马程序员 Java 抽象类和接口
- 黑马程序员_03 抽象类和接口
- 黑马程序员_抽象类和接口
- 黑马程序员—抽象类和接口
- 黑马程序员—抽象类和接口
- 黑马程序员------- 抽象类和接口-------
- 黑马程序员_接口和抽象类
- 黑马程序员_抽象类和接口
- 黑马程序员:抽象类和接口
- 黑马程序员--抽象类和接口
- 黑马程序员------------抽象类 接口
- 黑马程序员:抽象类、接口
- 黑马程序员_抽象类和接口的比较
- 黑马程序员_Java抽象类和接口的比较
- java_抽象类和接口(黑马程序员)
- 黑马程序员-抽象类 模板方法和接口
- 必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序
- 如何在编译时改变App的图标
- cent python3离线安装setuptools
- cvc-complex-type.2.4.a: Invalid content was found
- shell-find使用
- 黑马程序员--抽象类和接口
- Android 开源框架Universal-Image-Loader完全解析(一)
- Android0909<十四>(Service、Android线程)
- 注册表查询示例代码
- linux sync
- 我就是一根儿筋 也许问题很简单
- 程序员应该扪心自问的10个问题
- JSP页面中的标签以及内置对象request等
- 批量删除svn隐藏文件