关于java基础知识的归档整理(四)——面向对象 1

 

第一、   面向对象概述

 

一、概述。

面向对象是相对面向过程而言的;

面向对象和面向过程都是一种思想。

面向对象:将功能封装进对象,强调具备功能的对象;面向对象是基于面向过程的

面向对象的特点

1、是一种符合人们思考习惯的思想

2、可以将复杂的问题简单化

3、将程序员从执行者转换为指挥者

4、完成需求时:

a、首先找寻具有所需功能的对象来用;b、如果该对象不存在,那么就创造一个具有所需功能的对象;

c、这样简化并提高复用性

 

二、 面向对象开发、设计、特征

1、开发过程:其实就是不断的创建对象、使用对象、指挥对象做事情

2、其设计的过程:其实就是在管理和维护对象之间的关系

3、面向对象的特征:

封装(encapsulation)

继承(inhertance)

多态(polymorphism)

 

类与对象的关系

 

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

b、java描述事物是通过类来体现,类是具体事物的抽象概念上的定义

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

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

 

对于同一类事物可以抽取他们的共性内容定义在类中,如生活中的汽车,每一台车都有轮胎数和颜色

那么在通过java描述汽车这类事物是,就可以将这两个共性属性作为类中的属性定义

通过该类建立的每一个汽车实体都具有该类属性,并可以有对象特有的属性值

 

类的定义

生活中描述事物无非就是描述事物的属性和行为,如:人的身高、体重等属性,有说话、打球等行为

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

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

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

小结:定义类其实就是定义类中的成员(成员变量和成员函数)

 

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

成员变量

a、成员变量定义在类中,在整个类中都可以被访问

b、成员变量随着类的建立而建立,存在于对象所在的堆内存中

c、成员变量有默认的初始化值

局部变量

a、局部变量只定义在局部范围内,如:函数内,语句内等

b、局部变量存在于栈内存中,作用的范围结束,变量空间就会释放

c、局部变量没有默认的厨初始化值

 

简单理解:凡是定义在方法内的变量全是局部变量

 

关键字new

只要是new操作符定义的实体就会在堆内存中开辟一个新的空间

并且每一个对象都有一份属于自己的初始化值
 

通过    对象.对象成员  的操作方式来操作对象中的成员,对其中一个对象的成员进行修改,和另一个对象没有关系

 

匿名对象

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

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

 

需要注意的是:凡是简化的,必然有其局限性;对于匿名对象的使用,当对象需要调用多次方法时,不可以简化成匿名对象

第二、  面向对象的思想

一、封装(encapsulation)

封装是指隐藏对象的属性和实现细节,仅对外提供访问方式

好处:a、将变化隔离

b、便于使用

c、提高重用性

d、提高安全性

封装的原则:

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

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

表现:

1、函数就是一个最基本的封装体

2、类其实也是一个封装体

总结:
类中不需要对外提供的内容都私有化,包括属性和行为。


