抽象类

为什么用 抽象类,接口

我的未来我决定 提交于 2020-02-08 20:34:03
刚学 Java 语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有方法名,没有方法体的东西,我实现它又有什么用呢?我从它那什么也得不到,除了一些方法名,我直接在具体类里加入这些方法不就行了吗? 为什么一定要有抽象类这个概念?为什么就不能把这个父类写成一个具体的类,子类再继承它不就可以了吗?何必弄一个抽象类出来,还要弄一些没有方法体的抽象方法,弄得又象接口又象类的,让人捉摸不定。 当我开始学习java设计模式,真正走进面向对象设计的大门之后,我才发现,自己对面向对象设计的理解原来是那么的片面,那么的肤浅,根本就没有真 正理解面向对象思想的精髓,在某一种程度上还受着面向过程的影响,以为弄出了一个个类,就算是面向对象了,而其实还是被过程所驱使着。 面向对象思想,最关键的就是 抽象 。 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了。当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 呢,面对对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用. 既然面向对象设计的重点在于抽象,那Java接口和Java抽象类就有它存在的必然性了。

Java中抽象类和接口的区别

 ̄綄美尐妖づ 提交于 2020-02-08 20:33:16
注:本文转载自 http://blog.csdn.net/sunboard/archive/2009/01/18/3831823.aspx ---------------------------------------------------------------------------------------------------------   一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了。当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 呢,面对对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用,是不是一下子感觉自己对复用理解的高度又上升了一层?^_^   说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象类了,这也是本文我想说的重点。   既然面向对象设计的重点在于抽象,那Java接口和Java抽象类就有它存在的必然性了。   Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序 的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口

2020.2.8 假期Java巩固学习

