类是对象的类型,对象是类的实例。
第一次学习java的时候,觉得这句话非常拗口,且难以理解,现在明白了类和对象的区别之后,觉得还是这句话。
类和对象难以理解,我认为是在学习的初期,所接触到的类都只会生成一个对象,所以非常难以理解。
所以这里,对于初学者要记住,一个类是可以生成很多的对象的。
int a = 1 ; int b= 2 ;int c= 3 ; 这句用类和对象来,相似一下。 int就是类。
a、b、c就是对象。
在实际编程中,int就一个,而a b c则是不同的对象,又归于int这个类。
Int是数据类型,表面了abc的内容,比如,你不能 int a=“asd”不能将字符串赋值给a,因为a的类是int。
Java中的类,就是一种自定义的数据类型,而这个自定义的类,则可以非常复杂,里面包含很多数据,方法,以及“构造器”。
类是有实际意义的,可以看做一个模块,看做一个实际物体。而这个模块本身所具有的特性,就是属于类的变量。 这个模块本身能够做的事情,就是类里面的方法。
面向对象编程,先面向类。以电脑为例子。写一个电脑,我们会写这些类,主机,键盘,显示器。
键盘是一个类,里面的变量应该是各种按键,比如26个字母按键,可以是一个数组(实际上应该用集合), 比如F1~F12 又是一个集合, 回车键是一个单独的变量。
里面的方法可以有这些,显示内容到显示屏,控制主机进行操作,接收用户点击键盘的操作。
接下来就是“实例化”,就是创建对象 KeyBorad K1= new KeyBorad ();
那么这里的k1就是一个键盘。
如果程序需要三个键盘要用则
KeyBorad publicKey= new KeyBorad ();
KeyBorad serviceKey= new KeyBorad ();
KeyBorad pernalKey= new KeyBorad ();
这样就创建了,程序需要的,公共键盘,服务键盘,以及个人键盘。 这三个publicKey、serviceKey、pernalKey则是三个对象,都是KeyBorad 类的,在使用的时候,却会使用在不同的地方。
比如,它控制显示器的显示,不同的对象,我们选择显示在不同的显示器上。
总结:面向对象的变成,本质是面向类的编程,按照实际的功能不同,编写不同的类,然后再根据需求创建实际要使用的对象。
从我的经验,知道一个类可以产生好多个对象,是区分类和对象的最佳思路。
(反之,当一个类只对应一个对象的时候,其实也差不多了。无论是类“KeyBorad ”
还是对象“pernalKey” 似乎都具备同样的变量,同样的方法。我第一次学习的时候,在这里纠结了很久,也没理顺。)
面向对象编程的三大特征:封装、继承、多态。
这三个特征是java编程经常使用的,而且也是区别于面向函数编程的方法。
面向对象,我觉得也可以叫做面向类的编程。 总之,就是面向程序员所自定义的类来编程。
封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
我的理解 : 封装是一个类里面的某些变量,某些方法,不能在其他类里面使用,
因为是面向对象(类)的编程,自然允许我们的主体---对象(类),只开放想给别人看的部分。
封装的命令有4种,private protected public 以及没有命令,俗称default(默认)。
private 是讲解封装的最案例。Private的参数和方法只能被类里面的方法所使用,无法通过对象调用。
Private的目的有两种,1是保护数据,对于需要保护的数据,修改常常用get和set方法来完成,确保对象只能通过get和set来获取和修改数据,直接使用。
以keyborad为例:
直接修改:publicKey.F1 = true; 这就是把键盘的F1设置为ture表示被点击了。
间接修改:publicKey.setF1(true); 和上面功能一样。
同样代码的可读性也变好了。
另一种情况是保护方法,一般情况是这样的:一个方法1比较长,那么我们会把这个方法里面的具有代表意义的一部分,重新生成一个方法2,这个方法2仅仅被方法1使用,那么往往会在方法2加一个private 。确保它不会出现在调用的情况,扰乱大家视线。
可以这样理解,一个加了private的方法,就是属于调用他方法的一部分,这个private方法其实是可以不存在的。
与public对应的就是public方法。Public方法,就是任何地方都可以通过该类的对象所使用的方法。实际上,方法总归是用来做某个行为的。基本上可以这样所,一个private方法总会被一个public方法所使用,(中间或许会有protected)。总归会流向一个public方法,将结果呈现给大家。
就像之前的set和get方法。一个private的参数F1,会被两个public的set和get的方法使用。
Protected就是只能被自己或者继承者使用,实际上,有Protected方法的类,一开始就做好了被继承的准备。
面向对象编程的三大特征之继承:继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。 Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
我的理解 : 继承是一个类需要赋予的对象量不小且差别较大,而产生的一种简化手段。
目的是从一个类中,产生好几个有差别又相似的类,以达到产生有差别又相似的对象的目的。
我对继承的强调是:如果一个类只被另外一个类继承,那么继承就没有意义。
先讲两个对应名词:父类和子类 也可以叫 基类和扩展类。
父类就是基类, 子类就是扩展类。
子类是继承与父类,也是在父类上的扩展。 直观上,正对的父类和子类之间,子类比父类更加详细,使用范围更加狭窄。
依然以keyboard为例: 如果我们除了创建正常keyboard,又要创建没有小键盘的 littleKeyBoard ,还要创建手机用的之后数字小键盘的phonekeyboard。
那么这种时候,littleKeyBoard extends keyboard 和phonekeyboard extends keyboard
从而产生littleKeyBoard 和phonekeyboard两种类,这类分别再去创建大量实例 。
这个时候,keyboard为父类,而littleKeyBoard 和phonekeyboard是子类。
如果在实际程序中,keyboard没有创建实例,且仅有littleKeyBoard 一个继承者,即,只有littleKeyBoard 在创建实例。 那么,keyboard就没有存在意义。直接创建littleKeyBoard 就可以,不需要去创建一个keyboard用来继承。
如果,keyboard和littleKeyBoard 都创建了实例,甚至还有phonekeyboard。那么,这个keyboard才有被创建,被继承的意义。
同样,如果,keyboard没有创建实例,但是被两个及以上的类继承,既有littleKeyBoard 又有phonekeyboard。 这种时候,keyboard是有意义的,是作为一个大框架,方便继承者。而且,这种情况下的keyboard,可以对其中一些内容不做明确定义。 我们称作为框架,里面包括为明确定义内容的keyboard之为 抽象类。
一个抽象类的存在,一定要被两个及以上的类继承才有意义,这个继承不一定非要在一个程序中完成。
比如android的activity就是一个父类,在一个APK里面,一般仅有被继承一次,但是实际上几乎所有的程序都会继承activity。 那么activity这个父类就是有意义的,这也是继承的含义。
多态:
多态是基于继承的,应该说多态性是继承之间的强转的一种应用。
子类和父类之间的转换,准确说是子类生成的对象A,赋给父类生成的对象B,然后对象B就可以按照父类的一些方法来使用,反之,使用括号,将对象B进行强行转换对象A。他们的区别就是类的不同。
用数据举例子。
Int a = 3 ;
Long b = a ;
a = (int) b;
这里的a就是子类生成的对象。 b就是从父类生成的对象,赋予了和a一样的值。
但是在使用时,a和b是不一样的, 比如一个方法,setInt(a),这里方法写的时候,要求传入int类型,就不能传入b。
如果,这里不是int和long而是keyboard和phonekeyboard,那么,这种行为就叫做多态,多态就是,不同类之间的相互赋值和转换。
多态的作用,依然以keyboard为例子,先回忆继承的作用。继承的目的是生成更多的更细化的不同类型的对象,littleKeyBoard和phonekeyboard,这里,我们会吧这两种keyboard用在不同的器材上, littleKeyBoard用在笔记本电脑,phonekeyboard用在手机上,那么在使用的时候,各不相干,这种时候,不需要用到多态。
但是这个时候,在出厂的时候,我们要进行检查,检查所有生产的KeyBoard,无论是littleKeyBoard还是phonekeyboard,检查按键是否有松动,每个按键按下去是否有反应。这种时候,就可以使用多态了。
keyboard k[0] = littleKeyBoard1;
keyboard k[1] = littleKeyBoard2;
keyboard k[2] = phonekeyboard1;
keyboard k[3] = phonekeyboard2;
For(int i =0;i<k.length;i++){
K[i].check();
}
上例可以看出,使用统一的父类作为接口,传入的子类,无论什么类型都可以批量处理。这里,传入的时候,littleKeyBoard可以有n个,phonekeyboard1再有m个,都以数组传入,然后,这里统一归到一个数组中,在统一处理。假设keyboard生成了十多种子类,每种子类,统一传入,然后统一处理,就一个方法就解决了,而不是针对每个子类都去做一遍。
多态在这里作为一个check的接口,每个子类都可以进入这里来被check。
使用多态不必强求,首先,创建多个子类的父类,往往是相对复杂的代码,其次,当有多个子类做同一个事情的时候,自然会想到多态。