JavaSE基础-01-对象

来源:互联网 发布:图片设计软件 编辑:程序博客网 时间:2024/06/05 12:43

一.Java中的对象

1.1 对象的概念:

对象是将数据和操作数据的函数进行了封装。

1.2 成员变量和局部变量:

在对象中,变量分为成员变量(在类中定义)和局部变量(在方法中定义)

区别\分类 成员变量 局部变量 定义位置不同 成员变量直接定义在类中 局部变量定义在方法中,参数上,语句中 作用范围不同 成员变量在类范围中有效 局部变量只在自己所属的大括号内有效,大括号结束,局部变量的生命周期就结束 底层运行原理不同 成员变量存在于堆内存中,生命周期和对象的生命周期相同 局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放

1.3 构造函数:

用于给特定对象(和函数名称相同的对象)进行初始化,是函数中的一种。所有对象创建时,都需要初始化,初始化需要调用构造函数

public class Construct{    Construct(){        //初始化操作    }}

1.3.1 构造函数的特点:

  • 该函数的名称和所在类的名称相同(构造方法的方法名首字母大写)
  • 不需要定义返回值类型
  • 该函数没有具体的返回值

1.3.2 构造函数的使用:

1)一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。
2)一个类中,可以有多个构造函数,它们的函数名称都相同,参数不同。一个类中如果出现多个构造函数。它们的存在是以重载体现的。

1.3.3 构造函数和一般函数的区别:

区别\分类 构造函数 一般函数 格式不同 构造函数函数名和类名相同,不需要定义返回值 一般函数函数名和类名不相同,需要定义返回值 使用方式不同 构造函数是在对象创建时,就被调用,用于初始化,只执行一次 一般函数,是对象创建后,需要调用才执行,可以被调用多次

1.3.4 构造代码块

public class Construct{    {        //初始化操作    }}

没有参数,定义有构造代码块的类,创建对象并初始化时都需要调用构造代码块。而构造函数则只在参数对应的情况下在初始化时执行

1.4 创建对象的过程:

创建一个对象:

Person person = new Person();

1)先将硬盘上指定位置的Person.class文件加载进内存。
2)执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区空间中分配了一个变量person。
3)在堆内存中开辟一个实体空间,分配了一个内存首地址值。
4)在该实体空间中进行属性的空间分配,并进行了默认初始化。
5)对空间中的属性进行显示初始化。
6)进行实体的构造代码块初始化。
7)调用该实体对应的构造函数,进行构造函数初始化。
8)将首地址赋值给person ,person变量就引用了该实体。(指向了该对象)

1.5 static关键字

修饰符,用于修饰成员(成员变量和成员函数),静态修饰的数据可以被所有的对象调用。

1.5.1 静态成员:

1)被静态修饰的成员,可以通过类名调用,即:类名.静态成员(Person.name)
2)静态成员随着类的加载而加载,而且优先于对象存在。

1.5.2 static关键字使用时的注意事项:

静态方法只能访问静态成员,不可以访问非静态成员。因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。同理静态方法中不能使用this,super关键字来获取指定的对象

1.5.3 静态修饰的使用的条件:

1)成员变量

如果成员变量的数据所有对象都需要使用,那么该变量就需要被静态修饰,因为是共享的数据。

2)成员函数

如果函数内访问了对象中特有的属性数据,那该方法不能被静态修饰。

1.5.4 成员变量和静态变量的区别:

区别\分类 成员变量 静态变量 使用方式不同 成员变量在对象中使用,也称为实例变量。 静态变量在类之间使用,也称为类变量。 底层运行原理不同 成员变量存在于堆内存中 静态变量存在于方法区中 生命周期不同 成员变量的生命周期和对象相同 静态变量的生命周期和类相同 调用方式不同 成员变量只能被对象所调用 静态变量可以被对象调用,也用类名调用

1.5.5 静态代码块

一个有静态关键字标示的代码块区域,定义在类中。对类进行初始化。静态代码块随着类的加载而执行,而且只执行一次。如果和主函数在同一类中,优先于主函数执行(主函数也是静态的)。
静态代码块、构造代码块、构造函数同时存在时的执行顺序:静态代码块 > 构造代码块 > 构造函数

二.面向对象的特点—–封装

隐藏对象的属性和实现细节,对外提供公共的访问方式。达到将隐藏细节,提高重用性和安全性的目的。

2.1 成员的访问权限:

通过几个关键字实现权限控制:

1)private关键字:

将成员定义为私有,私有的访问权限最低,只有在本类中的方法才可以访问,其他类只有通过本类对外提供的访问方式来完成对私有属性的访问

2)public关键字:

将成员定义为共有,其他类和属性可以访问并更改该属性的值

三.面向对象的特点—–继承

提高了代码的复用性,让类与类之间产生了关系,是多态的前提。
父类:是由多个类不断向上抽取共性内容而定义的。

3.1 Java中的继承机制:

1)Java只支持单继承

C++支持多继承,但是多继承有安全问题的弊端

2)Java支持多重继承

Java支持多重继承因此出现了继承体系。体系中的顶层父类是通过不断向上抽取而来的。它里面定义的是该体系最基本的共性功能。
所以,一个体系要想被使用,直接查阅该系统中的父类的功能即可知道该体系的基本用法。使用一个体系时,需要建立对象。建议建立最子类对象(继承体系最下面的子类的对象),因为最子类不仅可以使用父类中的功能。还可以使用子类特有的一些功能。即对于一个继承体系的使用,先查阅顶层父类中的内容,创建最底层子类的对象使用。

3.2 继承体系中的成员:

3.2.1 成员变量

当子父类中出现一样的属性时(实际开发中基本不会遇到这种情况),子类类型的对象,调用该属性获取到的值是子类的该属性的值。
如果想要调用父类中的属性值,需要使用super关键字
this:代表是本类类型的对象引用。
super:代表是子类所属的父类中的内存空间引用。

3.2.2 成员函数。

当子父类中出现了相同的方法时,建立子类对象会运行子类中的方法。即父类中的方法被覆盖(复写,重写)了。当一个类的功能内容需要修改时,通过覆盖来实现。

3.2.3 构造函数。

子类对象在创建并初始化时,先调用父类的构造函数,再调用子类的构造函数。
子类的所有构造函数中的第一行,其实都有一条没有显示的语句super( ),调用父类的空参构造函数,如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。

3.3 继承的使用场合:

当类与类之间存在着所属关系时,才具备了继承的前提,不要仅仅为了获取其他类中的成员进行继承。

继承的方法覆盖

1)子类的方法覆盖父类的方法时,必须要保证,子类方法的权限必须大于等于父类方法权限
2)静态修饰的成员只能覆盖静态成员,或者被静态成员覆盖

继承的弊端

打破了封装性。对于一些类,或者类中私有的功能或属性,是需要被继承或者复写的,这些属性需要使用final关键字修饰

Final关键字

修饰符,可以修饰类,方法,变量。
被final修饰的类是一个最终类,不可以被继承。
被final修饰的方法是一个最终方法,不可以被覆盖。
被final修饰的变量是一个常量,只能赋值一次。

原创粉丝点击