Java学习日记-7 抽象类和接口
一、抽象类
abstract修饰:类和类中的方法
抽象方法:abstract type name(parameter-list);
(abstract不能修饰static方法和构造函数)
引用:抽象类有其引用变量,可以引用任何继承了该抽象类的子类的对象,但抽象类不会有实例对象。
继承:子类继承抽象类时,必须实现超类中的所有抽象方法,否则子类仍为抽象类。
成员:抽象类可以有成员变量(接口只能有常量,抽象类可以有常量,也可以有变量),也可以有具体方法(甚至是静态方法)。
构造函数:抽象类也有构造函数,子类的构造函数必须调用。
注意:抽象类中可以有静态的方法和变量
class A extends B
{
public static void main(String[] args)
{
B.show();
System.out.println(B.x);
}
}
abstract class B
{
static int x = 10;
public static void show(){
System.out.println("haha");
}
}
抽象类中的静态成员
抽象类和抽象方法的特点:
1.抽象方法一定在抽象类或者接口中
2.抽象方法和抽象类都必须被abstract关键字修饰(接口中的抽象方法可以省略abstract关键字)
3.因为调用抽象方法没有意义,故java规定抽象类不能new对象
4.抽象类中的方法想要被调用,就要由子类重写所有的抽象方法,然后建立子类对象进行调用,如果子类只覆盖了部分抽象方法,该子类肯定也必须还是一个抽象类
5.抽象类中可以全部为抽象方法也可以没有抽象方法(抽象类中可以没有抽象方法,在语法上是可行的)
抽象类的作用场景:
抽象类与一般类并无太大区别,该如何描述事物就如何描述。只不过有些功能,不同的子类有不用的实现内容,就可以把这些方法抽象化,不定义方法主体。
例如:
class Employee extends Person {
private double salary;
private Date hireday;
public Employee(String n, double salary, int year, int month, int day) {
super(n);
this.salary = salary;
GregorianCalendar calendar = new GregorianCalendar(year, month, day);
hireday = calendar.getTime();
}
public Employee(String n, double salary, int year, int month, int day, int hour,int minute, int second) {
super(n);
this.salary = salary;
GregorianCalendar calendar = new GregorianCalendar(year, month, day, hour, minute, second);
hireday = calendar.getTime();
}
public double getSalary() {
return salary;
}
public Date getHireday() {
return hireday;
}
@Override
public String getDescription() {
return "an employee with a salary of $" + salary + '\n' + hireday;
}
}
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;
}
}
public abstract class Person {
private String name = "haha";
public Person(String n){
name = n;
}
public abstract String getDescription();
public String getname(){
return name;
}
}
public class AbstractTest {
public static void main(String[] args) {
Person[] p = new Person[2];
p[0] = new Employee("Tom", 9000.0, 1999, 1, 10, 19, 20, 21);
p[1] = new Student("Jerry", "Math");
for (Person person : p) {
System.out.println(person.getDescription());
}
}
}
抽象类举例
二、接口(比抽象类更抽象的存在)
接口关键字:interface和class同等级
接口的特点:
1.成员变量:全部默认public static final 即静态常量
2.方法:所有方法默认public abstract 即抽象的,声明时不必再写public,实现接口的方法必须声明为public(保持与接口一致)。
实现方法的返回类型和签名必须与接口中定义中定义的一致
(接口中的方法可常量都是可选项,什么都没有的空接口在语法上也是允许的)
3.继承/实现:一个接口可以继承多个接口(类只能单继承类),一个类可以实现多个接口
4.方法实现:接口的实现类必须实现接口中的全部抽象方法,否则其实现类必须是抽象类
5.访问修饰符:默认为包内可访问,public为包外也可(当一个接口被声明为public时,必须位于同名文件中)
(接口是比抽象类更加抽象的存在,不能有实例变量(可以有常量),不能有任何具体方法,是纯粹的抽象)
抽象类和接口的区别:
1.抽象类是类,接口是接口,不是类
2.抽象类中可以有:成员变量,静态常量,抽象方法,具体方法(四选0~4都OK)
接口中只能有:静态常量,抽象方法(至少二选一)
3.接口可以继承(extends)接口,但接口不能继承类/抽象类,而类/抽象类可以实现(implement)接口
4.抽象类和类之间只能单继承,接口之间、接口和类/抽象类可以多继承
5.一个类可以实现多个接口,但是只能继承一个抽象类
总结:抽象类、一般类和接口之间的关系

