多态

天天学JAVA-JAVA基础(1)

非 Y 不嫁゛ 提交于 2019-12-09 00:15:02
如果觉得我写的还行,请关注我的博客并且点个赞哟。本文主要介绍JAVA基础相关问题,通过阅读本文,你将掌握以下10点 java语言是什么? Java 语言有哪些特点? 面向对象和面向过程的区别 Java和C++的区别 Java 应用程序与小程序之间有哪些差别 字符型常量和字符串常量的区别 构造器 Constructor 是否可被 override 重载和重写的区别 Java 面向对象编程三大特性 接口和抽象类的区别是什么 .接口和抽象类的区别是什么 1. java语言是什么? Java是一门面向对象的程序设计语言,它自问世以来,受到了前所未有的关注,并成为计算机移动电话、家用电器等领域中最受欢迎的开发语言之一。 2. Java 语言有哪些特点? 1.简单易学; 2.面向对象(封装,继承,多态); 3.平台无关性( Java 虚拟机实现平台无关性); 4.可靠性; 5.安全性; 6.支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 7.支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java语言不仅支持网络编程而且很方便); 8.编译与解释并存; 3. 面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现

面向对象的三大特性

不羁岁月 提交于 2019-12-07 22:07:24
面向对象的三个基本特征是: 封装、继承、多态 。 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 在Java中类中成员的属性有:public, protected, <default>, private,这四个属性的访问权限依次降低。 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力; Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; Ø 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。 在考虑使用继承时

面向对象的三大特性

拟墨画扇 提交于 2019-12-07 19:20:30
面向对象三大特性:封装、继承和多态。 程序追求的是“高内聚、低耦合”。高内聚:类的内部数据操作细节自己完成,不允许外部干涉; 低耦合:仅暴露小量的方法给外部使用。 封装:可以看作是数据的隐藏;即属性私有,一般通过操作接口来访问,禁止直接访问一个对象中的数据的实际表示。有get或set 例:有两个Java类: public class Student{   public static void main(String[] args){     private String name;     public String getName(){       return this.name;     }     public void setName(String name){       this.name=name;     }   } } //把获取姓名和设置姓名设置成一个个接口,让其它类来调用接口就行,而不显示具体实现细节 public class Apllication{   public static void main(String[] args){     Student student =new Student();     student.setName("BBQ"); //set保存,get获取     System.out.println(student

虚函数实现原理

我是研究僧i 提交于 2019-12-07 18:44:26
转自:https://blog.csdn.net/weixin_40237626/article/details/82313339 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家一个清晰的剖析。 当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。 言归正传,让我们一起进入虚函数的世界。 虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样

JavaSE——(五):封装、继承、多态

雨燕双飞 提交于 2019-12-07 08:42:30
目录 一、封装 1.1、为什么需要封装 1.2、封装属性 1.3、自动封装属性 1.3.1、创建单个 1.3.2、批量创建 二、继承 2.1、 Java继承概要 2.2、为什么需要继承 2.3、实现继承 2.2. Java继承的特征 2.2.1、传递性 2.2.2、单根性 三、构造方法 3.1、构造方法概要 3.2、带参数的构造方法 四、多态 4.1、LSP(里氏代换原则) 4.2、重写(override) 4.3、多态实现 五、示例与视频下载 六、面试题 java面向对象的三大特性是:封装、继承与多态,是面向对象编程的核心。 一、封装 简单说封装就是将同一类事物的特性与功能包装在一起,对外暴露调用的接口。 封装:封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。 封装的好处: 1) 实现了专业的分工 2) 良好的封装能够减少耦合 3) 类内部的结构能够自由修改 4) 可以对成员进行更精确的控制 5) 隐藏信息,实现细节 1.1、为什么需要封装 定义一个学生类,在类中定义学生身高。 Student类: package com.zhangguo.c41; /**学生类*/

条款:07 为多态基类声明virtual析构函数

