13.1.1抽象类的基本概念

抽象类定义规则如下:
(1)抽象类和抽象方法用abstract关键字修饰
(2)抽象类不能实例化,不能用new 关键字去产生新对象
(3)抽象类方法只需声明,不需实现
(4)含有抽象方法的类必须声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化

abstract class Person{//抽象类中声明构造方法后,子类必须明确调用public Person(){}public abstract void talk();
}
class Student extends Person
class Worker extends Person
s.talk();
w.talk();
//抽象类不能使用final 定义
//在外部抽象类上无法使用static声明,但是内部抽象类可以使用static定义abstract class Book{public abstract void print();static abstract class CD{//静态内部抽象类public abstract void get();}
}class JavaCD extends Book.CD//继承抽象类
{public void get(){System.out.println("java 学习");}
}
public class Test{public static void main(String[] args){Book.CD cd=new JavaCD();cd.get();}
}
//抽象类之中可以没有静态方法,但是即便没有抽象方法的抽象类也不能够直接在
//外部通过关键字new实例化

13.2.1 接口的基本概念

使用接口的规则:
  接口必须有子类,子列依靠implements关键字可以同时实现多个接口
  接口的子类(如果不是抽象类0则必须覆盖接口之中的全部抽象方法
  接口可以利用对象多态性,利用子类实现对象的实例化
  接口与一般类一样,本身也具有数据成员于方法,但是数据成员一定要赋初值,且此值不能再改,方法也必须是抽象方法或defalut方法。在接口定义模式中,抽象方法声明的关键字abstract可以省略
  同理,接口的数据成员必须赋初值,且不能更改,fianl关键字也可以省略

interface A{public static String INFO="Hello,World!";//全局常量public void print();//抽象方法defualt public void otherprint()//带方法体的默认方法{System.out.println("defualt method");}
}
//带default方法接口的实现
InterfaceAB ab=new InterfaceAB();
ab.print();
ab.otherprint();
System.out.println(InterfaceA.INFO);
//仅有default方法接口的使用
InterfaceAB ab=new InterfaceAB();
ab.otherprint();
//子类继承多个接口的应用
X x=new X();//X 实现了A、B两个接口
A a=x;//为父接口实例化
B b=x;
a.print();
b.get();
一个类实现多个接口时,若接口中有默认方法,不能出现同名默认方法
多继承中,如果一个子类既要实现接口又要继承抽象类,则应该具有先继承后实现的顺序
interface A{public static final String INFO="hello";public abstract void print();
}class X implements A//继承抽象类
{public void print(){System.out.println(INFO);}
}public class Test{public static void main(String[] args){X x=new X();A a=x;a.print();}
}
//继承抽象类实现接口
X x=new X(); //class X extends C implements A,B
A a=x;
B b=x;
C c=x; //为抽象类实例化
a.print();
b.get();
c.fun();
//一个接口可继承多个接口
X x=new X();
A a=x;
B b=x;
C c=x; //class X extends C implements D
D d=x; //inferface D extends A,B
a.print();
b.get();
c.fun();
d.printD();

13.2.3 接口的作用——制定标准

接口是标准,所谓的标准是各方共同遵守的一个规则。只要操作标准统一了,所有的参与者才可以按照统一的规则操作
   比如电脑与外设的连接,USB就是一个操作标准

interface USB{//定义USB接口标准public void work();//得到USB设备表示要进行的工作
}class Computer{public void plugin(USB usb){//按照固定的方式工作usb.work();}
}class Print implements USB{public void work(){System.out.println("打印机用USB接口,连接开始工作");}
}class Flash implements USB{//U盘实现了USB接口public void work(){System.out.println("U盘使用了USB接口,连接开始工作");}
}public class Test{public static void main(String args[]){//数以这里主函数的参数发生了变化Computer com=new Computer();com.plugin(new Print());//电脑上使用打印机工作com.plugin(new Flash());//电脑上使用U盘工作}
}

13.2.4 接口的作用——工厂设计模式

在面向对象设计中,通常最常用的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下,new操作符直接生成会带来一些问题。举例来说,许多类型对象的创造需要一系列的步骤。你可能需要计算或取得对象的初始设置;选择生成哪个子对象实例;或在生成你需要的对象之前必须先生成一些辅助功能的对象。在这些情况,新对象的建立就是一个“过程”,不仅是一个操作,像一部大机器的一个齿轮转动

//接口的作用
interface Fruit{//定义水果标准public void eat();//吃
}class Apple implements Fruit{public void eat(){System.out.println("吃苹果");}
}class Orange implements Fruit{public void eat(){System.out.println("吃橘子");}
}public class Test{public static void main(String[] args){Fruit f=new Apple();f.eat();}
}//此例中发现在主类(客户端)之中直接让一个具体的子类和一个接口绑定在一起,那么
如果要修改使用的子类,对于程序而言,就意味着要修改客户端。所以此时程序就出现了
接口和子类耦合问题,为了解决这一问题,使用工厂模式
//工厂模式
interface Fruit{//定义水果标准public void eat();//吃
}class Apple implements Fruit{public void eat(){System.out.println("吃苹果");}
}class Orange implements Fruit{public void eat(){System.out.println("吃橘子");}
}class Factory1{public static Fruit getInstance(String className){if("apple".equals(className)){return new Apple();}if("orange".equals(className)){return new Orange();}return null;}
}
public class Test{public static void main(String args[]){Fruit f=Factory1.getInstance("apple");//初始化参数f.eat();}
}

13.2.5 接口的作用——代理设计模式

代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用。
  代理,指的就是一个角色代表另一个角色采取行动,就像生活中,一个红酒厂是会
直接把红酒零售给客户的,通常都是通过代理来完成它们的销售业务的。而客户也不为了喝道红酒去找厂商,只需要找到厂商在当地的代理就行了。
  这里产生里四个对象:客户、代理商、红酒厂商、代理商-红酒厂商关系
  代理模式的作用:为其他对象(红酒厂商)提供一种代理(代理商)以控制对这个对象(红酒厂商)的访问

abstract class Subject//代理请求
{abstract public void request();
}class RealSubject extends Subject //真是角色(红酒厂商)
{public void request(){System.out.println("我是红酒厂商,欢饮品尝购买!");}
}class ProxySubject extends Subject//代理角色(代理商)
{private RealSubject realSubject;//以真实角色作为代理角色的属性public void request(){ //该方法封装了真实对象的request方法preRequest();if(realSubject==null){realSubject=new RealSubject();}realSubject.request();//此处执行真实对象的request方法postRequest();}private void preRequest(){System.out.println("广告宣传,免费品尝!");//something you want to do before requesting}private void postRequest(){System.out.println("付款购买");//something you want to do after requesting}
}public class Test{public static void main(String[] args){Subject sub=new ProxySubject();//子类为接口实例化sub.request();}
}//代理模式的核心组成:一个接口、两个子类,一个子类负责真实的业务操作功能
//另一个子类负责完成与真实业务有关的操作

13.3 抽象类和接口的对比

区别 抽象类 接口
定义语法 abstract class 类名称{} interface 接口名称{}
组成 常量、全局变量、变量、构造方法、普通方法、抽象方法 全局变量、抽象方法、默认方法
权限 可以使用各种权限 都是public权限
使用 一个子类可以通过extends关键字继承一个抽象类 子类通过implements关键字实现多个接口
关系 一个抽象类可以实现多个接口 一个接口不能继承抽象类,但可以继承多个接口
设计模式 模板设计模式 工厂设计模式、代理设计模式
局限 单继承局限 没有单继承局限

Java从入门到精通 第13章 抽象类与接口相关推荐

  1. Java从入门到精通 第22章 多线程

    Java从入门到精通 第22章 多线程 //单一线程的运行流程 public class Nanjing {public static void main(String[] args) {// TOD ...

  2. 《Java从入门到精通》第九章学习笔记

    第9章 类的高级特性 一.抽象类 抽象类只声明方法的存在,不能被实例化,就是说抽象类不能创建其对象,在定义抽象类时要在class前面加上abstract关键字. 1 /*定义一个抽象类Fruit,并定 ...

  3. java从入门到精通第11章_《Java从入门到精通》第十章学习笔记

    第10章 Java集合类 一.概述 Java中的java.util包中提供了一些集合类,也被称为容器,不同于数组,集合的长度是可变的,存放的是对象的引用.常用的集合有List集合.Set集合.Map集 ...

  4. java从入门到精通第8章_《Java从入门到精通》第七章学习笔记

    第7章 类和对象 一.类和对象的定义及关系 1.类是同一类别对象的抽象定义:可以理解为是某一类具体对象的模子,确定对象将会拥有的特性,包括该类对象具备的属性和方法. 2.对象是对类的一种具体化的客观存 ...

  5. Java从入门到精通章节练习题——第六章

    Java从入门到精通章节练习题--第六章 Exercise 1 简易计算器 Exercise 2 购买电影票 Exercise 3 计算平均分 Exercise 4 厘米与英寸互转 Exercise ...

  6. Java从入门到精通 第九章 数字处理类

    Java从入门到精通 第九章 数字处理类 一.数字格式化 二.数学运算 1)Math类 2)常用数学运算方法 三.随机数 1)Math.random()方法 2)Random类 四.大数字运算 1)B ...

  7. java从入门到精通第四版明日科技书籍简介及下载

    Java从入门到精通(第4版)(附光盘) 平装 – 2016年10月20日 <Java从入门到精通(第4版)(附光盘)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用 ...

  8. 1. Vue从入门到精通(第一章 vue核心)

    Vue从入门到精通(第一章 vue核心) 第一章 Vue核心 1. Vue简介 1.1 Vue是什么? 1.2 Vue的作者以及迭代版本 1.3 Vue的特点 2. 搭建Vue开发环境 2.1 安装V ...

  9. java从入门到精通 ppt_《Java从入门到精通》第4版全书完整PPT课件

    [实例简介] <Java从入门到精通>第4版全书完整PPT课件 [实例截图] [核心代码] e3a1ab08-ca73-47e5-9a3a-bec0b60c991a └── <Jav ...

  10. java从入门到精通_想要开始学java?你要的java从入门到精通布列如下!

    java从入门到精通,让我来告诉你! 毫无疑问,java是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握java看似是一件十分困难的事.其实,只要掌握了科学的学习方法 ...

最新文章

  1. 【建议收藏】Spring Boot注解全梳理!
  2. pandas使用isna函数和any函数计算返回dataframe中包含缺失值的数据行(rows with missing values in dataframe)
  3. 深度学习将眼睛变成健康“指示器”
  4. python数据分析的主要流程-python 数据分析概述
  5. 整理照片,python批量修改名称
  6. LeetCode题组:第169题-多数元素
  7. 复制的maven项目中,子maven找不到父maven问题解决
  8. 在Web中实现C/S模式的Tab
  9. linux下mysql-5.5.15安装详细步骤
  10. 牛客练习赛50-C——tokitsukaze and Soldier
  11. 如果重新设计网络,有没有可能合并IP地址跟MAC地址?
  12. 2015-01-13
  13. LaTex 加粗(加黑)的方式
  14. 安装ActiveBPEL引擎(tomcat5.5+mysql5.1+ActiveBPEL5.0.2)
  15. nokia n9 android 4.4,NOKIA N9获APK兼容层 可安装Android应用
  16. 面向对象的软件开发方法
  17. pandas将df赋值到另一个df_pandas基础
  18. The field file exceeds its maximum permitted size of 1048576 bytes
  19. hexo博客可以在百度谷歌搜索到
  20. uniapp中canvas将矩形图片绘制成圆形图片以及保存canvas到手机

热门文章

  1. python源码保护之cython
  2. 1.9 Important Themes(一些重要的概念)
  3. python-jieba-分词----官方文档截取
  4. C# 模拟Form提交
  5. innodb redo buffer的认识
  6. matplotlib创建图的基本方法
  7. 学习docker on windows (1): 为什么要使用docker
  8. GNU glibc 爆 gethostbyname 缓冲区溢出漏洞
  9. Server 2008 R2远程桌面授权
  10. PagerAdapter跟BaseAdapter的覆盖