设为首页 加入收藏

TOP

Java面向对象基础(一)
2018-01-01 06:06:59 】 浏览:379
Tags:Java 面向 对象 基础

类有属性和方法,它们对本类有效(作用范围)。类的属性就是成员变量,它默认会赋值初始化。类的方法是类具有的一些行为。


类是抽象的,将它们实例化后就是对象(通过new进行实例化),各实例化后的对象都具有这些成员变量的属性,且赋有具体的值,如果某对象没有为成员变量赋值,则采用默认初始化时的值。每个new出来的对象都有自己独立的成员变量,但某个类的所有对象都共享类的方法,因为类方法只是一段放在代码区的代码,只有执行调用类方法时才会产生相关内容。


有了实例化后的对象,就可以引用对象的属性并调用对象的方法(实际上是类的方法,方法是共享的,并不属于某个单独的对象),这样就可以实现这个对象的相关操作。引用对象的属性方式为"对象名.成员变量",调用对象的方法的方式为"对象名.方法"虽说方法是各对象共享的,但显然,"对象名1.方法1"的方法1执行时,方法内部的变量采用的都是对象名1的成员变量。


示例分析:


以一个三维空间上的点类来说,点具有三维坐标xyz,x、y、z就是它们的属性,需要定义为点类的成员变量。点可以求出它到原点的距离、到另一个点的距离,求距离就是通过类的方法(函数)实现。通过new这个点类,就可以实实在在地创建一个点,new一次就一个点,每个点都有自己的xyz属性,每个点的成员变量都在new出来的时候和对象一起存放在heap内存区。每个点都拥有大家共享的求距离方法getDistance()。于是,就可以将这个点类定义为下面的形式:


将上述代码整理,并写一个main方法,就可以实现一个计算两点距离的小程序。例如,TestPoint.java文件内是如下内容:


从上面的例子中可以感受到,面向对象更抽象地说是面向类。在实现某个功能的时候,例如求两个三维点之间的距离时,将点的属性和求距离的方法定义到点类中,以后就不用管点的xyz属性、求三维点之间距离的表达式方法,只要在需要时面向这个类new出点对象,它就有了点的xyz属性,再调用点对象的求距离的方法就可以了。有了面向对象,求三维点距离时,只需知道两件事:为成员变量xyz赋值;记得点类中的方法的名称。这就像为了查看文本内容执行cat命令一样,只要记得cat命令的名称、功能和选项参数即可,无需关心cat的内部机制是如何读取文本内容并将其显示出来的。


在定义一个方法时,需要考虑三个问题:方法的名称如何取、方法的参数、方法是否有返回值。方法的名称暂且不说,方法的参数必须要考虑清楚,例如求两点的距离时,参数可以是某个点的坐标,也可以直接是一个点对象。如果已经定义了点类,那么使用点对象作为参数更符合面向对象的原则;方法的返回值同样重要,返回值决定了这个方法的性质,例如判断两点间的距离是否大于20,就应该返回布尔类型,而不是double类型。


构造方法和类同名,它的作用是在对象被new出来时做初始化行为。因为构造方法的目的是初始化,因此构造方法必须不能有返回值,即不能写上数据类型或void关键字。


例如:


以后就可以在new对象的时候进行初始化,例如:


如果没有显式定义构造方法,则隐含了一个空构造方法,例如下面的代码中,两个class是完全等价的。


因为初始化有默认的值,所以它们还等价于(0.0是初始化double时的默认值):


正因为有隐含的空构造方法,才能在new对象的时候不使用任何参数就能进行成员变量的初始化。例如:


在new对象的时候,对象的参数必须和构造方法完全对应,例如定义了构造方法Point(double _x,double _y,double _z)后,就只能new Point(value1,value2,value3),而不能不接任何参数new Point()或接少于3个的参数new Point(value1,value2)


当两个或多个方法的名称相同,只有参数不同时(可以是参数的个数、参数的数据类型不同),它们就构成了方法的重载。


方法的重载大大减少了方法数量的定义。例如,要求两个值中较大者,考虑到值可以是整形也可以是小数,于是使用如下方式:


这里第一个方法intMax()和第二个方法doubleMax()实际上是重复的,仅仅只是参数类型上不同。这样的设计很不方便,不仅在比较数值时不知道应该调用哪一个方法,还要知道各个方法的区别。


而使用重载就不再有这样的问题。


这两个Max方法名称相同,仅仅只是参数不同。在调用Max()的时候,根据传递的实参(2,3)和(2.0,3.0),它能能够区分出前者应该使用第一个Max(),后者使用第二个Max()。


重载的本质是在调用方法时能够通过传递的参数个数、参数的值筛选出具体应该使用哪个方法。


例如下面的方法中,前4个都能构成方法重载,而最后一个不能,因为它的定义方式不同。从本质上来说,是因为调用Max()传递两个int整型数值时,无法确定是选择第一个方法还是最后一个方法,而它们又正好是冲突的,因此它们不构成重载。


在类的方法定义中使用this关键字可以代表该方法的对象的引用,它是new出来的对象中指向对象自身的关键字。当必须指出当前所使用方法的对象是谁时需要使用this,使用this还可以避免成员变量和形参重名的问题。


上述示例中,new TestThis创建了一个TestThis对象,tt指向该对象。tt.increment()表示调用一次tt对象的方法,此时i自增一次,并返回this,this代表的对象正是tt指向的对象,是TestThis类的对象,所以他也有increment()方法,所以还可以继续执行increment()方法,最后再次返回this,最后执行print()方法,输出自增两次后的i值。


注意,虽然可以return this来返回自身对象的引用,但却不能使用return super来返回父类对象的引用。也就是说,父类对象只能操作其内某个成员,不能直接返回父对象整体。


static声明的成员变量为静态成员变量,它是该类的共享变量。在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。


可以通过对象引用或直接通过类名来引用静态成员。即使在没有new出任何对象时,也能直接引用静态成员,因为它属于类假如类名为T,静态成员变量有i,静态方法有m(),则可以直接使用T.i和T.m()分别引用。当new出来T的一个对象t时,可以使用t.i或t.m(),这和使用T.i和T.m()是完全等价的。(实际上,在不产生冲突的情况下,即使不写类名也可以直接引用静态变量、静态方法)


用static声明的方法为静态方法,静态方法不是针对某个对象来调用的。在调用静态方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员,即静态方法中不可以访问非静态成员变量和其他非静态方法。换句话说,因为静态方法属于类,静态方法看不到heap中各对象中的成员,它只能看到data segment中的静态成员。


在上面的例子中,静态变量cnt使用类名直接访问,并使用静态变量cnt作为成员变量id的赋值基础("id=++cnt;")。由于静态变量只在最初进行了赋值,后续一直都通过自增的方式进行改变,这是静态变量的广为使用的功能:"充当计数器"


如果把上面的s

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python实现SSH隧道功能 下一篇Java数组基础

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目