五、面向对象编程
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面对对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
面向对象的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
三大特征:封装、继承、多态
六、类与对象
类、对象、方法的概念
类是对某一类事物的描述,是抽象的、概念上的定义;而对象是实际存在的属该类事物的具体个体,因而也称为实例。
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。 方法就是c中的函数,使程序模块化
一个类可以包含以下类型变量:
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量(实例变量):成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量(静态变量,实际就是全局变量):类变量也声明在类中,方法体之外,但必须声明为 static 类型。
空类没有任何意义,所以我们需要定义类的具体信息。对于一个类来说,一般有三种常见的成员:属性field、方法method、构造器constructor。这三种成员都可以定义零个或多个。
定义类
类是将数据和方法封装在一起的一种数据结构,定义类就是定义类的属性与方法。
类的一般结构:
类修饰符的含义:
public 将一个类声明为公共类,它可以被任何对象访问
abstract 将一个类声明为抽象类,没有实现方法,需要子类提供方法的实现,所以不能创建该类的实例
final 将一个类声明为最终类,即非继承类,表示它不能被其他类所继承
缺省 缺省修饰符时,则表示只有在相同包中的对象才能使用这样的类
一个类可以有多个修饰符,且无先后顺序之分,但abstract和final相互对立,所以不能同时应用在一个类的定义中
成员变量(field 属性)和局部变量的区别
成员变量:
①成员变量定义在类中,在整个类中都可以被访问。
②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
③成员变量有默认初始化值。
局部变量:
①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
②局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
③局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找
一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法。
成员方法///见第七章
构造器/构造方法 //可见第八章
构造器是一个特殊的方法,是在对象被创建时初始化对象的成员的方法。
类名(){ } //默认构造方法
默认的敲不敲都可以,不敲的话编译器会自己加
main方法形式上属于一个类,实际上是独立的
构造器的4个要点
构造器通过 new关键字调用! !
构造器虽然有返回值, 但是不能定义返回值类型(不能有void、int等修饰)(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
如果我们没有定义构造器, 则编译器会自动定义一个无参的构造函数。如果已定义,则编译器不会自动添加!
造器的方法名必须和类名一致。
构造器重载
方法与方法之间有重载,构造方法的重载:可以让用户用不同的参数来构造对象。
雷区:如果方法构造中形参与属性名相同时,需要使用this关键字区分属性与形参。this.id表示属性id ;id表示形参id
对象的创建和使用
创建对象
创建对象需要以下三步:
声明:声明一个对象,包括对象名称和对象类型
实例化:使用关键字new来创建一个对象
初始化:使用new创建对象时,会调用构造方法初始化对象
public class Puppy{
public Puppy(String name){
//这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}
public static void main(String[] args){
// 下面的语句将创建一个Puppy对象
Puppy myPuppy = new Puppy( "tommy" );
}
}
对象的使用
对象名.对象成员 用点...相连,通过这种引用可以访问对象的成员,如果对象成员是成员变量,则通过这种引用方式可以获取或修改类中成员变量的值。
访问实例变量和方法:
通过已创建的对象来访问成员变量和成员方法:
/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();
但是如果是在类声明的内部使用这些成员(成员变量、成员方法)则可以直接使用成员名称,而不需要新创建的对象的名称。 在类声明外面必须新创建对象,指明是哪个对象变量。
在类内调用方法
在同一类中调用某一方法,可直接调用不需加对象名。
如果要强调的是“对象本身的成员”则可以在成员名前加 this 关键字,:“this.成员名” this即代表调用此成员的对象。
参数的传递
方法既可以有返回值,也可以有参数
当方法不需要传递任何参数时,方法的括号内什么也不用写,当不需要返回值时,可以不写return。
以变量为参数调用方法
括号内的参数可以是数值型、字符型,甚至是对象(如:数组)。
void setCylinder(double r,int h,double p){ ... } //形参
void setCylinder(2.5, 5.3, 3.14) //实参
以数组作为参数或返回值的方法调用
只要指明传入的参数是一个数组即可
实参只用给出数组名 ,而形参需要给出数组的类型一维数组还是二维数组,整型数组还是浮点型数组
放回值也只写出数组名即可 return array;
若方法的返回值是数组,需方法前加数组类型 如:int[ ] 方法名(int[ ] array)
匿名对象
使用匿名对象的两种情况:
(1)一个对象只使用一次方法调用。
(2)将匿名对象作为实参传递给一个方法调用 如:
public static void getSomeOne(MyClass c){ ... }
可以用这个语句调用这个方法: getSomeOne(new MyClass( ) );