之前介绍了java面向对象三大特性之一封装,现在来说说三大特性之一继承和抽象类。这些只是我个人的认识,不足之处还请见谅。

1、 继承是面向对象的三大特征之一,那么何为继承呢?

继承是指一个对象直接使用另一个对象的属性与方法,是通过extends关键字让类与类之间产生继承关系。而被继承的类称为父类,继承父类的类称为子类(派生类)。

//父类
class Animal {
//如果属性需要被子类继承,那么可以使用protected关键字,方法也一样
protected String name;
protected void dec(){} }
//子类
class Dog extends Animal{ System.out.println("name"+name);
}

2、继承的利弊:

通过继承可以提高了代码的复用性,且让类与类之间产生了关系,给面向对象第三个特征多肽提供了前提。当然,继承也有它的限制:在java中只能实现单继承,也就是一个类只能有一个父类。但是呢,java中却允许多层继承,即一个子类可以有一个父类,而父类可以再有父类。并且继承只能继承父类中非私有的属性和方法。且构造方法不能被继承。

3、什么是单继承,多继承?

所谓单继承就是一个子类只能有一个父类。而多继承就是一个子类可以有多个父类(java中不允许,但是可以进行改良,不直接继承,因为多个父类中有可能有相同成员,会产生调用的不确定性,在java中通过“多实现”来体现)。java中支持的多层继承就是:C继承B,B继承A,就会出现所谓的继承体系。而使用一个继承体系的时候先要查看该体系中的顶层楼,了解该体系的基本功能;二是创建体系中的最子类对象,完成功能的使用。

4、那么我们什么时候可以定义继承呢?当类与类之间存在所属关系的时候,就定义继承。XXX是YYY中的一种。xxx  extends  yyy所属关系:is  a 关系。

5、使用继承可以继承父类的方法和属性,那当我们不需要父类中的方法,或者需要重新定义时,那就可以使用方法的重载了。也就是覆盖。什么叫覆盖呢?现在来说说:当子类出现成员函数和父类一摸一样的情况时,会运行子类中的函数,这种现象称为覆盖操作。覆盖操作需要注意的事项:一是覆盖父类方法的时,子类权限必须大于等于父类中的权限;

二是静态方法只能覆盖静态,或被静态覆盖。现在问题来了,那么什么时候使用覆盖操作呢?当对一个类进行子类的扩展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有内容时,就是用覆盖功能。如下;

 class  Phone{
String name;
void call (){}
void show(){}
System.out.println("number");
}
class NewPhone extends Phone {
void show {
System.out.println("name"+name);
super.show();
} }

6、在继承之后,子父类中构造函数的特点:在子类构造对象时,发现访问子类构造函数时,父类中的构造函数也运行了。为什么会出现这种情况呢?原因是在子类的构造函数中的第一行有一个默认的隐式语句:super();而子类的实例化过程中所有的子类都会访问父类中的空参数的构造函数。

注意:父类中的私有方法不可以被覆盖,父类中的为static的方法无法覆盖;覆盖时,子类权限一定要大于等于弗雷方法权限。

7、在定义属性和方法时都会用到一个关键字final:在程序中,一个数据是固定的,直接使用也可以了,但是阅读性差,所以给数据起个名字,并且这个变量的值不会变,所以加上final修饰固定,不会在改变。而使用final的关键字可以声明一个类,一个方法,一个常量。当然,使用final声明的类不能被继承,声明的方法不能被重写,声明的属性为常量,只能赋值一次。

 public  static  final  double  MY_PI=3.14;
static final int x=;
void method(){
final int Number=; }

8、抽象类的概念:很多具有相同特征和行为的对象可以抽象为一个类,而很多具有相同特征和行为的类可以抽象为一个抽象类。抽象类是使用abstract关键字声明的类。

注意:具体类继承抽象类必须要实现抽象类中所有的抽象方法。