class A extends B //(1)
{
char name = 'A';
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
class B extends abstractA //(2)
{
char name = 'B';
}
class C
{
char name = 'C';
}
abstract class abstractA extends C //(3)
{
String name = "abstractA";
}
abstract class abstractB extends abstractA //(4)
{
String name = "abstractB";
}
interface inA
{
String name = "inA";
}
interface inB extends inA,inC //(5)
{
String name = "inB";
}
interface inC
{
}
class D implements inA //(6)
{
char name = 'D';
}
abstract class abstractD implements inB //(7)
{
String name = "abstractD";
}
抽象类、一般类和接口
Java学习日记-7 抽象类和接口的更多相关文章
- 0026 Java学习笔记-面向对象-抽象类、接口
抽象方法与抽象类 抽象方法用abstract修饰,没有方法体部分,连花括号都不能有: 抽象方法和抽象类都用abstract修饰 包含抽象方法的类一定是抽象类:但不包含抽象方法的类也可以是抽象类 不能创 ...
- Java学习笔记之抽象类与接口
抽象类(abstract) 抽象类概述:一个类被abstract修饰表示这个类是抽象类, 自己定义方法但是不实现方法,后代去实现 抽象方法: 一个方法被abstract修饰表示这个方法是抽象方法 ...
- Python学习日记(二十五) 接口类、抽象类、多态
接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...
- Java 学习(14):接口 & 包(设置 CLASSPATH 系统变量)
Java 接口(英文:Interface) 定义:在JAVA编程语言中,接口是一个抽象类型,是抽象方法的集合,接口通常以 interface 来声明. 一个类通过继承接口的方式,从而来继承接口的抽象方 ...
- java提高篇(五)-----抽象类与接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念 ...
- 十、Java基础---------面向对象之抽象类与接口
抽象类(abstract) 当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的方 ...
- Java中多态、抽象类和接口
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
- [core java学习笔记][第六章接口与内部类]
接口域内部类 接口 描述类具有什么功能,不给出具体实现. 内部类 用于设计协作关系的类集合 代理 实现任意接口的对象. 6.1 接口 接口声明 public interface Comparable ...
- (转)java提高篇(五)-----抽象类与接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念 ...
随机推荐
- 屏幕录像专家V7.5(完美破解版,无水印)下载
分享一个屏幕录像工具.屏幕录像专家V7.5(完美破解版,无水印).经测试可破解使用. 破解注册 点击安装.EXE,安装软件. 点击安装好的屏幕录像专家,会给你一个机器码,要你注册,复制下这个机器码(下 ...
- CDOJ 92 – Journey 【LCA】
[题意]给出一棵树,有n个点(2≤N≤105),每条边有权值,现在打算新修一条路径,给出新路径u的起点v,终点和权值,下面给出Q(1≤Q≤105)个询问(a,b)问如果都按照最短路径走,从a到b节省了 ...
- 用js生成二维码
<!doctype html> <html> <meta charset="utf-8"/> <head> <script s ...
- HTML 详细介绍
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- trie树信息抽取之中文数字抽取
这一章讲一下利用trie树对中文数字抽取的算法.trie树是一个非常有用的数据结构,可以应用于大部分文本信息抽取/转换之中,后续会开一个系列,对我在实践中摸索出来的各种抽取算法讲开来.比如中文时间抽取 ...
- UIScrollView 之图片缩放
UIScrollView 之图片缩放 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理 也就是说,要完成缩放功能的话,只 ...
- 了解HTML的代码注释
什么是代码注释?代码注释的作用是帮助程序员标注代码的用途,过一段时间后再看你所编写的代码,就能很快想起这段代码的用途. 代码注释不仅方便程序员自己回忆起以前代码的用途,还可以帮助其他程序员很快的读懂你 ...
- C# static 干货全解析
讲解顺序 背景 静态字段 静态函数 静态方法 疑问解答 背景 static来源 在编写类的时候,有时候需要类里面的某个成员具有唯一性,也就是,对所有的对象都保持只有一个的状态.比如创建个人信息,我们都 ...
- 关于T-SQL重编译那点事,内联函数和表值函数在编译生成执行计划的区别
本文出处:http://www.cnblogs.com/wy123/p/6266724.html 最近在学习 WITH RECOMPILE和OPTION(RECOMPILE)在重编译上的区别的时候,无 ...
- [Head First设计模式笔记]----命令模式
命令模式定义:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图: 适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指 ...