类和对象简述

面向对象程序设计OOP就是使用对象进行程序设计。对象(Object)代表现实世界可以明确标识的一个实体。
例如:一个学生、一张桌子、一个圆、一个按钮甚至一笔贷款都可以看做是一个对象。每个对象都有自己独特的标识、状态和行为。
一个对象的状态(state,也称之为特征(property))或属性(attribute))是指那些具有它们当前值的数据域。例如:圆对象具有一个
数据域radius,它是标识圆的属性。一个矩形对象具有数据域width和height
,它们都是标识矩形的属性。
一个对象的行为(behavior,也称之为动作(action))是由方法定义的。调用对象的一个方法就是要求对象完成一个动作。
例如:可以为圆对象定义一个名为getArea()的方法。圆对象可以调用getArea()返回圆的面积。

使用一个通用类来定义同一类型的对象。类是一个模版、蓝本或者说是合约,用来定义对象的数据域是什么以及方法是做什么的
一个对象是类的一个实例。可以从一个类中创建多个实例。创建实例的过程称为实例化(instantiation).
类和对象的关系之间类似于苹果派配方和苹果派之间的关系。可以用一种配方做出任意多的苹果派来。
java类使用变量定义数据域,使用方法定义动作。除此之外,类还提供了一种称为构造方法的特殊类型的方法,调用它可以创建一个新对象。
构造方法本身是可以完成任何动作的 ,但是 设计构造方法的初衷还是为了完成初始化动作,例如初始化对象的数据域。
使用构造方法构造对象
构造方法是一种特殊的方法。他们有以下三个特殊性:
1)构造方法必须具备和所在类相同的名字。
2)构造方法没有返回类型,甚至连void都没有。
3) 构造方法是在创建一个对象使用new操作符时调用的,构造方法的作用是初始化对象。
构造方法具有和定义它的类完全相同的名字,和其他方法一样,构造方法也可以重载(也就是说,可以有多个同名的构造方法,但他们要有不同的签名),这样更易于用不同的初始数据值来构造对象。
构造方法是用来构造对象的。为了能够从一个类构造对象,使用new操作符调用这个类的构造方法。
通常一个类会提供一个没有参数的构造方法。这样的构造方法称为无参数构造方法(no-arg-constructor)。

通过引用变量访问对象
要给新创建的对象在内存中分配空间。他们可以通过引用变量来访问。
引用变量和引用类型
对象是通过对象引用变量(reference variable)来访问的,该变量包含对对象的引用,使用如下语法格式声明这样的变量:
ClassName objectRefVar; 类名 对象引用变量;
一个类基本上等同于一个程序员定义的类型。一个类就是一种引用类型(reference type), 这意味着任何类型为类的变量都可以引用该类的一个实例。下面的语句声明变量myCircle的类型是circle类型,也就是myCircle是一个Circle对象:
Circle myCircle;
变量myCircle能够引用一个Circle对象。下面的语句创建一个对象,并且讲它的引用赋给变量myCircle:
myCircle = new Circle();
访问对象的数据和方法
在创建一个对象之后,它的数据和方法可以使用圆点运算符(.)来访问和调用,该运算符 也称为对象成员访问运算符(object member access operator):
objectRefVar.dataField引用对象的数据域。
objectRefVar.method(参数)调用对象的方法。
例如:myCircle.radius引用myCircle的半径,而myCircle.getArea()调用myCircle的getArea方法。方法作为对象上的操作被调用。
数据域radius称作实例变量(instance variable),因为它依赖于某个具体的实例。基于同样的原因,getArea方法称为实例方法(instance method),因为只能在具体的实例上调用它。调用对象上的实例方法的过程称为调用对象(calling object)。
如果一个对象在创建之后不需要引用,可以只创建对象,不将他明确的赋值给一个变量,称为匿名对象。
引用数据域和null值
数据域也可能是引用型的。例如,下面的Student类包含一个String类型的name数据域,String是一个预定义的Java类。

   class Student {
      String name;
      int age;
      boolean isScienceMajor;
      char gender;
    } 
如果一个引用类型的数据域没用引用任何对象,那么这个数据域就有一个特殊的Java值null。null同true和false一样都是一个直接量。true和false是boolean类型的直接量,而null是引用类型直接量。
引用类型数据域的默认值是null,数值类型数据域的默认值是0,boolean类型数据域的默认值是false,而char类型数据域的默认值是'\u0000'。但是,java没有给方法中的局部变量赋默认值。下面的代码显示Student对象中数据域name、age、isScienceMaior和gender的默认值:
 class Test {
            public static void main(String[] args){
            Student student = new Student();
            System.out.println("name? " + student.name);
            System.out.println("age? " +student.age);
            System.out.println("isScienceMajor " + student.isScienceMajor);
            System.out.println("gender? " + student.gender);
            }
    }