声明一个抽象类:

 public  abstract  class  Animal {
private String name;
public abstract void say();//抽象方法,没有实现体 }
class cat extends Animal{
public void say(){
System.out.println("I am a cat!"); } }

9、使用抽象类必须遵循的规则:抽象类可以没有抽象方法,但是有抽象方法的类必须是抽象类;非抽象类继承抽象类必须实现所有的抽象方法;抽象类可以有方法实现和属性;

抽象类不能被实例化(调用抽象方法没有意义);抽象类不能用final修饰。抽象类具有的特点:方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类中,该类也必须是抽象类;抽象类必须有其子类覆盖了所有的抽象方法后才能实例化,否则该子类还是抽象类。

注意:抽象类中可以有构造函数,用于子类对象的初始化;抽象类可以不定义抽象方法,但是比较少见,其目的就是不让该类创建对象。通常这个类有方法体,却没有内容,AWT的适配器就是这种。抽象关键字abstract不可以和private、static、final关键字共存。抽象类一定是个父类,因为子类需要覆盖父类中的所有方法后才能实例化。

10、抽象类和一般类的异同点:

相同点:抽象类和一般类都是用来描述事物时,都在内部定义了成员。

不同点:一般类有足够的信息描述事物,而抽象类描述事物的信息有可能不足;一般类中不能定义抽象方法,只能定义非抽象方法,而抽象类中可以定义抽象方法,也可以定义非抽象方法;一般类可以实例化,抽象类不可以被实例化。

11、抽象方法的由来:多个对象都具备相同的功能,但是功能具体的内容不同,在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法就称为抽象方法。

java学习之面向对象(4)的更多相关文章

  1. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  2. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  3. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  4. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  5. java学习之面向对象概念

    思考的两种方式: 举例: 把大象放到冰箱里 一.面向过程 :[打开冰箱->把大象放里面->关上冰箱门]面向过程注重的是过程,也就是(动作[函数]),然后按照动作依次去执行就好了. 代表语言 ...

  6. JAVA学习总结-面向对象

    前言:java面向对象中的知识可以说是整个java基础最核心的部分,不知不觉已经学完快2个月了,是时候复习一波了,刚开始学习的时候被绕的很懵逼,这次总结完毕之后有了很多新的感悟,这就是所谓的每有会意, ...

  7. Java学习(一)--面向对象(一)

    面向对象的思想一直指导者我们软件的分析.设计与开发.java语言是一种面向对象的语言.在学习java之前,先回想一以下向过程和面向对象. 一面向过程 面向过程主张按功能来划分系统需求.每一个功能都负责 ...

  8. Java学习: 面向对象的使用与注意事项

    面向对象的使用与注意事项 面向过程:当需要实现一个功能的时候,每一个具体的步骤都需要亲力,详细处理每一个细节面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做 ...

  9. 程序设计基础·Java学习笔记·面向对象(下)

    Java程序设计基础之面向对象(下) (补充了上的一些遗漏的知识,同时加入了自己的笔记的ヾ(•ω•`)o) (至于为什么分P,啊大概是为了自己查笔记方便(?)应该是("` 3′") ...

  10. 程序设计基础·Java学习笔记·面向对象(上)

    Java程序设计基础之面向对象(上) (自适应学习进度而进行记录的笔记,希望有一些小小的用处吧(^∀^●)ノシ) (新人上路,望多指教,如有错误,望指正,万分感谢(o゚v゚)ノ) 目录 一.面向对象 ...

随机推荐

  1. 【修改 UITextField 中 placeholder 的顏色】

    第一种方法: [textfeild setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"]; ...

  2. LeetCode 22. Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  3. RSA密钥之C#格式与Java格式转换

    前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...

  4. 在Asp.Net MVC 中配置 Serilog

    Serilog 是一种非常简便记录log 的处理方式,使用Serilog可以生成本地的text文件, 也可以通过 Seq 来在Web界面中查看具体的log内容. 接下来就简单的介绍一下在Asp.Net ...

  5. Windows8 UI MessageBox In DevExpress

    // custom messagebox using System; using System.Drawing; using System.Windows.Forms; using DevExpres ...

  6. PHP 汉字拼音互转

    <?PHP function Pinyin($_String, $_Code='gb2312'){ $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|ban ...

  7. Vue - 自定义指令

    1.Vue.directive(id,definition)注册一个全局自定义指令,接收两个参数,指令ID以及定义对象 2.钩子函数:将作用域与DOM进行链接,链接函数用来创建可以操作DOM的指令 b ...

  8. Spring 使用 SLF4J代替 Commons Logging 写日志 异常

    项目的日志更换成slf4j和logback后,发现项目无法启动.错误提示 Caused by: java.lang.NoClassDefFoundError: Lorg/apache/commons/ ...

  9. Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码

    万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...

  10. js接收对象类型数组的服务端、浏览器端实现

    1.服务端 JSONArray jsonArr = JSONUtil.generateObjList(objList); public static generateObjList(List<O ...