八、面向对象(Object Oriented Peogramming)

1.1、什么是类

1.1.1类的定义

类就是类型,是数据类型的复合类型,是一个同时带有特征和行为的数据类型,是创建对象的模板。类是java语言的基本单位。

类修饰符 class 类名{

//类体

}

类内部调用自身方法时,注意不能形成死循环,否则出现栈溢出 ​ * 注意:如果局部变量名称和全局变量名称相同;使用时优先使用局部变量, ​ * 只有不存在此局部变量时才使用全部变量 ​ * ​ * 注意:在上述情况下,需要使用全局变量时,使用this关联全局表量既可

(1)类修饰符:

访问控制符:public或者不写(包访问权限)

其他修饰符:abstract、final

(2)类名:合法的标识符,首字母大写

(3)类体:

成员变量:如:int score

静态成员变量,如:static int num

普通方法: void printSelf(){}

静态方法: static void printNum(){}

构造方法: public Student(){}

初始化快:{}

静态初始化方法: static{}

内部类

注意:

1.一个Java文件中可以写多个类,但是编译后还是会生成多个.class文件

2.一个Java文件中最多只能有一个被public修饰的类,这个类的类名必须和Java源文件名保持一致

3.一个Java文件中如果只有一个类,并且这个类不用public修饰的话,类名和文件名可以不一样,但习惯上,我们都会写上public

1.1.2成员变量的定义

成员变量:作为类的成员存在的变量,也被称为属性。分为静态(static)成员变量和非静态成员变量,在静态方法中只能访问静态成员变量,在非静态方法中可以访问非静态成员变量和静态成员变量

类修饰符 class 类名{

成员变量修饰符 变量类型 变量名称;

}

成员变量修饰符:

访问控制符: public、protected、包(默认)、private

其他修饰符: static、final

final:如果成员变量的修饰符中有final,表示该成员变量只可以被赋值一次,可以在变量声明处或者构造函数中初始化。

成员变量与局部变量的区别:

1.定义的位置不同

o成员变量:定义于类中,作用于整个类

o局部变量:定义于方法或者语句块中,作用于该方法或皆该语句。

2.内存中出现的时间和位置不同

成员变量:当对象被创建时,出现在堆内存当中。

局部变量:所属的区间被运算时,出现在栈内存当中。

3.生命周期不同

成员变量:随着对象的出现而出现,随着对象的消失而消失。

局部变量:随着所属区间运算结束,它就被释放。

4.初始化值不同

成员变量:成员变量因为在堆内存当中,所以他有默认的初始值

局部变量:没有默认的初始值

5.成员变量和局部变量名字相同,局部变量优先级高。就近原则。

成员变量与静态成员变量的区别:

1.内存中出现的时间和位置不同 成员变量:当对象被创建时,出现在堆内存当中。

静态成员变量:类被加载时静态变量出现在方法区。

2.生命周期不同 成员变量:随着对象的出现而出现,随着对象的消失而消失。

静态成员变量:类信息被回收时,静态成员变量消失。

1.1.3.类中方法的定义

方法必须作为类的成员出现。分为静态方法和非静态方法,在静态方法中只能调用静态方法,在非静态方法中可以调用非静态方法和静态方法

1.静态能访问静态的,不能直接访问非静态的,如果要访问,必须要创建对象。

⒉.非静态的能直接访问非静态的和静态的。