北城以北 提交于 2020-02-08 19:10:58
抽象类 抽象方法:只要方法的声明,没有方法的实现。以分号结束:abstract int abstractMethod(int a); 抽象类不能被实例化。抽象类是用来作为父类被继承的,抽象类子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。(只要类中有一个抽象方法,那么这个类就是一个抽象类。) public abstract class Animal { public abstract void test ( ) ; public abstract void move ( ) ; } class Dog extends Animal { public void test ( ) { . . . . . . } public void move ( ) { . . . . . . } } abstract class Bird extends Animal { //抽象类可以继承抽象 public void move ( ) { . . . . . . } public abstract void test ( ) ; } 抽象类不可用final声明,因为它修饰的类是最终的类,不能被继承。 模板方法设计模式 抽象类体现的就是一种模板的设计,抽象类作为多个子类的通用模板。 public abstract class Template { public

抽象类中嵌套接口

倖福魔咒の 提交于 2020-02-08 18:08:05
更新记录 【1】2020.02.08-16:37 1.完善内容 正文 我正在看内部类与接口的时候,突然萌生出一个想法:抽象类中能不能嵌套接口呢? 于是我准备试一试: abstract class AbstractClass{ interface in{ public void print(); } } 没想到,这种写法竟然被认可 经过一番分析后觉得是有道理的 那么问题来了:怎么实现接口呢? 其实这和内部类很像,只要分别实现抽象类与接口就可以 public class class4 extends AbstractClass implements AbstractClass.in{ public void ab3() { System.out.println("非抽象类中实现抽象类中的接口"); } public void XX(){} //实现抽象类中的抽象方法 } 实现后,肯定要用啊 public static void main(String[] args) { AbstractClass.in inIn = new class4(); inIn.ab3(); } 运行结果: 非抽象类中实现抽象类中的接口 除此之外,还可以使用匿名内部类的形式去写,调用方式与上面相同 Super.in inIn = new Super.in() { public void ab3() { //

13:IO流

烈酒焚心 提交于 2020-02-08 13:08:25
IO简介 继承结构 整体架 构 常用内容 分类 根据处理的数据单位不同,分为 字节流 和 字符流 ;in/out 相对于程序而言 的输入(读取)和输出(写出)的过程,即根据数据的流向不同称为 输入流 和 输出流 字符流的由来 因为数据编码不同,而产生了对字符进行高效操作的流对象(本质其实就是基于字节流动读取时,去查了指定的码表) 字符流与字节流的区别 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次能读多个字节 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据 故→处理文本文件优先考虑使用字符流,除此以外均使用字节流 字节流输出与输入对应关系 字符流输出与输入对应关系 java.io包: File 字节流:针对二进制文件 InputStream --FileInputStream --BufferedInputStream --ObjectInputStream OutputStream --FileOutputStream --BufferedOutputStream --ObjectOutputStream 字符流:针对文本文件。读写容易发生乱码现象,在读写时最好指定编码集为utf-8 Writer --BufferedWriter --OutputStreamWriter Reader -

面试题(中高级)

…衆ロ難τιáo~ 提交于 2020-02-08 10:17:31
1、接口和抽象类的区别   详解参见 http://www.php.cn/php-weizijiaocheng-372186.html   ① 对接口使用通过关键字implements,对抽象类使用通过关键字extends。接口也可以用关键字extends继承。   ② 接口中不可以声明成员变量(包括静态变量),但可以声明类常量。抽象类中可以声明各种类型的变量   ③ 接口中没有构造函数,抽象类可以有构造函数   ④ 接口中的方法默认都是public类型的,而抽象类中的方法可以使用public、protected、private开修饰   ⑤ 一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。抽象类是一种特殊的接口   使用场景:     使用抽象类:要创建一个模型,这个模型将由一些紧密相关的对象采用。所有类都会共享一个公共的行为实现时使用,并在其中实现该行为     接口:要创建一些不想管对象采用的功能。如果必须从多个来源继承行为。 2、PHP常见设计模式 ( https://blog.csdn.net/z15818264727/article/details/52354263 )    单例模式 :在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在内存中   应用场景:应用程序与数据库交互,在一个一个应用中会存在大量的数据库操作

java对象的六大原则

泄露秘密 提交于 2020-02-08 00:38:30
对象的六大原则: 1.单一职责原则(Single Responsibility Principle SRP) 2.开闭原则(Open Close Principle OCP) 3.里氏替换原则(Liskov Substitution Principle LSP) 4.依赖倒转原则(Dependence Inversion Principle DIP) 5. 接口隔离原则(Interface Segregation Principle ISP) 6.迪米特原则 (Least Knowledge Principle LKP) 单一职责原则: 就一个类而言,应该仅有一个引起它变化的原因,简而言之:一个类应该是一组相关性很高的函数、数据的封装。 一个类尽量只有一个职责(相关),两个完全不一样的功能就不应该放在一个类中,通过不断审视自己的代码,根据具体的业务,功能对类进行相应的拆分。 开闭原则: 软件中的对象(类、模块、函数等)应该对于扩展开放,对于修改是封闭的。 程序一旦开发完成,程序中的一个类的实现只因错误而被修改,新的或者改变的特性应该通过新建不同的类来实现,新建的类可以通过继承的方式来重用原类的代码。 eg:抽象为接口,对于扩展,新增类来实现。 里氏替换原则: 1.如果对每一个类型为S的对象O1,都有类型为T的对象O2,是的以T定义的所有程序P在所有的独享O1都换成O2

Java面向对象大致梳理

你。 提交于 2020-02-07 21:19:19
面向对象思想、 面向对象思想概述: Java设计语言面向对象: Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面 向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算 机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去 操作实现。 类和对象: 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该 类事物 属性:就是该事物的状态信息。 行为:就是该事物能够做什么。 对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性 和行为。 类与对象的关系 : 类是对一类事物的描述,是抽象的。 对象是一类事物的实例,是具体的。 类是对象的模板,对象是类的实体。 面向对象之封装: 概述: 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的 方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

.NET设计模式(3): 抽象工厂模式

泪湿孤枕 提交于 2020-02-07 19:26:10
抽象工厂模式(Abstract Factory Pattern) 引入: 在前面介绍的两个创建型模式里面,我们解决的都是有关" new "的问题,用它们来避免显式指定类创建对象。我写的也非常简单易懂,相信看过的朋友们都应该对 简单工厂模式 、 工厂方法模式 的意图、所能解决的问题及适用情景有一定的了解了。但是若要达到灵活运用,什么时候用,怎样用合适还不是看一篇文章就能解决的问题。呵呵..这需要你对OO的理解程度,你的项目开发经验等等许多方面的积累。一起努力喔。。 好了,咱们言归正传,通过对这两个模式的了解,我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。但是,我们在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作,同时由于需求的变化,这“一系列相互依赖的对象”也要改变,如何应对这种变化呢?如何像 简单工厂模式 、 工厂方法模式 一样绕过常规的" new ",然后提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?可能有人会说,你也可以将这些对象一个一个通过 工厂方法模式 来解决呀?但是,我们试想,既然是一系列相互依赖的对象,它们是有联系的,每个对象都这样解决,你又如何来保证他们的联系呢?举一个例子:Windows桌面主题,当你更换一个桌面主题的时候

抽象类和接口的应用 + 面试题

孤街浪徒 提交于 2020-02-07 16:16:02
抽象类和接口的应用 + 面试题 抽象类 定义 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。简单来说,使用关键字 abstract 修饰的类就叫做抽象类。 抽象类使用 示例代码,如下: abstract class AbstractAnimal { public AbstractAnimal() { System.out.println("Init AbstractAnimal."); } static String name = "AbstractAnimal"; public abstract void eat(); public void run() { System.out.println("AbstractAnimal Run."); } } class Animal extends AbstractAnimal { public static void main(String[] args) { AbstractAnimal animal = new Animal(); animal.run(); System.out.println(animal.name); animal.eat(); } // 必须重写抽象父类方法 @Override