java学习之面向对象(4)
之前介绍了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)的更多相关文章
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- java学习之面向对象概念
思考的两种方式: 举例: 把大象放到冰箱里 一.面向过程 :[打开冰箱->把大象放里面->关上冰箱门]面向过程注重的是过程,也就是(动作[函数]),然后按照动作依次去执行就好了. 代表语言 ...
- JAVA学习总结-面向对象
前言:java面向对象中的知识可以说是整个java基础最核心的部分,不知不觉已经学完快2个月了,是时候复习一波了,刚开始学习的时候被绕的很懵逼,这次总结完毕之后有了很多新的感悟,这就是所谓的每有会意, ...
- Java学习(一)--面向对象(一)
面向对象的思想一直指导者我们软件的分析.设计与开发.java语言是一种面向对象的语言.在学习java之前,先回想一以下向过程和面向对象. 一面向过程 面向过程主张按功能来划分系统需求.每一个功能都负责 ...
- Java学习: 面向对象的使用与注意事项
面向对象的使用与注意事项 面向过程:当需要实现一个功能的时候,每一个具体的步骤都需要亲力,详细处理每一个细节面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做 ...
- 程序设计基础·Java学习笔记·面向对象(下)
Java程序设计基础之面向对象(下) (补充了上的一些遗漏的知识,同时加入了自己的笔记的ヾ(•ω•`)o) (至于为什么分P,啊大概是为了自己查笔记方便(?)应该是("` 3′") ...
- 程序设计基础·Java学习笔记·面向对象(上)
Java程序设计基础之面向对象(上) (自适应学习进度而进行记录的笔记,希望有一些小小的用处吧(^∀^●)ノシ) (新人上路,望多指教,如有错误,望指正,万分感谢(o゚v゚)ノ) 目录 一.面向对象 ...
随机推荐
- Fedora 安装gcc gcc-c++
Fedora本身没有自带gcc 和 g++编译器,所以需要我们自己去安装,步骤如下: 1.切换到root用户(或者跳过这个步骤,直接在下面命令前面加上 sudo) su root 2.安装gcc yu ...
- unity的固定管线shader
最近shader学习中,看的视频. 练习的固定管线的shader如下: ps.在unity5中半透明不好用,其他的还好 //不区分大小写 //这是固定管线的Shader Shader "Sh ...
- jQuery对象与dom对象相互转换
核心提示:jquery选择器得到的jquery对象和标准的 javascript中的document.getElementById()取得的dom对象是两种不同的对象类型,一般情况下,如S('#id' ...
- [BI项目记]-TFS Express备份和恢复
在项目中对TFS进行备份操作是日常重要的工作之一,此篇主要描述如何对TFS Express进行备份,并且在另外一台服务器上进行恢复. 以下是操作的几个关键点: 备份数据库,在TFS管理工具中就可以完成 ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- 在Linux和Windows的Docker容器中运行ASP.NET Core
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott H ...
- 循环遍历checkbox按钮,和点击后提示。
今天做了一个有关checkbox点击的项目,点击checkbox获取这行的数值,然后相加.运用的是jquery和PHP传值. $('input[type=checkbox]').click(funct ...
- Vue - 在v-repeat中使用计算属性
1.从后端获取JSON数据集合后,对单条数据应用计算属性,在Vue.js 0.12版本之前可以在v-repeat所在元素上使用v-component指令 在Vue.js 0.12版本之后使用自定义元素 ...
- 如何理解typedef void (*pfun)(void)
问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...
- Xcode playground markdown常用语法
//: **Bold** *Italic* /*: # h1 ## h2 ### h3 #### h4 h5 h6 same as h3 --- --- --- * blank seperate li ...