selectSort(int[] arr)
{
swap(
}


bubbleSort(int[] arr)
{
swap(
}


private swap(int[] arr,int a,int  b)
{

}


重点:以后再描述事物,属性都私有化,并提供setXxx getXxx方法对其进行访问。★★★★

记住:对变量的访问操作有两个动作:赋值(设置 set),取值(获取 get)
所以,对私有的变量访问的方式就是 set变量  get变量--> setAge  getAge

而私有也仅仅是封装的体现形式而已

 

构造函数

 

作用:就是为了给对象进行初始化

需求:为了描述事物更准确,发现事物对应的很多对象一创建时,
就有了,一些初始化的数据。在类中该如何完成的。


通过Java中的另一个小技术完成:就是构造函数。对象本身就是构造出来,
构造时,需要做一些动作这些应该定义在函数内。


构造函数(Constructor)有什么用?可以对对象创建进行初始化。


构造函数怎么在代码中体现呢?
1,没有返回值类型。因为构造对象,创建完就结束,不需要结果。void也不要写,因为要有区别与一般函数。
2,构造函数名称和类名一致。
3,没有具体的返回值。
接下来,按照以上三点,在Person类中定义一个构造函数。
对象一创建就具备了姓名。
              

初始化一般分两步: a、默认初始化;b、构造函数初始化

 

类中有定义该构造函数吗?有的。只要定义一个类,该类中默认就有一个空参数的构造函数,是编译器编译时添加到class文件中

注意:如果在类中自定义了构造函数,那么默认的空参数构造函数编译器就不添加了。
原理:没有定义对象的初始化过程,编译器会添加一个默认的初始化过程。
如果定义了指定的对象初始化过程,默认的就不添加了。

构造函数的细节:
1,一个类中可以有多个构造函数,它们的存在是以重载的形式体现的。
2,构造函数中也是有return语句的,用于结束初始化动作的。
3,构造函数是否能被private修饰呢?能,作用:其他程序无法创建该类的对象。

发现了问题?
没有学习构造函数时,对象也创建出来了。那么该对象是否有被构造呢?或者说是否有调用构造函数呢?


是的。必须调用!
那么类中那个构造函数是什么呢?

 

构造函数的细节:
1,一个类中可以有多个构造函数,它们的存在是以重载的形式体现的。
2,构造函数中也是有return语句的,用于结束初始化动作的。
3,构造函数是否能被private修饰呢?能,作用:其他程序无法创建该类的对象

构造函数和一般函数的区别?
1,写法不一样。不重要。
2,运行上有差别,对象一创建就会调用对应的构造函数。
一般方法是对象创建后,才会调用所需的一般函数。
问:有了构造函数初始化姓名,那么还需要setName方法吗?
需要,因为对象创建后,如果需要对数据进行修改,可以通过set完成。
3,构造函数在对象创建时,仅调用一次(初始化动作只做一次,而且先执行)。一般方法可以被对象调用多次。

 

 

this关键字

 

当构造函数之间相互调用时,该如何解决呢?

构造函数是初始化时调用的,

给哪个对象初始化呢?通过this关键字来记录这一对象的地址,并通过this关键字来明确被初始化的对象

 

在构造函数中调用其他构造函数的格式:this(参数列表);就会调用对应的构造函数

class Person
{
private String name;
private int age;
Person()
{


}
//初始化姓名。
private Person(String n)
{

name = n;
}
//初始化姓名和年龄。既然有初始化姓名的动作。直接调用就可以了。
Person(String n,int a)
{

this(n);//调用一个字符串参数的构造函数。注意:调用其他构造函数的语句,
//必须定义在构造函数的第一行。原因:初始化动作要先执行。
// name = n;
age = a;
}



}


class PersonDemo3 
{
public static void main(String[] args) 
{
Person p = new Person("lisi",20);
Person p1 = new Person("lisi1",21);
}
}

 

小结:

this到底代表什么呢?

this就代表对象,哪个对象调用了this所在的函数,this就代表哪个对象

注意:调用其他构造函数的语句,必须定义在构造函数的第一行,原因是初始化动作要先执行

一个构造函数不能同时调用两个或两个以上的构造函数

 

this关键字的另一个作用:

可以用this标识哪个变量时成员变量,这个标识可以省略不写,但是当局部变量与成员变量同名是,必须用this来标识成员变量

 补充知识点:

结果是两种情况,数据类型为boolean;结果为三种情况时,数据类型为int

 

static关键字

创建对象就是为了产生实例,并对数据进行封装,当调用功能是却没有用到这些封装的数据,该对象的创建有意义吗?虽然可以编译运行,但是在堆内存中空间较为浪费

不建议创建对象,那该如何调用呢?

java中的解决方案是使用static关键字,这是一个成员修饰符

被static关键字修饰的方法除了可以被对象调用外,还可以被类名调用

 

不是所有的方法都定义静态

那什么时候需要将方法定义成静态的呢?

定义功能是,如果功能不需要访问类中定义的成员变量(非静态)时,该功能就用静态修饰

谁访问了对象的属性,谁就是非静态的

 

静态方法是使用注意事项:

1、静态方法不可以访问非静态成员,但是非静态可以访问静态成员,说明:静态的弊端是在于访问出现了局限性

2、静态方法中不允许出现this、super关键字

原因:

a、静态是随着类的加载而加载,随着类的消逝而消逝

b、静态优于对象存在,被对象共享

c、因为静态先存在于内存中,无法访问后来的对象中的数据,所以静态无法访问非静态,而且内部无法书写this

因为这时对象可能还不存在,this没有任何意义

 

注意:开发过程中,如果该功能是静态的,不要创建对象去调用,哪怕对象已经存在,也不要用对象去调用,而要用类名调用

 

 

静态变量和成员变量的区别:
1,所属范围不同。
静态变量所属于类,成员变量所属对象。
静态变量也称为:类变量;成员变量也称为实例变量。


2,调用不同。
静态变量可以被对象和类调用(一般都用类名调用)
成员变量只能被对象调用。


3,加载时期不同。
静态变量随着类的加载而加载。
成员变量随着对象的加载而加载。


4,内存存储区域不同。
静态变量存储在方法区中。
成员变量存储在堆内存中。

 

静态代码块:(面试题)

特点:随着类的加载而执行,仅执行一次

作用:给类进行初始化

静态变量有两次初始化:一次是默认初始化,一次是显示初始化

静态代码块,在静态变量显示初始化以后执行

static{  }

 

构造代码块

构造代码块只要创建对象就会被调用,给所有对象进行初始化,构造函数只给对应的对象针对性的初始化

优点:这里面可以定义不同构造函数共性的代码         {    }

不创建对象的情况下,构造代码块不执行

 

局部代码块

作用:可以控制局部变量的生命周期

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值