浅谈面向对象之封装、继承、多态!如何使用内部类模拟多继承

【属性的封装】

(1.)将属性进行私有化处理,不允许外部程序进行直接访问,并对外提供统一的方法,用于设置和读取私有属性;

(2.)实现访问控制,限制属性访问,但不是拒绝访问。

作用:只能通过规定的方法访问数据,方便在方法中加入控制语句,防止不合法数据赋值。

【封装】

(1.)除了属性的封装之外,将需要重复使用的代码提取到方法中,这叫方法的封装;将相同的属性和方法抽象成一个类,这也是封装思想。

【方法的重载】

(1.)在同一个类中,方法名相同,参数列表不同,与返回值和访问修饰符无关的多个方法,构成方法重载

(2.)参数列表:参数的个数,数据类型,多个参数的前后顺序不同,都属于参数列表不同

(3.)方法重载的典型应用:构造函数重载

【继承】

(1.)子类继承父类,使用extends关键字

(2.)子类中需要访问父类成员,使用super关键字。

super.属性 访问父类属性

super.方法() 访问父类方法

如果,子类中没有同名的属性和方法覆盖到父类,则依然可以直接使用this.属性调用从父类中继承的非私有属性。

但是,如果子类中重写了与父类同名的属性,this.属性 访问的是本类, super.属性访问的父类属性

在子类构造函数中,使用super(); 表示调用的父类的构造,而且,super()函数必须在子类构造的第一行。

注意: 即使使用super关键字,也不能访问父类的私有属性和方法。

(3.)子类可以访问父类的哪些属性和方法:

private 本类

默认省略 本类 同包

protected 本类 同包 非同包子类(用extends实现继承,实例化子类,子类调用父类属性或方法)

public 本类 同包 非同包子类 其他任何包都能用

(4.)继承后的初始化顺序(了解):

父类属性------->父类构造-------->子类属性>------------->子类构造

(5.)在java中,继承只能单继承,不能多重继承,但是可以多层继承

public class Test1{}

public class Test2 extends Test1{}

public class Test3 extenfs Test2{}

此时,Test3就可以得到Test1和Test2两个类的非私有属性

(*******子类继承父类,子类中重写构造方法,super(属性);******)

【方法重写】

(1.)在子类中,重写方法。要求:方法名相同、参数列表相同、返回值相同、访问控制符不能比父类更严格。

(2.)override和overload的区别:

位置 方法名 返回值 参数列表 访问控制符

override方法重写: 子类 相同 相同 相同 不能与父类更严格

overload方法重载: 本类 相同 无关 不同 无关

注意: 由于子类无法继承父类的私有属性,因此父类中的private方法无法被重写

【抽象类】

(1.)抽象类:使用abstract关键字修饰的类,称为抽象类; public abstract class Instrument{}

抽象类不能被实例化;

(2.)抽象方法:使用abstract关键字修饰,而且没有方法体的方法称为抽象方法。 public abstract void play();

(3.)子类继承抽象类,那么子类必须重写父类所有抽象方法。

除非子类也是抽象类。

(4.)抽象方法必须写在抽象类中;抽象类中方法不一定是抽象方法。

【final 关键字】

(1.)final修饰的类,为最终类不能被继承;

(2.)final修饰的方法,为最终方法,不能被重写

(3.)final修饰 的变量,成为常量,不可被修改,常量所有字母全部大写; private final int AGE=20;

【static 关键字】

(1.)static 可以用于修饰方法、属性、代码块;

(2.)static修饰的方法和属性称为类属性和类方法,也叫静态属性和静态方法。

public static String name="zhangsan";

(3.)静态属性和静态方法,使用时可以使用类名直接调用,也可以使用对象名调用:

Person.name; //类名直接调用

p.name; //使用对象名调用

而成员属性和成员方法,也叫实例属性和实例方法,只能使用对象名调用。

(4.)类属性和类方法,是属于类的,在类装载的时候直接声明;

成员属性和成员方法,是属于对象的,在对象实例化时才能产生;

所以,静态属性和静态方法将先于非静态属性方法产生。

所以,静态方法中不能调用非静态属性和方法。(静态方法产生时,还没有对象,也自然没有成员属性和方法)

非静态方法中可以调用静态属性和方法。

另外,静态方法中不能使用this和super。(this代指本类对象,super代指父类对象,所以产生静态方法时,还没有对象)

(5.)由于类属性和类方法,时属于类的。因此,只会在装载的时候产出一份。

也就是说,一个类的静态属性,只能在类装载的时候产生一份,后续使用该类实例化的多个对象将公用同一个静态变量。

【多态】

(1.)多态:同一种事物,由于条件的不同,展示出不同的结果;

(2.)程序中的多态:同一个引用类型,由于使用不同的对象实例,而执行不同的操作。

实例:

Chinese c=new Chinese(); c.say();

English e=new Englisn(); e.say();

中国人说中国话英国人说英语,这不叫多态。

Person p=new Chinese(); p.say();

Person p=new English(); p.say();

同样是人,有人说中国话,有人说英国话,这是多态。

(3.)实现多态的条件:

子类继承父类;

子类重写父类方法;

父类引用指向子类对象 ---------------保证了同一个父类引用类型,使用不同的子类对象实例,而执行不同的操作。

【父子类转型】

(1.)向上转型:子类转成父类,自动转换

Person p=new Chinese();

特点:绝对安全;子类独有的属性和方法将会丢失,只能调用父类中存在的属性和方法。

如果父类方法不是抽象方法,那调用时,执行的方法体依然是子类的 ,

典型应用:多肽中父类引用指向子类对象。

(2.)向下转型:父类转成子类,强制转换。

Person p=new Person();

