(七)面向对象

来源:互联网 发布:sql删除视图数据 编辑:程序博客网 时间:2024/05/18 04:38

面向对象(object-oriented:OO)

从现在开始就迎来了java基础里的第二大重点。

1、面向对象与面向过程

面向对象是相对于面向过程而言的。
面向过程注重的是过程,强调的是在完成的这个过程中的动作。
面向对象注重的是对象,只要找到了这个对象,就拥有了这个对象所具有的一切功能。适当的举出两个例子。
这里写图片描述
面向对象是基于面向过程的。
面向对象不一定优于面向过程,如果事物相对简单,适合用面向过程;如果事物比较复杂,适合于面向对象。

2、类和对象的关系

例如,人一般都有姓名、性别、年龄等一些特征,还有睡觉等行为。
根据一类事物进行抽取,将这一类事物用一个类表示,同时将这一类事物的共有特征抽取成属性,将这一类事物的共有行为抽取成了方法。类是对象的抽取/概括。
通过new关键字来产生对应的对象/实例。对象是类的实例化/具体化。
这里写图片描述

public class PersonDemo{    public static void main(String[] args){        Person p = new Person();        p.name = “如花”;        p.age = 18;        p.gender = ‘女’;    }}calss Person{    String name;    int age;    char gender;    public void sleep(){        System.out.println(“sleep !”);    }}

3、对象在内存中的存储

对象在内存中是存储在堆内存中的。
这里写图片描述
如下代码:

public class PersonDemo{    public static void main(String[] args){    Person p = new Person();    p.name = “翠花”;    p.age = 18;    p.gender = ‘女’;    changeName(p);    System.out.println(p.name);    //结果是如花。}Public void changeName(Person p2){    P2.name = “如花”;}

这里写图片描述
当我们的代码执行到了Person p 的时候,虚拟机会在栈内存中开辟空间标记这个空间为p,当代码执行new Person的时候,会在堆内存中开辟空间,并生成一个此空间的十六进制的一个地址。将Person的属性放入该空间中,给他们添加默认值,将此空间的地址赋值给栈内存中的p。执行后面的赋值语句会将堆内存中的相应的属性值更改为我们赋予的值。
注意:对象在传值的时候传递的是地址。
如果在代码中添加Person p3 = p;那么此时只是将p保存的堆内存地址赋予了p3。

4、成员变量和局部变量

在类内方法外的变量叫成员变量。
在方法内的变量叫局部变量。
在定义格式上相同。

区别

定义位置不同

成员变量是定义在类内方法外;局部变量是定义在方法或者语句内部。

作用域不同

成员变量作用域整个类;局部变量只能在定义的方法或者语句内部使用。

内存存储位置不同

成员变量存在堆内存中,并且在堆内存中自动的赋予默认值;局部变量是存储在栈内存中,不会自动给值,需要手动初始化。

生命周期不同

成员变量是随着对象的创建而加载到堆内存中,并获取默认值,随着对象的回收而释放(解析);局部变量在方法或者语句执行的时候创建,随着方法或者语句的结束而立即移除出栈内存。

5、构造函数(constructor)

1.定义

在类中与类同名,没有返回值,也没有返回值类型的方法,主要是用于创建对象(描述对象创建过程)叫做构造函数。
如果一个类没有手动提供构造函数,那么JVM在编译的时候会添加一个无参的构造函数。
例如:

class Person{    public Person(){}}

如果手动添加了构造函数,JVM就不会再提供无参构造函数。
构造函数在类的对象创建时就运行,一个对象创建后,其构造函数只执行一次,就是创建时执行。
父类中必须有一个无参的构造函数,子类中可以有有参的也可以有无参的不用上下对应。

2.格式

public 类名(参数1,参数2,……){
Code;
}
上述格式还不是最简单的构造函数,最简单的构造函数如下:

public class A{    A(){}}

3.特点

1个没有,4个可以:
1.构造函数没有返回值类型,也没有返回值。
2.构造函数可以重载。
3.构造函数可以写return语句,为了规避风险。
4.构造函数可以有参数,参数一般是创建对象必须依赖的条件(前提条件)。
5.可以存在与类同名的普通函数。但是一般不建议使用。

4.作用

创建对象

任何一个对象创建时,都需要初始化才能使用,所以任何类想要创建实例对象就必须具有构造函数。标识对象创建的开始和结束。

对象初始化

构造函数可以对对象进行初始化,并且是给与之格式(参数列表)相符合的对象初始化,是具有一定针对性的初始化函数。

6、this关键字

this代表当前对象的引用。
注意:在Java中所有的非静态属性和非静态方法都会通过对象来调用的。

1.作用

this代表当前在使用的对象
可以认为是一个虚拟对象,可以通过this在本类中调用本类的非静态方法和非静态属性。

2.this语句

this语句表示在本类的构造函数中调用本类的其他的对应形式的构造函数。
this语句会自动匹配对应形式的构造函数。
this语句必须放在构造函数的第一行。

class Person{    public Person(){}    public Person(String name,int age){        this.name = name;        this.age = age;    }    public Person(String name,int age,int gender){        this(name,age); //this语句。调用本身的构造函数。        this.gender = gender;    }}

注意:初学的时候一定要分清,什么是this,什么是this语句,我在刚学习的时候,就搞混了这两个概念。

3.应用

1.引用成员变量。
2.调用类的构造方法。
3.返回对象的值。return this;

public class Person{    public Person(){}    public static Person m(){        return this;    }}

7、匿名对象

1.定义

没有名字的对象(匿名对象其实就是定义对象的简写格式)。

//正常形式Car c =new Car();c.run();//匿名对象形式:new Car().run();

2.使用方法

1.当对象对方法仅进行一次调用的时候,就可以简化成匿名对象。

new Person.eat();new Person.age = 20;

2.匿名对象可以作为实际参数进行传递。

    changeAge(new Person);

8、代码块(code block)

1.局部代码块

定义

在函数或者语句内部用{ }括起来的代码块称之为局部代码块,又叫普通代码块。是作用在方法中的代码块。

Public static void main(String[] args){    {        Int i = 2;        System.out.println(i);    }   //i 变量被释放。    Int j = 3;    System.out.println(j);}

作用

用于限制变量的使用范围和生命周期,从而提高内存的利用率。

2.构造代码块(constructional code block)

定义

直接在类中定义且没有加static关键字的代码块称为构造代码块,也叫初始化代码块。在构造函数执行之前先执行一次。
构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造方法。
执行顺序:(优先级从高到低)静态代码块→main方法→构造代码块→构造方法。

格式

{
构造代码块执行语句
}

作用

把多个构造方法的共同代码放在一起。

构造代码块和构造函数的区别

构造代码块是给所有对象进行统一初始化,而构造函数是给队形的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立相应的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。

面向对象这里的概念性的东西比较多,要仔细理解。

原创粉丝点击