java笔记07 面向对象

1.  面向对象的概念

1.1 什么是面向对象

面向对象是相对面向过程而言,面向对象和面向过程都是一种思想。

1.2 面向过程:强调的是功能行为。代表语言:C语言

例子:把大象装进冰箱
      1. 打开冰箱。
      2. 存储大象。
      3. 关上冰箱。

强调的都是步骤和方法

1.3 面向对象:将功能封装进对象,强调具备了功能的对象。

代表语言:Java、C++、C#。

例子:把大象装进冰箱
    1. 冰箱打开。
    2. 冰箱存储。
    3. 冰箱关闭。
所有的操作都是以"冰箱"为主体,而不是功能行为。也就是说冰箱自己已经具备"打开"、"存储"、"关上"的行为功能。将功能方法封装到对象中,直接调用对象就可以调用方法。

1.4 面向对象的特点

是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者。

完成需求时:
1. 先要去找具有所需的功能的对象来用。
2. 如果该对象不存在,那么创建一个具有所需功能的对象。

这样可以简化开发并提高复用。

 

2.  面向对象的开发

开发的过程:

其实就是不断的创建对象,使用对象,指挥对象做事情。

设计的过程:

其实就是在管理和维护对象之间的关系。

 

3.  面向对象三大特征

封装(encapsulation)、继承(inheritance)、多态(polymorphism)

 

4.  类与对象的关系

使用计算机语言就是不断的在描述现实生活中的事物。

java中描述事物通过类的形式体现,类是具体事物的抽象,概念上的定义。

对象即是该类事物实实在在存在的个体。

 

可以理解为:类就是图纸,汽车就是堆内存中的对象。

 

5.  类的定义

生活中描述事物无非就是描述事物的属性和行为。

例如:人有身高,体重等属性,有说话,打球等行为。

Java中用类class来描述事物也是如此

属性:对应类中的成员变量。

行为:对应类中的成员函数。

定义类其实在定义类中的成员(成员变量和成员函数)。

例如:定义一个人

class Person
{
private String name;//名字属性
private int age;//年龄属性
Person(String name,int age)
{
     this.name=name;
     this.age=age;
}
public void sayHello()//打印语句的方法
{
     System.out.println("我叫"+name+",今年"+age+"岁了。");
}
}

 

6.  成员变量和局部变量的区别

 

 

成员变量

局部变量

存放区域

对象的堆内存

栈内存

生命周期

伴随对象

伴随作用范围

作用范围

整个类

函数、语句中

初始化值

有默认初始化值

无默认初始化值

 

7.  对象内存结构

Carc1 = new Car();c1.color="blue";

Carc2 = new Car()

 

注意:

7.1  c1的颜色改变,但是Car类中初始化的颜色并不会改变,c2的初始仍然是red。就像图纸是不会变的,但是造出的汽车是可以有不同颜色的。

7.2  c1、c2都是对实体的引用变量,如果执行c2 = c1,那么c2也就指向了c1引用的实体。c2原来引用的实体因为没有被引用变量引用,就会被垃圾回收器回收。

8.  匿名对象

匿名对象是对象的简化形式。

匿名对象两种使用情况:1. 当对对象方法仅进行一次调用时;2. 匿名对象可以作为实际参数进行传递。


class Car
{
     String color = "red";
     int num = 4;
     public static void run()
     {
          System.out.println("function run is running!" );
     }
}
class CarDemo{
       public static void main(String[] args){
             //对对象方法仅进行一次调用时,就可以使用匿名对象
             new Car().run();
             //匿名对象可以作为实际参数进行传递
            show(new Car());
      }
       public static void show(Car c){
            c. num = 3;
            c. color = "black" ;
            System.out.println("function show is running!" );
            System.out.println(c.num + "..." + c. color);
      }
}

结果

     function run is running!

function show is running!

3...black

    注意:匿名对象调用成员变量(属性)无意义

 

9.  封装

9.1 定义:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

事实上,类、函数、框架、包都是封装的体现(对外隐藏了具体内容)。

9.2 封装的好处:

将变化隔离。

便于使用。

提高重用性。

提高安全性。

9.3 封装原则:

将不需要对外提供的内容都隐藏起来。

把属性都隐藏,提供公共方法对其访问。

9.4 私有(private)

private int age;//私有的访问权限最低,只有在本类中的访问有效。

注意:私有仅仅是封装的一种体现形式而已。

私有的成员:其他类不能直接创建对象访问,所以只有通过本类对外提供具体的访问方式来完成对私有的访问,可以通过对外提供函数的形式对其进行访问。

好处:可以在函数中加入逻辑判断等操作,对数据进行判断等操作。

属性是用于存储数据的,直接被访问,容易出现安全隐患,所以,类中的属性通常被私有化,并对外提供公共的访问方法。

