面像对象(上)

一、面向对象(OOP):

Object Oriented Programming        (Oriented:['ɔːrɪentɪd])

面向对象的三大特性:封装、继承、多肽。

 

 

二、类和对象:

类和对象是面向对象编程中两个重要概念;

类(class)和对象(object,也被称为实例,instance),类用于描述客观世界里某一类对象的共同特性,而对象则是类的具体存在;

类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用类的对象;

 

1、类:

 

类包含三种常见的成员:构造器、成员变量和方法;

构造器:用于构造该类的实例,java通过new关键字来调用构造器,从而返回该类的实例;

成员变量:状态数据;

方法:该类或者该类实例的行为特征或者功能实现;

 

1.1 成员变量:

语法格式:

[修饰符] 类型 成员变量名 [=默认值];

 

修饰符:可以省略,也可以是public、protected、private、static、final,其中public、protected、private只能出现其中的一个,可以与static、final组合起来修饰成员变量;

static:static修饰的成员表明它属于这个类本身,而不属于这个类的单个实例,通常把static修饰的成员变量和成员方法称为类变量和类方法。不使用static修饰的成员变量和方法称为实例变量,实例方法。静态成员不能直接访问非静态成员。

 

1.2 成员方法:

        语法格式:

[修饰符]  方法返回值类型 方法名(形参列表)

{

    //方法体

}

 

1.3 构造器:

语法格式:

[修饰符]  构造器名(形参列表)

{

    //方法体

}

 

构造器名必须和类名相同;

类中没有定义构造器,系统将会为它提供一个默认的无参构造器;

 

2、对象的产生与使用

 

2.1 创建对象

创建对象的根本途径是构造器,通过new关键字来调用某个类的构造器来创建这个类的实例;

 

//调用Person的构造器创建了一个Person实例

//将Person实例赋值给p变量

Person p = new Person();

 

在这行代码中实际产生了两个东西:一个是p变量(引用变量),一个是Person对象,p变量存放在栈内存中,指向实际的Person对象,而真正的Person对象则存放在堆(heap)内存中。从这个角度来看,引用变量和c语言里的指针很像,它们都是存储一个地址值,通过这个地址来引用到实际对象。

 

java程序不允许直接访问堆内存中的对象,只能通过该对象的引用操作该对象。当访问p引用变量的成员变量和方法时,实际上是访问p所引用的对象的成员变量和方法。

 

//堆内存里的对象可以有多个引用

//将p变量的值赋值给p1变量

Person p1 = p;

 

上面代码把p变量的值赋予给p1变量,就是将p变量保存的地址赋值给p1变量,这样p1和p就指向了同一个Person对象。p1和p访问Person对象的成员变量和方法时,将返回同样的结果。

 

如果堆内存里的对象没有任何变量指向该Person对象,那么程序将无法访问到该对象,这个对象也就变成了垃圾,java的垃圾回收机制将回收该对象,释放该对象占所占用的内存区。

 

 

2.2 对象的使用:

 

static修饰的成员变量和方法,可以通过类来调用,也可以通过实例来调用;没有static修改的成员变量和方法必须通过实例来调用。 

 

类.成员变量|方法

实例.成员变量|方法

 

3、this关键字的使用 

 

this关键字总是指向调用该方法的对象;

this关键字的最大作用就是让类中的一个方法,访问该类中的另外一个方法或者实例变量;

static修饰的方法中不能使用this关键字,static修饰的方法不能访问不使用static修饰的普通成员;

 

示例:定义一个Dog类,这个Dog对象的run()方法需要调用它的jump()方法,该如何实现

 

Dog类:

public class Dog {


    public void jump(){
        System.out.println("jump");
    }

    public void run(){
        Dog d = new Dog();
        d.jump();
        System.out.println("run");
    }

}

 

DogTest:

public class DogTest {

    public static void main(String[] args) {

        Dog dog = new Dog();
        dog.run();

    }

}

 

使用this关键字,简化代码:

 

this可以代表任何对象,当this出现在某个方法体中时,它所代表的对象是不确定的,但它所代表的类型是确定的,它所代表的对象只能是当前类,只有当这个方法调用时,它所代表的对象才被确定下来,谁在调用这个方法,this就代表谁。

 

Dog类:

public class Dog {


    public void jump(){
        System.out.println("jump");
    }

    public void run(){
        //Dog d = new Dog();
        //d.jump();
        //this也可以省略,直接是jump()
        this.jump();
        System.out.println("run");
    }

}

 

DogTest(不需要做修改):

public class DogTest {

    public static void main(String[] args) {

        Dog dog = new Dog();
        dog.run();

    }

}

 

4、方法详解:

 

4.1 方法的传参机制:值传递

public class PrimitiveTransferTest {

    public static void swap(int a,int b){
        int temp = a;
        a = b;
        b = temp;
        System.out.println("swap方法里,a的值是"+a+";b的值是"+b);
    }

    public static void main(String[] args) {
        int a = 6;
        int b = 9;
        swap(a,b); // swap方法里,a的值是9;b的值是6
        System.out.println("交换结束后,变量a的值是"+a+";b的值是:"+b); // 交换结束后,变量a的值是6;b的值是:9
    }
}

 

4.2 递归方法

 

 

posted @ 2018-06-16 21:31  艾白羊  阅读(315)  评论(0)    收藏  举报