面向对象核心
2017-03-12 23:34:12 0 举报
AI智能生成
面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件和结构化代码。其核心概念包括封装、继承和多态。封装是将数据和操作数据的方法绑定在一起,形成一个独立的对象。继承是子类可以继承父类的属性和方法,实现代码的重用。多态是指不同对象对同一消息做出响应的方式不同,增强了程序的灵活性和扩展性。此外,还有抽象、接口、构造函数、析构函数等重要概念。面向对象编程的主要优点是提高了代码的可读性、可维护性和可重用性,降低了软件的开发和维护成本。
作者其他创作
大纲/内容
面向对象三大特性之——封装
意义:<span style="font-family: Arial; color: black; font-weight: bold; font-style: italic;">1.</span><span style="font-family: 宋体; color: black; font-weight: bold; font-style: italic;">封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。</span>
<p style="margin-top: 4.32pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-color-index:1;mso-font-kerning:
12.0pt;language:en-US;font-weight:bold;font-style:italic;mso-style-textfill-type:
solid;mso-style-textfill-fill-themecolor:text1;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">2.要访问该类的代码和数据,必须通过严格的接口控制。</span></p>
<p style="margin-top: 4.32pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-color-index:1;mso-font-kerning:
12.0pt;language:en-US;font-weight:bold;font-style:italic;mso-style-textfill-type:
solid;mso-style-textfill-fill-themecolor:text1;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">3.封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。</span></p>
<p style="margin-top: 4.32pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-color-index:1;mso-font-kerning:
12.0pt;language:en-US;font-weight:bold;font-style:italic;mso-style-textfill-type:
solid;mso-style-textfill-fill-themecolor:text1;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">4.适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。</span></p>
如何实现
<p style="margin-top: 4.32pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:<br>宋体;mso-bidi-font-family:Arial;color:black;mso-color-index:1;mso-font-kerning:<br>12.0pt;language:en-US;font-weight:bold;font-style:italic;mso-style-textfill-type:<br>solid;mso-style-textfill-fill-themecolor:text1;mso-style-textfill-fill-color:<br>black;mso-style-textfill-fill-alpha:100.0%">1.修改属性的可见性来限制对属性的访问(一般限制为private)</span><span style="color: black; font-family: Arial; font-weight: bold;">public class Person {</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:
en-US;font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">
private String name;</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:
en-US;font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">
private String gender;</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:
en-US;font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">
private </span><span style="font-family:Arial;mso-ascii-font-family:
Arial;mso-fareast-font-family:宋体;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:12.0pt;language:en-US;font-weight:bold;mso-style-textfill-type:
solid;mso-style-textfill-fill-color:black;mso-style-textfill-fill-alpha:100.0%">int</span><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:
en-US;font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%"> age;</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:
宋体;mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:
en-US;font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">}</span></p>
<p style="margin-top: 4.32pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;">这段代码中,将 name、age 和gender属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。<br></p>
<p style="margin-top: 4.32pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;">2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问。<br></p>
this关键字
this 关键字用于指向调用该方法的当前对象;简单来说,那个对象调用方法,this指的就是那个对象。<br>
注意:上述实例中public方法是外部类访问该类成员变量的入口(接口)。<div>通常情况下,这些方法被称为getter和setter方法。</div><div>因此,任何要访问类中私有成员变量的类必须通过这些getter和setter方法。</div><div><br></div>
<div>我们除了使用setter方法来给被封装的成员变量赋值外,是否还有其他的方式可以做到这一点呢?</div><div><br></div>
<div>可以通过构造方法来给被封装的成员变量进行赋值</div><div><br></div>
构造方法
<b>两点规则:构造方法必须与类名相同。构造方法没有返回值,但也不能写void</b>
<div>构造方法的作用:完成对象的创建,即完成对象的实例化,一般使用构造器来完成对成员变量的初始化。</div><div><br></div>
开发时,没有明确写出构造方法,编译器会自动增加一个构造器“默认构造器”相反,若手写了若干个构造器,就不会自动产生空构造器。
代码块
在Java中,使用{}括起来的代码被称为代码块。
<div>根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。</div>
<div>常见代码块:</div>
<div>1:局部代码块 </div>
<div>在方法中出现;限定变量生命周期,及早释放,提高内存利用率</div>
<div>2:构造代码块 (初始化块)</div>
在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造器都会被执行,并且在构造方法前执行
<div>3:静态代码块 </div>
<div>在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。一般用于加载驱动</div>
<div>在代码块的执行顺序上 静态代码块>构造代码块>构造函数</div>
面向对象三大特性之——继承
<div>继承(extends)概念:</div>
<div>让类与类之间产生关系,子父类关系</div>
<div>继承的好处:</div>
<div>a:提高了代码的复用性</div>
<div>b:提高了代码的维护性</div>
<div>c:让类与类之间产生了关系,是多态的前提</div>
继承的弊端:
类的耦合性增强了
开发的原则:高内聚,低耦合
耦合:类与类的关系
内聚:就是自己完成某件事情的能力
<div>在java程序中要实现两个类之间的继承关系就必须使用extends关键字来实现。</div>
特性:
<div>子类拥有父类非private的属性,方法。</div>
<div>子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。</div>
<div>子类可以用自己的方式实现父类的方法。</div>
注意:
<div>a:子类只能继承父类所有非私有的成员(成员方法和成员变量)</div>
b:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法
<div>c:不要为了部分功能而去继承</div>
super关键字
代表父类的内存空间标识
方法的重写
<div>外壳不变,核心重写!</div>
注意事项
<div>a:父类中私有方法不能被重写</div><div>* 因为父类私有方法子类根本就无法继承</div>
<div> b:子类重写父类方法时,访问权限不能更低</div><div> * 最好就一致</div>
<div>c:父类静态方法,子类也必须通过静态方法进行重写</div>
新增:声明为final的方法不能被重写,声明为static的方法不能被重写,但能被再次声明。
super与this的区别
this调用本类的成员变量也可以调用父类的,调用本类的构造方法,调用本类的成员方法,也可调用父类成员方法
super调用父类的成员变量,构造方法,成员方法
重写是父类与子类之间的多态性的一种表现,重载是一类中多态性的一种表现
final修饰的类是最终类,方法是最终方法,修饰的变量是常量,只能被赋值一次,被final修饰的常量名字母都大写多词用“_“连接,可以通过构造代码块或构造函数赋值一次。(基本类型,值不能被改变,引用类型,地址不能被改变,对象属性能改变)
抽象类
残缺不全的类,即类中没有包含足够的信息来描绘一个具体的对象
特点:不能实例化,其他功能依旧存在
抽象类必须被继承,才能使用
<div>任何子类必须重写父类的抽象方法,或者声明自身为抽象类,继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。</div><div><br></div>
<div> 1、一般类可以具体的描述事物。抽象类描述事物的信息不具体</div><div> 2、抽象类中可以多定义一个成员:抽象函数。</div><div> 3、一般类可以创建对象,而抽象类不能创建对象。</div><div> 4、抽象类中是可以不定义抽象方法,不让该类创建对象,不让别的类建立该抽象类对象。</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> 抽象关键字abstract不可以和final,private,static共存。</div><div><br></div>
接口
是抽象方法的集合,用interface来声明。类是描述对象的属性方法。接口是则包含类要实现的方法
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法,接口无法被实例化,可以被实现。<b>实现类必须描述所有方法否则要声明为抽象类</b>
特性:
接口中方法是隐式抽象的(public abstract)、接口中可以含有变量(public static final)、方法中不能在接口实现(须通过实现类来实现)
隐世特征:
声明接口,方法,(变量)时不必使用abstract(static final)、接口中的方法都是公有的
重写与实现
重写
类在实现接口的方法时,不能抛出强制异常,只能在接口中,或者继承接口的抽象类中抛出强制性异常
重写时保证外壳一致
若实现接口的类是抽象类,没必要实现该接口的方法
实现
一个类可以实现多个接口,但只能继承一个类,能继承另一个接口
多态
同一种行为具有不同的表现形式、同一接口使用不同的不同的实例而执行不同的操作(如:黑白和彩色打印机)、不同的对象对同一行为作出的不同响应
三大条件
要有继承,或实现
要有重写
父类引用指向子类对象
Java中方法重载的规则
1.方法名必须相同
2.必须具有不同的参数列表
3.可以有不同的返回类型,只要参数列表不同即可
4.可以有不同的访问修饰符
子主题
5.可以抛出不同的异常
6.方法重载只能发生在同一各类中
方法重载的意义
<p style="margin-top: 0pt; margin-bottom: 0pt; direction: ltr; unicode-bidi: embed; vertical-align: baseline;"><span style="font-family:宋体;mso-ascii-font-family:Arial;mso-fareast-font-family:宋体;
mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:en-US;
font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">重载是</span><span style="font-family:
宋体;mso-ascii-font-family:Arial;mso-fareast-font-family:宋体;mso-bidi-font-family:
Arial;color:black;mso-font-kerning:12.0pt;language:zh-CN;font-weight:bold;
mso-style-textfill-type:solid;mso-style-textfill-fill-color:black;mso-style-textfill-fill-alpha:
100.0%">一种十分友好</span><span style="font-family:宋体;mso-ascii-font-family:Arial;
mso-fareast-font-family:宋体;mso-bidi-font-family:Arial;color:black;mso-font-kerning:
12.0pt;language:en-US;font-weight:bold;mso-style-textfill-type:solid;
mso-style-textfill-fill-color:black;mso-style-textfill-fill-alpha:100.0%">的</span><span style="font-family:宋体;mso-ascii-font-family:Arial;mso-fareast-font-family:宋体;
mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:zh-CN;
font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">功能</span><span style="font-family:
宋体;mso-ascii-font-family:Arial;mso-fareast-font-family:宋体;mso-bidi-font-family:
Arial;color:black;mso-font-kerning:12.0pt;language:en-US;font-weight:bold;
mso-style-textfill-type:solid;mso-style-textfill-fill-color:black;mso-style-textfill-fill-alpha:
100.0%">,</span><span style="font-family:宋体;mso-ascii-font-family:Arial;
mso-fareast-font-family:宋体;mso-bidi-font-family:Arial;color:black;mso-font-kerning:
12.0pt;language:en-US;font-weight:bold;mso-style-textfill-type:solid;
mso-style-textfill-fill-color:black;mso-style-textfill-fill-alpha:100.0%">它不要求你在调用一个方法之前转换数据类型,它会自动地寻找匹配的方法;重载对于编写结构清晰而简洁的类有很大的作用</span><span style="font-family:宋体;mso-ascii-font-family:Arial;mso-fareast-font-family:宋体;
mso-bidi-font-family:Arial;color:black;mso-font-kerning:12.0pt;language:zh-CN;
font-weight:bold;mso-style-textfill-type:solid;mso-style-textfill-fill-color:
black;mso-style-textfill-fill-alpha:100.0%">。</span></p>
<div>面向对象编程(OOP:Object-OrientedProgramming )</div><div><br></div>
<div>面向对象编程思想实际上就是一种运用对象、类、继承、封装、聚合、关联、消息、多态性等概念来构造系统的软件开发方法。<br></div>
创建对象的步骤
Student s = new Student();
<div>1,Student.class加载进内存</div>
2,声明一个Student类型引用s
3,在堆内存创建对象
4,给对象中属性默认初始化值
5,属性进行显示初始化
6,构造方法进栈,对对象中的属性赋值,构造方法弹栈
<div>7,将对象的地址值赋值给s</div>
static关键字
概念:static用于修饰类的成员,如成员变量,成员方法,代码块,被static修饰的成员具备一些特殊性。
特殊性:
<div>a:随着类的加载而加载,b:优先于对象存在,c:被类的所有对象共享</div>
<div>d:可以通过类名调用</div>
它本身也可以通过对象名调用。
推荐使用类名调用。
静态修饰的内容一般我们称其为:与类相关的,类成员
注意事项:
a:在静态方法中是没有this关键字的
b:静态方法只能访问静态的成员变量和静态的成员方法
<div>静态变量和成员变量的区别:</div>
A:所属不同
<div>静态变量属于类,所以也称为为类变量</div>
<div>成员变量属于对象,所以也称为实例变量(对象变量)</div>
<div>B:内存中位置不同</div>
<div>静态变量存储于方法区的静态区</div>
<div>成员变量存储于堆内存</div>
C:内存出现时间不同
<div>静态变量随着类的加载而加载,随着类的消失而消失</div>
成员变量随着对象的创建而存在,随着对象的消失而消失
D:调用不同
<div>静态变量可以通过类名调用,也可以通过对象调用</div>
<div>成员变量只能通过对象名调用</div>
接口与类的:
相似点:
一个接口可以有多个方法,相应的文件存储,并且名称的对应性
不同的:
接口不能用于实例化对象,没有构造方法,方法必须是抽象方法,不能包含成员变量(static,final除外),不能被继承要被实现,支持多重继承。
接口与抽象类的区别
抽象类中的方法可以有方法体。其成员变量可以使各类型的,接口中只能是public static final。接口中不能有静态代码块以及静态方法,一个类只能继承一个抽象类,可实现多接口。
抽象类是对类的抽象对整体的抽象,接口是对行为的抽象
继承是“是不是”的关系,接口是“有没有”得关系。海豚是否具有飞行的这个特点,能就是实现接口,不能就是不能实现接口。
抽象类是一种模板设计,例如PPT中的模板。而接口是辐射式设计,如警报器更新,须全部更新。
0 条评论
下一页