一、抽象类

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 抽象类和接口的更多相关文章

  1. 0026 Java学习笔记-面向对象-抽象类、接口

    抽象方法与抽象类 抽象方法用abstract修饰,没有方法体部分,连花括号都不能有: 抽象方法和抽象类都用abstract修饰 包含抽象方法的类一定是抽象类:但不包含抽象方法的类也可以是抽象类 不能创 ...

  2. Java学习笔记之抽象类与接口

    抽象类(abstract) 抽象类概述:一个类被abstract修饰表示这个类是抽象类, 自己定义方法但是不实现方法,后代去实现 抽象方法:   一个方法被abstract修饰表示这个方法是抽象方法 ...

  3. Python学习日记(二十五) 接口类、抽象类、多态

    接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...

  4. Java 学习(14):接口 & 包(设置 CLASSPATH 系统变量)

    Java 接口(英文:Interface) 定义:在JAVA编程语言中,接口是一个抽象类型,是抽象方法的集合,接口通常以 interface 来声明. 一个类通过继承接口的方式,从而来继承接口的抽象方 ...

  5. java提高篇(五)-----抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念 ...

  6. 十、Java基础---------面向对象之抽象类与接口

    抽象类(abstract)     当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的方 ...

  7. Java中多态、抽象类和接口

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...

  8. [core java学习笔记][第六章接口与内部类]

    接口域内部类 接口 描述类具有什么功能,不给出具体实现. 内部类 用于设计协作关系的类集合 代理 实现任意接口的对象. 6.1 接口 接口声明 public interface Comparable ...

  9. (转)java提高篇(五)-----抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念 ...

随机推荐

  1. CentOS7搭建SAMBA服务器实现与WIN10匿名共享文件

    1.安装SAMBA yum -y install samba samba-client samba-common 2.修改文件打开数 vi /etc/security/limits.conf 最后添加 ...

  2. Strust2 <c:forEach> 循环控制标签

    <c:forEach>为循环控制标签 语法:迭代一集合对象中的所有成员 <c:forEach [var="varName"] items="collec ...

  3. VS2008试用版到期解决办法

    在Windows 7下,VS2008试用版无法正常升级到正式版.原因是维护页面的注册码输入框和升级按钮被隐藏.通过本补丁,可让注册码输入框和升级按钮恢复正常显示 点击此处下载补丁 1.安装完90天试用 ...

  4. (转)mysql 的 find_in_set函数使用方法

    举个例子来说: 有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 现在有篇文章他既是 头条,又是热点,还是图文, type中以 1 ...

  5. Google与微软为jQuery等类库提供的CDN服务

    相关链接: Google:  http://code.google.com/apis/ajaxlibs/Microsoft:  http://www.asp.net/ajaxlibrary/cdn.a ...

  6. 安装PHP过程中,make步骤报错:(集合网络上各种解决方法)

    安装PHP过程中,make步骤报错:(集合网络上各种解决方法) (1)-liconv -o sapi/fpm/php-fpm /usr/bin/ld: cannot find -liconv coll ...

  7. Hive学习之三 《Hive的表的详解和应用案例详解》

    一.Hive的表 Hive的表分为内部表.外部表和分区表. 1.内部表,为托管表. 2.外部表,external. 3.分区表. 详解: 内部表,删除表的时候,数据会跟着删除. 外部表,在删除表的时候 ...

  8. 跟我学android-Notification

    Notification 可以理解为通知的意思,会出现在通知栏,比如来了一条短信 使用 Notification 有以下3个步骤: 1. 创建 NotificationManager的对象 2.为No ...

  9. IE8’s Substr() Bug

    IE8不支持substr()函数, 第一个参数为负数,比如:var index = id.substr(-1, 1);替代:var index = id.substr(id.length-1, 1);

  10. javascript 16/1/14随记

    1.想在一个事件或者函数之后,触发某个事件. var flag=false //定义一个全局变量 function aku(){ if(flag){ } } sizemousedown=functio ...