一般有两个,规范写法:对于属性 xxx,可以使用setXxx(),getXxx()对其进行操作。

 

10. 构造函数

10.1特点

1、函数名与类名相同。
2、不用定义返回值类型。
3、没有具体的返回值,不能加return语句

10.2作用

    给对象初始化

10.3与一般函数的区别

一般函数

构造函数

创建对象才能调用

创建时调用,初始化

可以被调用多次

创建时只调用一次

有返回值类型

无返回值类型

 

 

 

 

 

一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。

如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。

多个构造函数是以重载的形式体现的。

 

11. 构造代码块

作用:给对象进行初始化

区别:对象一建立就运行,而且优先于构造函数执行。

构造代码块是给所有对象进行统一的初始化

构造函数是给对象的对象初始化。定义共性。


class Person
{
    private String name;
    private int age;
    //保留空参构造函数,避免继承时未重写发生异常
    Person(){}
    //提供新的构造函数,在初始化时赋值
    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    //构造代码块
{
        System.out.println("我叫"+name+",今年"+age+"岁了。");
    }
}

运行 Person p=new Person("小李",23);

结果:我叫null,今年0岁了。

因为构造代码块优先执行,此时对象还未初始化。

 

12. this关键字

this代表其所在函数所属对象的引用。换言之,this代本类对象的引用。  

当成员变量和局部变量重名,可以用关键字this来区分,this就是所在函数所属对象的引用。(参加上例People的构造函数)

简单说,哪个对象调用了this所在的函数,this就代表哪个对象。一般方法调用默认加this。

什么时候使用this关键字呢?
当在函数内需要用到调用该函数的对象时,就用this。

注意:

通过this在构造函数中调用其他构造函数的时候,只能定义在构造函数的第一行,

原因:必须先进行初始化,初始化中还有初始化,执行更细节的初始化。

 

13. static关键字

1、是一个修饰符,用于修饰成员变量和成员函数

2、被static修饰的变量,可以直接被类名调用

    即 类名.成员变量名

3、随着类的加载而加载,随着类的消失而消失。

    生命周期最长。

4、优先于对象存在。

5、成员变量和类变量的区别

 

成员变量

类变量(静态变量)

生命周期

跟随对象

跟随类

调用方式

只能是对象调用

可以用类名.调用

存储位置

堆内存的对象中,是特有数据

方法区,是共享数据

 

6、注意事项

静态方法只能访问静态成员

    静态方法中不可以定义this、super关键字

    好处:1、单独存储变量,节省空间

          2、可以直接被类名调用

弊端:1、生命周期过长。

2、访问出现局限性。(只能访问静态变量)

使用static关键字只要明确对象出现的先后顺序就可以解释以上问题。

7、静态什么时候使用

静态变量:

当分析对象中所具备的成员变量的值都是相同时,这时这个成员就可以被静态修饰。只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。

静态函数:

函数是否用静态修饰,就参考一点,就是该函数功能是否需要访问到对象中的特有数据。简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,但是非静态需要被对象调用。

如果没有访问特有数据的方法,该对象的创建是没有意义。

    8、主函数是静态的

 

14. 主函数

主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用。

主函数各部分分析:

public:代表着该函数访问权限是最大的。

static:代表主函数随着类的加载已经存在。

    void:主函数没有具体返回值。

    main:不是关键字,但可以被jvm识别。

    (String[] args):函数的参数,字符串类型的数组。

    args是arguments的意思,名称可变,但习惯args

 jvm在调用主函数是,传入的是new String[0]

 

15. 静态代码块

1、格式

Static{
         静态代码块的执行语句

}

2、随着类的加载而执行,只执行一次。

3、作用:给类进行初始化

4、静态代码块对应类的初始化

构造代码块对应对象的初始化

构造函数给对应对象进行初始化

5、静态代码块 只能访问静态成员

 

16. 对象的实例化过程

Personp=new Person(“张三”,20);

1、new的时候,找到Person.class,加载Person类

2、执行静态代码块,给Person.class进行初始化

3、在堆内存中开辟空间,分配内存地址

4、加载特有属性,属性默认初始化

5、显示初始化

6、构造代码块初始化

7、构造函数初始化

8、将内存地址付与栈内存中的对象p

 

17. 对象调用函数过程

Personp=new Person(“zhangsan”,20);

p.setname(“lisi”);

 

18. 静态工具类

将常用的操作方法定义成静态,可以随时调用。

为了避免创建对象,将构造函数设为私有。

 

19. 帮助文档

生成Java帮助文档:命令格式:javadoc –d 文件夹名 –auther –version *.java

/**     //格式

*类描述

*@author作者名

*@version版本号

*/

 

/**

*方法描述

*@param  参数描述

*@return  返回值描述

*/

 1、如果想把一个类进行文档化,该类必须是public的。

 2、私有的方法在文档中不会体现。

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值