之前介绍了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. 也说python的类--基于python3.5

    在面向对象的语言中,除了方法.对象,剩下的一大重点就是类了,从意义上来讲,类就是对具有相同行为对象的归纳.当一个或多个对象有相同属性.方法等共同特征的时候,我们就可以把它归纳到同一个类当中.在使用上来 ...

  2. C#设置IE代理及遇到问题的解决方案

    起初使用的方法是修改完一次代理之后就不能继续修改,需要重新启动一次进程才可以,最初代码是: private void ShowProxyInfo() { if (!GetProxyStatus()) ...

  3. ASP.NET Boilerplate终于发布v1.0了

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ABP经过2年多的开发,终于发布第一个主要版本了,谨此提醒ABP的使用者. ASP.N ...

  4. Linux内核--内核数据类型

    转自:http://www.linuxidc.com/Linux/2013-12/93637.htm 将Linux 移植到新的体系结构时,开发者遇到的若干问题都与不正确的数据类型有关.坚持使用严格的数 ...

  5. Oracle中生成随机数的函数(转载)

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

  6. Mvc 之System.Web.Optimization 压缩合并如何让*.min.js 脚本不再压缩

    最近项目中用到了easy ui ,但是在配置BundleConfig 的时候出现了问题,easy ui的脚本jquery.easyui.min.js 压缩后出现各种脚本错误,总是莫名其妙的 i标量错误 ...

  7. 用 CallerMemberName Attribute 和 EqualityComparer 统一处理类的属性值变化

    当需要实现类似 INotifyPropertyChanged 这样的接口的时候,每一个属性去判断值是否变化,然后触发事件什么的,太麻烦了,如果能用一个方法统一处理就好了. 好在真的可以做到.这个博文说 ...

  8. jQuery中事件绑定到bind、live、delegate、on方法的探究

    1. 给页面上的某个元素绑定事件,最初采用下面的方式实现: $(‘selector’).click(function(){ //code }); 缺点: 不能同时绑定多个事件,不能绑定动态的元素. 后 ...

  9. NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解多少钱?

    NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解 芯片解密型号: P87C51x2.P87C52x2.P87C54x2.P87C58x2.P87C591  单片机解密 #####[ ...

  10. C#开发中常用方法3------Cookie的存取

    ---------------------------------------------------------------------------------------------------- ...