C05(面向对象)

来源:互联网 发布:php获取数组最大下标 编辑:程序博客网 时间:2024/06/01 10:28

类的封装(Java中使用private及public访问修饰符)
没人喜欢被其他人随便就拿自己的钱包(或者其他私有的东西)看或者使用(修改),那么类也一样,既然有了类的概念,要把所有的属性或者方法都要集中到类当中写,那么,这些属性或者方法能由谁来用就成为了一个问题,面向对象的语言都有private,protected和public修饰字,在Java当中又加入了包(package)的概念。也就是说,如果我有了一个东西,我只想自己使用,那我就对外说,这个东西是我个人私有(private)的,谁都不能用。如果这个东西对于我来说,并不是只有我能用,我授权的某些人也可以用,我就说这个东西是受保护(protected)的,当然,这个授权也存在两种情况,就是如果我不说它到底是私有的,受到保护的,或者是公共的,也就是默认(default)的情况,这个东西就只能在我们家内部使用,包括我的老婆(同一个包的其他类)儿子(同一个包的子类)使用,但是,我的远房亲戚就不能使用(不同包的子类)可以想象,现实生活中我们有很多东西,但是我们不能把所有东西都对外界说,哎,这个东西是私有的,或者这个东西是受到保护的,还有一种情况就是,我对外宣称它是受到我保护(protected)的,这时候,我们家的人就可以使用,我的远房亲戚也可以使用,有些东西对于我来说,我很乐意与大家一起分享,那么我就对外说,哎,他是公共(public)的,欢迎大家使用。因为有了这个机制,Java中的数据就安全多了,同时,它也迫使程序员去写一些方法,让他们的数据可以通过特殊的方法传到外界,比如我的钱包(总是说它,看起来它对于我很重要啊^_^),也不是说一定都不能让外界知道里面到底有多少钱,但是你不能直接就过来拿我的钱包啊(这样好像就是抢了),得要我乐意才行,那么好办,程序员写一个大家都可以使用得方法,外界就可以得到我得private得属性了。

成员变量的初始化,初始化一个对象
说到初始化,由于Java有了一个帮助程序员来完成那些类成员变量的初始化的机制,很容易让程序员产生那种JVM会帮我做,不用担心的想法,当然,JVM是帮助我们做了,但是它只是做了一部分,而这部分都是对于类成员变量来说的。如果是primitive type,那么JVM会帮助它们初始化为byte short int long 为0,float double为0.0,char为'0000/u',boleen为false。对于reference type来说,由于他们是存储在stack当中,而真正的实例是要存储在heap区,所以在这里的reference type的值,只是指向heap区中的路标,如果你没有对于它初始化产生一个实例,那么JVM会帮你初始化,并让它们的内容为null,也就是说,它们的路标中写到,我没有内容,不要从我这里找到实例。但是当我们实例了一个对象了之后,还是不能使用没有初始化的局部变量,因为局部变量都是储存在heap区的,而刚说的类成员变量,由于在编译的时候,JVM帮助我们初始化了,那么就是说我们的bytecode文件实际上已经写上了这些变量的内容,就可以在运行的时候使用了,而那些局部变量,由于它们是包装在类的方法中的,而类的实例又是放在heap区中的,所以,JVM没有办法帮助我们写它们的初始化值,再者,该方法不一定会调用,如果JVM帮我们写了,而实际上没有使用,那是对资源的一种浪费,所以局部变量在使用前,必须要初始化。对象的初始化则是new一个实例,如果该类有构造函数了,那么new就可以帮助我们调用它对对象初始化,如果没有,那么Java也会帮助我们写一个默认的构造函数,帮助我们实例一个对象,把对象放到heap区,然后让reference指向该对象,同时,将类成员变量初始化为默认值。(有时候常常会认为,Java就是为我们这些懒人而生的一个非常安全周到的程序语言,不过对于那些非常大的项目来说,最好还是一个个的不要怕麻烦的将其写完整,一个是整齐,便于管理,一个是安全,千里之堤,溃于蚁穴啊)
 
Java中的参数传递
Java当中方法传递参数都是通过值传递的,如果该值是primitive type,那么传递的参数就是写入的primitive type的值,但是要注意的是,如果在该方法中改变了该值的内容,原值不发生改变。当要传递的是一个reference type的时候,参数的值就是该对象的引用,对象的内容可以在被调用的方法中改变,但是对象的引用不会改变。都说Java中没有了指针,我觉得Java当中其实充满了指针,只不过Java把对于指针的操作全部都由JVM来实现了,reference tpye其实就是一个指针,只不过由于Java当中对于指针的操作是由JVM来实现的,所以,指针在Java当中是非常安全的。想到了这些之后,我觉得在C++当中的参数传递的多样性,在Java当中就变成了两种,所以在primitive type的传递的时候,由于传递的是Java已有的类型,它在内存的stack区中直接存储进了值,所以,在方法调用的时候,将该值赋给了方法参数中的变量,改变了该值,也不会影响到传递的原始值,相反,在reference type的传递的时候,由于在stack区储存的是该变量的reference,那么将该reference赋给了方法参数,而该方法参数指向的内容也同样是heap当中的该实例,所以在该方法中改变了reference所指向的实例的内容的时候,由于heap区中的值改变了,所以,原有的reference指向的内容也就同时发生了改变。所以由于实例的reference不会发生改变,实例的内容也就可能会改变了。