这里写图片描述
下面代码中的局部变量x和y都没有被初始化,所以他会出现编译错误:

  class Test {
    public static void main(String[ ] args) {
     int x;
     String y;
     System.out.println("x is " + x);
     System.out.println("y is" + y);

}

}

警告: NullPointerException是一种常见的运行错误,当调用值为null的引用变量上的方法是会发生此异常。在通过引用变量调用一个方法之前,确保先将对象引用赋值给这个变量。

基本类型变量和引用类型变量的区别
每个变量都代表一个存储值得内存位置。声明一个变量时,就是在告诉编译器这个变量可以存放什么类型的值。
对基本类型变量来说,对应内存所存储的值是基本类型值。对引用类型来说,对应内存所存储的值是一个引用,是对象的存储地址。比如如图,int型变量i的值就是int值i,而Circle对象c的值存的是一个引用,它指明这个Circle对象的内容存储在内存的什么位置
基本类型变量在内存中存储的是一个基本类型值,而引用类型变量存储的是一个引用,它指向对象在内存中的位置
将一个变量赋值给另一个变量时,另一个变量就被 赋了同样的值。对基本类型变量而言,就是将一个变量的实际值赋给另一个变量。对引用类型变量而言,就是将一个变量的引用赋给另一个变量。
赋值语句i=j将基本类型变量j的内容复制给基本类型变量i。
这里写图片描述
对引用变量来讲,赋值语句c1=c2是讲c2的引用赋给c1。赋值之后,变量c1和c2指向同一个对象。
这里写图片描述
静态变量、常量和方法
实例变量是绑定到类的某个特定实例的,它是不能被同一个类的不同对象所共享的。
如果想让一个类的实例共享数据,就要使用静态变量(static variable),也称之为类变量(class variable)。静态变量将变量值存储在一个公共的内存地址。因为它是公共的地址,所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会受到影响。Java支持静态方法和静态变量,无需创建类的实例就可以调用静态方法(static method)。
类中的常亮 是被该类的所有对象所共享的。因此,常亮应该声明为final static。
例如:Math类中的常亮PI是如下定义的:
final static double PI = 3.1415926……..
实例方法和实例数据都是属于实例的,所以他们在实例创建之后才能使用。它们是通过引用变量来访问的。静态方法和静态数据可以通过引用变量或他们的类名来调用。
静态变量和静态方法既可以在类的实例方法中使用,也可以在类的静态方法中使用。但是,实例变量和实例方法只能在实例方法中使用,不能再静态方法中使用,因为静态变量和静态方法不属于某个特定的对象。

设计指南:如果一个变量或方法依赖于类的某个具体实例,那就应该将它定义为实例变量或实例方法。如果一个变量或方法不依赖于类的某个具体实例,就应该将它定义为静态变量或静态方法。例如:每个圆都有自己的半径。半径都依赖于某个具体的圆。因此,半径radius就是Circle类的一个实例变量。由于getArea方法依赖于某个具体的圆,所以,它也是一个实例方法。在Math类中没有一个方法是一来于一个特定的实例的,例如:random、pow、sin和cos。因此,这些方法都是静态方法。main方法也是静态的,可以从类中直接调用。
可见性修饰符
可以在类、方法和数据域前使用public修饰符,表示他们可以被任何其他的类访问。如果没有使用可见性修饰符,那么默认为类、方法和数据域是可以被同一个包中的任何一个类访问的。这称作包私有(package-private)或包内访问(package-access) 。
除了public和默认可见性修饰符,Java还为类成员提供了private和protected修饰符。
private修饰符限定方法和数据只能在它自己定义的类中被访问。
修饰符private只能应用在类的成员上。修饰符public可以应用在类或类的成员上。在局部变量上使用修饰符public和private都会导致编译错误。
大多数情况下,构造方法应该是公共的。但是,如果想防止用户创建类的实例,就该使用私有构造方法。例如:因为Math类的所有数据域和方法都是静态的,所以没必要创建Math类的实例。为了防止用户从Math类创建对象,在java.lang.Math中的构造方法定义为

private Math(){
}

给方法传递参数。
当传递基本数据类型参数时,传递的是实参的值,在这种情况下,n(5)的值就被传递给times。在printAreas方法内,times的内容改变,这并不会影响n的内容。
传递引用类型的参数时,传递的是对象的引用。在这种情况下,双方具有相同的引用值。因此通过在方法内部和方法外部来改变对象的属性,效果是一样的。引用上的传值在语义上最好描述为传共享(pass-by-sharing);也就是说,在方法中引用的对象和传递的对象是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值