混江龙づ霸主 提交于 2019-12-07 08:03:02
Effective C++中说过: 1、带有多态性质的base class应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数; 2、Classes的设计目的如果不是作为base class使用, 或者不是为了具有多态性质,就不该声明virtual 析构函数。 #ifndef __EFFECTIVE_H__ #define __EFFECTIVE_H__ /*include*/ #include <iostream> using namespace :: std; class baseClass { public : baseClass() { cout << "base Class construction function" << endl; } ~baseClass() { cout << "base Class destruction function" << endl; } }; class derivedClass : public baseClass { public : derivedClass() { cout << "derived Class construction function" << endl; } ~derivedClass() { cout << "derived Class

Effective C++:条款07:为多态基类声明virtual析构函数

≡放荡痞女 提交于 2019-12-07 08:02:48
(一) 假设有以下继承关系: class TimeKeeper { public: TimeKeeper(); ~TimeKeeper(); //<span style="color:#ff0000;">non_virtual!!!!!!! </span>}; class AtomicClock : public TimeKeeper {...}; class WaterClock : public TimeKeeper{...}; class WristWatch : public TimeKeeper{...}; factory(工厂)函数:返回一个base class指针,指向新生成之derived class对象! TimeKeeper* getTimeKeeper(); TimeKeeper* ptk = getTimeKeeper(); AtomicClock at; ptk = &at; ... delete ptk; ptk指向一个AtomicClock对象!当执行delete ptk;的时候,该 derived class对象的base class成分会被删除,但是derived成分却没有被销毁!这是因为derived class的析构函数没有被调用!这就造成了一个诡异的“局部销毁”对象!所以就会形成资源泄漏、败坏数据结构。 解决方法:给base

《Effective C++》条款07:为多态基类声明virtual析构函数

落花浮王杯 提交于 2019-12-07 08:02:13
原因:C++明白指出,当派生类对象经由基类指针被删除,而该基类的析构函数是非virtual析构函数,执行的结果是派生类成分未被销毁。 解决方法:将base classes析构函数写为virtual析构函数。 适用范围:该规则只适用于polymorphic(带多态性)的base calsses上。这种base class的设计目的是:通过base class接口处理derived class对象。如果不是为了具备多态性,就不应该声明virtual析构函数。 virtual函数会增大类的内存大小。 来源: CSDN 作者: Simon.Y 链接: https://blog.csdn.net/sinat_38183777/article/details/81228889

条款07:为多态基类声明virtual析构函数

孤街醉人 提交于 2019-12-07 08:01:53
c++面向对象特性其中有多态这个特性,平时使用时用基类指针指向子类对象。当我们进行内存回收的时候调用 delete (基类指针),此实如果基类有一个non-virtual析构函数。这种情况下会导致派生类的对象没有被销毁,只有基类部分会被销毁掉,于是造成一个诡异的“局部销毁”对象。这样的后果会形成资源泄露、数据结构被破坏、而且很难找出原因。 消除这个问题的做法很简单:给base class一个virtual析构函数。此后删除derived class对象就会如你想要的那般,将整个对象都销毁,包括derived class成分。 如果class不含virtual函数,通常表示它并不意图被用做一个base class。当class不企图被当作base class,令其析构函数为virtual往往是个馊主意。因为使用virtual函数会导致对象中有一个虚表指针(vptr),该表存在的目的就是为了实现多态的,但是会占用内存空间。这样做的结果会导致该对象不再和其他语言(如C)内的相同声明有着一样的结构(因为其它语言对应物并没有vptr),因此也不再具有移植性。 请记住 polymorphic(带多态性质的)base class应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。 Classes的设计目的如果不是作为base

条款07:为多态基类声明virtual析构函数

笑着哭i 提交于 2019-12-07 07:54:33
有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes作为不同的计时方法,相当合情合理: class TimerKeeper{ public: TimeKeeper(); ~TimeKeeper(); ... }; class AtomicClock:public TimeKeeper{...];//原子钟 class WaterClock:public TimeKeeper{...]; //水钟 class WristWatch:public TimeKeeper{...}; //腕表 当我们指向在程序中使用时间,不想操心时间如何计算等细节,这时候我们可以设计factory(工厂)函数,返回指针指向一个定时对象。Factory函数会"返回一个base class指针,指向新生成的derived class对象": TimeKeeper* getTimeKeeper(); //返回一个指针,指向一个TimeKeeper派生类的动态分配对象 这里存在一个问题,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义--实际执行时通常发生的对象的dervied成分没被销毁。 消除这个问题的做法很简单:给base