3.如果要访问另外一个类中的静态成员变量和静态方法:类名.静态成员变量][类名.静态方法名

1.1.4对象的创建以及内存分析

类是对象的抽象(模板),对象是类的具体实现

1.1.4.1对象的创建

对象的创建过程也被称为对象的实例化过程

new 类名();

1.1.4.2类引用型变量

通过一个变量记录对象的地址,从而多次使用这个对象

类名 变量名;//声明

类名 变量名 = new 类名();//声明、初始化

通过引用行变量适用对象:

调用属性: 对象名、属性名

调用方法: 对项目、方法名(实参)

注意:引用型变量作为方法参数和返回值,规则同数组作为方法参数和返回值

1.1.4.3JVM内存布局

程序运行时,JVM会按区域来使用内存,主要的内存空间:

 

1.栈空间:

在运行过程中,每当调用进入一个Java方法,Java 虚拟机会在Java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且Java虚拟机不要求栈帧在内存空间里连续分布。当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前栈帧,并将之舍弃。栈空间时线程私有的。

2.堆空间

Java堆在虚拟机启动的时候建立,它是JVM管理的最主要也是最大的内存工作区域。几乎所有的Java对象实例都存放在Java堆中。GC主要关注的就是这块空间的回收。

3.方法区

用于存储已被虚拟机加载的类信息、即时编译的代码等数据

1.1.4.3JVM内存分配

1.执行解析1

o第一次使用到类时,会将类的信息加载到方法区

o Student s1;在栈空间中创建一个引用型变量,可以存储指向对象的引用

o new Student();在堆空间分配一个空间,其中成员变量的值为默认值

 

⒉.执行解析2

o通过s1找到堆空间的name空间,然后赋值

o通过s2找到堆空间的name空间,然后赋值

 

3.执行解析3

类中如果有static修饰的成员变量,则创建的对象不包括该成员变量,静态成员变量属于类,只有一份

注意:字符串常量池、静态成员变量、符号引用在JDK1.7以后已经移动到了堆中。途中为了便于理解。 o s1.num、s2.num使用的都是类中的同一个num,该num位于方法区

 

4.执行解析4

对象数组,其实就是一个引用数组

 

5.执行解析5

对象数组的元素可以指向对应的对象

 

6.执行解析6

多个引用型变量可以指向一个对象。当不需要某个对象时可以将所有执行该对象的引用型变量赋值为null。当一个对象没有引用型变量指向的时候,GC会在适当的时候回收这个对象。

 

总结:

1.静态成员变量的使用静态成员变量和方法都隶属于类,可以通过引用型变量访问,但是最好使用类名.属性的语法来使用。

2.静态方法的使用

只要类被加载到方法区,静态方法就可以被调用(类名.方法名()),但是在静态方法中不能直接使用非静态的东西。

1.1.5构造方法的定义

1.1.5.1构造方法的定义

构造方法也叫构造器,是指当实例化一个对象(创建一个对象)的时候,由JVM自动调用的方法。主要完成对象的初始化。

访问修饰符 类名(参数列表){

//方法体

}

1.构造方法没有返回值类型,构造方法是在实例化对象的过程中自动调用的。

2.如果不写构造方法,系统会默认为我们提供一个无参的构造方法,如果添加了任意一个构造方法,系统不再提供默认的构造方法。

1.1.5.2构造方法的调用

new 类名(【参数列表】);

自动调用无参的构造方法

1.1.5.3构造方法与普通方法的区别

1.构造方法是在创建对象的过程中自动调用的,普通方法只能手动进行调用

⒉构造方法没有返回值类型,普通方法的返回值类型要么是确定的类型,要么为void

3.系统会默认为我们提供一个无参的构造方法,普通方法只能手动添加

4.构造方法的方法名称必须和对应的类名保持一致

5.构造方法在创建对象的过程中就会执行,而且每个对象只执行一次,对于普通方法而言,只有在需要使用的时候才被执行,并且一个对象可以调用多次

1.1.5.4构造方法的重载

构造方法可以没有参数,无参的构造方法称为默认构造方法。构造方法也可以有参数,如果一个类总有多个构造方法,则构造方法形成了重载。

1.1.5.5匿名代码块

成员变量可以在声明的位置或者构造方法中初始化,静态成员变量也可以在声明的位置初始化,但是如果初始化逻辑比较复杂,则可以通过静态初始化块实现。

局部代码块:声明在方法中的代码块,执行时机与声明位置相关,提前释放变量。(了解)

动态代码块:又称构造代码块或实例代码块,声明在类体中的代码块,创建对象时自动执行一次,每创建一个对象就执行一次动态代码块。初始化工作。(了解)

静态代码块:使用static关键字修饰的动态代码块,在类加载时自动执行,并只执行一次。(记住)

1.1.6面向对象

1.1.6.1什么是面向对象

面向对象是指一种程序设计的方式。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,更利于用人理解的方式对复杂系统进行分析、设计与编程

面向对象优势:

1.模块化:可以独立于其他对象的源代码编写和维护对象的源代码。一旦创建,对象就可以轻松地在系统内部传递。

⒉信息隐藏:通过仅与对象的方法交互,其内部实现的细节仍然隐藏。

3.代码重用:如果对象已存在,则可以在程序中使用该对象。这允许实现/测试/调试复杂的,特定于任务的对象,然后您可以信任这些对象在您自己的代码中运行。

4.可插拔性和调试简便性:如果某个特定对象有问题,只需将其从应用程序中删除,然后插入另一个对象作为替代对象。这类似于解决现实世界中的机械问题。如果螺栓断裂,则更换它,而不是整个机器。

1.1.6.2什么是面向对象

“面向过程"(Procedure Oriented)是一种以过程为中心的编程思想。面向过程求解问题的基本策略是从功能的角度审视问题域。它将应用程序看成实现某些特定任务的功能模块,其中子过程是实现某项具体操作的底层功能模块。在每个功能模块中,用数据结构描述待处理数据的组织形式,用算法描述具体的操作过程。

1.1.6.3面向对象与面向过程

两种编程思想的比较:

1.面向过程(c)就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

⒉面向对象(C++,java)是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会体现出一定优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。面对日趋复杂的应用系统,这种开发思路在就有很大局限性了。对比面向过程,面向对象的方法主要是把事物给对象化,对象包括属性与行为。程序由各种独立而又互相调用的对象的构成。

 

1.1.7this关键字

this:表示当前对象的引用。主要用于区分重名的变量(参数和成员变量)和方法(父子类),以及在构造方法中调用其它构造方法

注意: this调用构造方法只能是构造方法的第一条语句,this调用在同一个构造方法中只能出现一次

this关键字

1、 this表示当前类本身 *2、this可以关联当前类中的全局变量 *3、this可以关联当前类的方法 *4、this可以调用当前类的构造方法(在构造函数中) *5、this关键字只能在当前类或者本类中使用

static关键字

1、被static修饰的方法和属性可以使用类名称直接调用(关联);

例子:JingTai.he(); JingTai.name = " 静态";

2、被static修饰的方法和属性将被加载到内存的静态域中,此方法或变量将被所有对象共用

3、被static修饰的方法只能调用其他被static修饰的方法或变量(属性)

4、被static修饰的方法或属性(变量)将被优先加载

5、static不能修饰类

1.1.8关键知识点默写

1.类就是类型,

是数据类型的复合类型,是一个同时带有特征和行为的数据类型,是创建对象的模板

⒉.类的定义:

类修饰符 class 类名 {

static 数据类型 成员变量名;

数据类型 成员变量名;

static{

}

{

}

访问控制符 类名(){

}

方法修饰符(访问控制符、static、final) 返回值类型 方法名(参数列表) [异常声明 列表]{

}

}

3对象的创建

new 构造方法

new 构造方法(【参数列表】}

4.引用型变量,

通过一个变量记录对象的地址,从而多次使用这个对象。

类名 变量名;//声明

类名 变量名 = new 类名();//声明、初始化

通过引用行变量使用对象:

调用属性

对象名、属性名

调用方法

对象名、方法名(实参)

5.JVM的基本内存布局及分配过程

栈:方法运行过程中的局部变量

对:对象

方法区:类信息

6.this关键字:表示当前对象的引用

this.属性
​
this.方法

this();//调用其他的构造方法

1.1.9常见面试题

1.什么是面向对象?面向对象和面向过程的区别是什么

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

  • 面向过程

    • 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源。比如,单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,性能是最重要的因素。

    • 缺点:没有面向对象易维护、易复用、易扩展。

  • 面向对象

    • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。

    • 缺点:性能比面向过程低。

⒉构造方法与普通方法之间的区别

\1. 构造方法是在创建对象的过程中自动调用的,普通方法只能手动进行调用

\2. 构造方法没有返回值类型,普通方法的返回值类型要么是确定的类型,要么为void

\3. 系统会默认为我们提供一个无参的构造方法,普通方法只能手动添加

\4. 构造方法的方法名称必须和对应的类名保持一致

\5. 构造方法在创建对象的过程中就会执行,而且每个对象只执行一次,对于普通方法而言,只有在需要使用的时候才被执行,并且一个对象可以调用多次

3.this关键字的作用以及使用

this:表示当前对象的引用。主要用于区分重名的变量**(参数和成员变量)和方法(父子类),以及在构造方法中调用其它构造方法

this调用构造方法只能是构造方法的第一条语句,this调用在同一个构造方法中只能出现一次

1.1.10补充

1、类内部调用自身方法时,注意不能形成死循环,否则出现栈溢出

 * 注意:如果局部变量名称和全局变量名称相同;使用时优先使用局部变量,
 * 只有不存在此局部变量时才使用全部变量
 * 
 * 注意:在上述情况下,需要使用全局变量时,使用this关联全局变 量既可

2、使用对象时,默认使用对象的toString方法提供的返回值,如果本类没有toString方法,则使用父类的,没有指定父类,则使用object类

3、1、JRE在创建时,会默认为当前类创造一个无参函数 *注意 : 当在本类中创建了构造函数,则JRE将不会再添加无参构造函数。 *2、构造函数的结构:没有返回值类型 ;名称与类名称必须一致 ;参数列表;代码块(方法体、函数体); *3、执行时机:创建对象时调用,new的时候调用 *4、构造函数可以重载 *5、调用:this("Kitty");,此为调用只有一个String类型参数的构造函数。

构造函数可以调用普通方法
  • 构造函数之间可以相互调用 ​ *注意:调用构造函数时,必须在当前构造函数的第一行

  • 衍生:一个构造函数只能调用一次另外一个构造函数 ​ *注意:普通方法不能调用构造函数 ​ *注意:构造函数之间调用时,不能形成死循环

4、执行顺序 * 普通方法 代码块 执行顺序 静态块 * *普通方法< 构造函数<代码块<静态块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新手菜鸟大白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值