chinese c=(Chinese)p;

//ClassCastException 类转换异常,因为p不是chinese的实例,强转会造成类转换异常

Person p=new English();

chinese c=(Chinese)p;

//ClassCastException 类转换异常,因为p不是chinese的实例,强转会造成类转换异常

Peeson p=new Chinese();

chinese c=(Chinese)p;

// 正确,因为p是chinese的实例

特点:不安全,可能造成ClassCastException ,可以使用instanceof提前判断。

if(p instanceof Chinese){

Chinese c=(Chinese)p;

}

【使用内部类模拟多继承】

原文地址:https://www.cnblogs.com/cuteboy/p/8745915.html

时间: 2024-08-04 06:44:04

浅谈面向对象之封装、继承、多态!如何使用内部类模拟多继承的相关文章

在Objective-C中浅谈面向对象

接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java.每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点.写篇博文总结一下OC中的面向对象.刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点.在用到便利构造器的时候,如果之前学习过设计模式的话会好理解一些. 在下面的代码

浅谈面向对象和继承

1.面向对象和面向过程的区别 面向过程:注重代码的过程 面向对象:注重代码的结果 2.面向对象三大特性 抽象   封装  继承  多态(JS不存在多态) 3.什么是一个构造函数 new 一个关键字函数  创建一个对象,该对象的的属性this指向window 函数里面指向这个对象 构造函数和普通函数的区别 : 1.前者的this的指向是实例化后的对象 后者的指向是指向window 2.普通函数返回值需要加return 构造函数不需要因为返回的是自己本身 为什么构造函数没有return却能够有返回值

虚拟世界(代码)--浅谈面向对象编程感触

不知不觉已经来到北京一年了,接触编程也一年了,或许我已经不再是那个连HelloWord都要写了N遍都不理解的低级菜鸟了(因为现在是中级了!!~~依旧是菜鸟) 在之前从来没有接触过编程,也不知道什么面向对象编程,面向过程编程.我的代码人生就是从这面向对象编程开始的. 面向对象编程,接触了C#和Java两种编程语言,感触良多(说实话,我现在已经快记不得老师讲过的有哪些重点了).我根据自己所了解的谈谈这段时间的收获. 一.什么是面向对象编程? 最初,老师告诉我们C#和Java都是面向对象编程的语言.那

Java系列1 -- 浅谈面向对象

也许每一个计算机专业的人,在大学学习java的时候,老师开始时都会说这么一句话,"Java是一门面向对象的语言".那么面向对象到底是什么,他有什么好处,或者他比其他流行的语言C/C++他强在哪里呢?“面向对象”在我们实际编程中有什么作用呢? 在开始实际的java之旅前,我们再次老生长谈下.我就按我自己的理解结合我这两年左右的编程经验来简单的说一说.其实在java之前我是学习C和C++的,但是并没有实际拿C或者C++写过什么项目,所以,一开始我就是直接用java的,在第一年的时候,我对面

浅谈面向对象

面向对象:顾名思义就是站在对象的角度思考问题,我们把多个功能合理的放到不同对象里,强调的是具备某些功能的对象. 具备某种功能的实体,称为对象, 面向对象很符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性和可拓展性. 面向对象的三大特征:封装,继承,多态 封装:影响对象的属性和实现细节,仅提供一个对外的接口,保证数据的安全性和完整性: 继承:实现一个类的时候可以在另外一个类的基础上实现,当子类继承父类后,子类是一种特殊的父类,能直接或间接获得父类里的成员,易于程

浅谈面向对象特征

所有的面相对象思想,归根结底是为了简化代码,减少代码量,构建更符合现实生活逻辑的程序代码,从而减轻程序员的负担.不能一味地或者说刻意地去使用面相对象的思想而忽略了程序所实现的功能或者框架,要根据实际情况 众所周知,面向对象编程的特点为:封装.继承.多态.C#是一门完全面向对象的语言,由于比Java推出的时间还要晚,所以对面向对象的思想的体现比Java还要完美,那么在C#中如何体现封装.继承和多态呢?下面举例并进行说明. 1.封装 封装的好处有以下几点: ①数据不外泄,可以做到一定的保护 ②类的使

浅谈面向对象三大编程的特征

(一)封装: 属性property:属性是类.结构和接口的命名成员.它们提供了通过访问器accessor读.写或计算私有字段值的灵活机制. 属性是这样的成员:它们提供灵活的机制来读取编写或计算私有字段的值,可以像公共数据成员一样使用属性,但实际上他们是被称为访问器的特殊方法.这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性. 属性机制使得私有成员被隐藏,实现了封装的效果,良好的封装可以减少耦合,淡化类与类之间的紧密度依赖关系. (二)继承: 继承符号: “:”实现继承操作,建立Is-

浅谈面向对象开发原则:高内聚,低耦合

软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低. 每一个类完成特定的独立的功能,这个就是高内聚.耦合就是类之间的互相调用关系,如果耦合很强,互相牵扯调用很多,那么会牵一发而动全身,不利于维护和扩展. 类之间的设置应该要低耦合,但是每个类应该要高内聚.耦合是类之间相互依赖的尺度.如果每个对象都有引用其它所有的对象,那么就有高耦合,这是不合乎要求的

浅谈Java三大特性之多态

目录 一.前言 二.发生的条件 三.多态包含(或者说体现在)两个方面: 四.示例 感谢阅读 一.前言 这篇讲下三大特性之一的多态,可以通俗得去理解,多种形态,多种姿态... 那么在面向对象的程序设计中,多态是 指什么? Java引用变量有两个类型:一个是编译类型,一个是运行时类型.编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定.如果编译类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism) "多形性"(Polymorphism)从另一个角