【笨鸟先飞】Java重新学习日记4---类和对象

类是对象的类型,对象是类的实例。

第一次学习java的时候,觉得这句话非常拗口,且难以理解,现在明白了类和对象的区别之后,觉得还是这句话。

 

类和对象难以理解,我认为是在学习的初期,所接触到的类都只会生成一个对象,所以非常难以理解。

 

所以这里,对于初学者要记住,一个类是可以生成很多的对象的。

 

int  a = 1 ;  int  b= 2 int  c= 3 ; 这句用类和对象来,相似一下。  int就是类。  

abc就是对象。

 

在实际编程中,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 ();

 

这样就创建了,程序需要的,公共键盘,服务键盘,以及个人键盘。 这三个publicKeyserviceKeypernalKey则是三个对象,都是KeyBorad  类的,在使用的时候,却会使用在不同的地方。

比如,它控制显示器的显示,不同的对象,我们选择显示在不同的显示器上。

 

总结:面向对象的变成,本质是面向类的编程,按照实际的功能不同,编写不同的类,然后再根据需求创建实际要使用的对象。

 

从我的经验,知道一个类可以产生好多个对象,是区分类和对象的最佳思路。

(反之,当一个类只对应一个对象的时候,其实也差不多了。无论是类KeyBorad  

还是对象pernalKey” 似乎都具备同样的变量,同样的方法。我第一次学习的时候,在这里纠结了很久,也没理顺。)

 

 

 

面向对象编程的三大特征:封装、继承、多态。

这三个特征是java编程经常使用的,而且也是区别于面向函数编程的方法。

面向对象,我觉得也可以叫做面向类的编程。 总之,就是面向程序员所自定义的类来编程。

 

封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字privateprotectedpublic实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

 

我的理解 : 封装是一个类里面的某些变量,某些方法,不能在其他类里面使用,

 

因为是面向对象(类)的编程,自然允许我们的主体---对象(类),只开放想给别人看的部分。

 

封装的命令有4种,private   protected   public  以及没有命令,俗称default(默认)。

 

private 是讲解封装的最案例。Private的参数和方法只能被类里面的方法所使用,无法通过对象调用。

Private的目的有两种,1是保护数据,对于需要保护的数据,修改常常用getset方法来完成,确保对象只能通过getset来获取和修改数据,直接使用。

 

keyborad为例:

直接修改:publicKey.F1 = true; 这就是把键盘的F1设置为ture表示被点击了。

间接修改:publicKey.setF1(true);  和上面功能一样。

 

同样代码的可读性也变好了。

 

另一种情况是保护方法,一般情况是这样的:一个方法1比较长,那么我们会把这个方法里面的具有代表意义的一部分,重新生成一个方法2,这个方法2仅仅被方法1使用,那么往往会在方法2加一个private 。确保它不会出现在调用的情况,扰乱大家视线。

 

可以这样理解,一个加了private的方法,就是属于调用他方法的一部分,这个private方法其实是可以不存在的。

 

 

 

public对应的就是public方法。Public方法,就是任何地方都可以通过该类的对象所使用的方法。实际上,方法总归是用来做某个行为的。基本上可以这样所,一个private方法总会被一个public方法所使用,(中间或许会有protected)。总归会流向一个public方法,将结果呈现给大家。

 

就像之前的setget方法。一个private的参数F1,会被两个publicsetget的方法使用。

 

Protected就是只能被自己或者继承者使用,实际上,有Protected方法的类,一开始就做好了被继承的准备。

 

 

 

面向对象编程的三大特征之继承:继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。  Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。

 

我的理解 : 继承是一个类需要赋予的对象量不小且差别较大,而产生的一种简化手段。

目的是从一个类中,产生好几个有差别又相似的类,以达到产生有差别又相似的对象的目的。

 

我对继承的强调是:如果一个类只被另外一个类继承,那么继承就没有意义。

 

先讲两个对应名词:父类和子类      也可以叫 基类和扩展类。

父类就是基类,   子类就是扩展类。

 

子类是继承与父类,也是在父类上的扩展。  直观上,正对的父类和子类之间,子类比父类更加详细,使用范围更加狭窄。

 

依然以keyboard为例:  如果我们除了创建正常keyboard又要创建没有小键盘的 littleKeyBoard  ,还要创建手机用的之后数字小键盘的phonekeyboard

那么这种时候,littleKeyBoard  extends keyboard   phonekeyboard  extends keyboard

 

从而产生littleKeyBoard  phonekeyboard两种类,这类分别再去创建大量实例 。

 

这个时候,keyboard为父类,而littleKeyBoard  phonekeyboard是子类。

 

如果在实际程序中,keyboard没有创建实例,且仅有littleKeyBoard  一个继承者,即,只有littleKeyBoard  在创建实例。 那么,keyboard就没有存在意义。直接创建littleKeyBoard  就可以,不需要去创建一个keyboard用来继承。

 

如果,keyboardlittleKeyBoard  都创建了实例,甚至还有phonekeyboard。那么,这个keyboard才有被创建,被继承的意义。

 

同样,如果,keyboard没有创建实例,但是被两个及以上的类继承,既有littleKeyBoard  又有phonekeyboard。 这种时候,keyboard是有意义的,是作为一个大框架,方便继承者。而且,这种情况下的keyboard,可以对其中一些内容不做明确定义。  我们称作为框架,里面包括为明确定义内容的keyboard之为 抽象类。

 

一个抽象类的存在,一定要被两个及以上的类继承才有意义,这个继承不一定非要在一个程序中完成。

 

比如androidactivity就是一个父类,在一个APK里面,一般仅有被继承一次,但是实际上几乎所有的程序都会继承activity。 那么activity这个父类就是有意义的,这也是继承的含义。

 

 

多态:

多态是基于继承的,应该说多态性是继承之间的强转的一种应用。

子类和父类之间的转换,准确说是子类生成的对象A,赋给父类生成的对象B,然后对象B就可以按照父类的一些方法来使用,反之,使用括号,将对象B进行强行转换对象A。他们的区别就是类的不同。

 

用数据举例子。

Int  a = 3 ;

Long b = a ;

a = (int) b;

 

这里的a就是子类生成的对象。    b就是从父类生成的对象,赋予了和a一样的值。

但是在使用时,ab是不一样的, 比如一个方法,setInta),这里方法写的时候,要求传入int类型,就不能传入b

 

如果,这里不是intlong而是keyboardphonekeyboard,那么,这种行为就叫做多态,多态就是,不同类之间的相互赋值和转换。

 

多态的作用,依然以keyboard为例子,先回忆继承的作用。继承的目的是生成更多的更细化的不同类型的对象,littleKeyBoardphonekeyboard,这里,我们会吧这两种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

使用多态不必强求,首先,创建多个子类的父类,往往是相对复杂的代码,其次,当有多个子类做同一个事情的时候,自然会想到多态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值