描述构造函数及方法重载
有时候我们想用同一个方法去完成一些不同得事情,比如我去打印店,也许我要从电脑里面打印一个文件,或者,我要扫描一个东西,或者我只是复印,那么如果我要打印就去打印店,要复印就去复印店,那就相当麻烦了,方法也一样,有时候我们写一个方法名,我们想干不同得事情(也许有时候是我们想不到其他得名字了),写很多名字得方法,对于使用者来说,简直就是折磨,这时候我们使用重载,重载得方法很简单,只要写上相同得名字就可以了,当然需要不同得参数内容,或者是参数得个数,或者是参数得类型,或者是方法得return type(值得注意得地方是,你不能通过相同得参数内容,不同得return type来写一个重载,这样编译器通不过的,不同的return type+不同的参数内容才可以)当然,不能是参数得名字了,这样一种机制,就成为了方法的重载。要注意的是,构造函数是不能被继承的。但是调用子类构造函数的时候,如果没有手动调用父类构造函数,JVM会自动调用没有参数的父类构造函数。
构造函数是一种特殊的方法,这个方法在new的时候自动调用,也就是说,实例对象要做的第一个动作就是就是调用构造函数的方法。构造函数的写法只要与类名字相同,后面加上一个方法的定义符()就行了。如果没有写构造方法,在new的时候,Java会自动的为你写一个没有参数的构造函数,但是如果你写了一个构造函数,那么这时候Java就不再会为你编写构造函数了,这是什么概念呢,就是说如果你写一个父类,并给它写了一个带参数的构造函数,那么如果你写一个它的子类的时候,没有写构造函数,或者你在子类中写了构造函数,但是没有实现父类的那个带参数的构造函数,那么编译器就不会通过,为什么呢,因为你在子类中没有写构造函数,Java就会为你写一个不带任何参数的构造函数,这不是关键,关键就在于你没有实现你父类带参数的构造参数,在编译子类的时候,编译器会首先去调用父类的构造参数,这时候由于你的父类构造参数已经写了,Java就不会再为你写一个不带参数的构造函数了,这时候,它首先调用父类构造参数的时候,由于你没有特别的指明你要调用的是你已经写过的那个构造函数,它会认为你要调用父类默认的不带任何参数的构造函数,而这个构造函数JVM又没有给你写,这时候编译器就会说,我找不到父类构造函数了。由于构造函数是一种特别的类方法,所以重载的概念在构造函数也适用。

描述this引用的用途(Java编程语言自动将所有实例变量和方法引用与this关键字联系在一起)
关于this出现,我是这样猜想的,当有了类之后,就有了全局变量和局部变量,这时候命名就会出现这样一种情况,有时候你在类当中定义了某个属性,在某个方法的时候,你还想使用这个名字,怎么办呢,随着程序的不断扩大,类的名字相同可以通过package来解决,那么同一个类中的名字的相同,该怎么解决呢,这时候他们(语言的创造者)就想到了我们何不创造这样一个关键字呢,这个关键字自动的将所有的实例变量和方法的引用与这个关键字联系在一起呢,好了,有了这个想法之后,他们就创造出来它了,由于是与自己联系在一起,那么就给它命名this吧,于是,有了this这个关键字。这时候,如果我们在方法内部出现了定义与类成员变量相同名字的变量的时候,我们就可以使用this.该局部变量的名字来指引编译器去找到类成员变量,如果不用this.这时候编译器就会使用该方法中的局部变量,为什么?我的地盘我作主啊。当然,this的内容远不止这些,这里单是this引用的用途的理解。在构造函数重载调用的时候,必须要把它写到构造函数的最前面。

 

关键字super
super被用在类中引用其超类
super被用来调用朝类的成员变量


Java应用程序代码是可重复使用的
如果我想为我要输入的字符串加上某个特殊的结尾,比如加一个tab,我可以在每次输入的时候,都写一个String += tab,我觉得每次都这样写会很麻烦,于是我写一个util类,这个类中有一个static方法,为传回的参数加一个tab并返回字符串,我以后如果想在哪里加tab了,那么我可以import 这个util,然后在不用实例这个类的基础上调用这个方法,当然,这里只是一个小例子,并且这个例子并没有简化多少我所想要做的工作,就好像你如果只是写一个很小的东西,Java的全是类的思想,并不会帮你简化多少工作,相反的,你把什么代码都写到main来实现,反而是一种糟蹋面相对象思想的行为,但是,如果我们要完成一个非常非常大的工作的时候,这个方法的可重用性就显得非常的有用了,由于它的面向对象的机制而决定了Java中的代码都是可重用的,这中机制,不单停留在方法上,class是一个蓝图,利用这个蓝图,我们可以创建很多的instances。 

原创粉丝点击