JavaSE面向对象的三大特征(上)---封装

  • 面向对象的三大特征:

1. 封装性:所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或 者对象操作,对不可信的进行信息隐藏。简而言之就是,内部操作对外部而言不可见(保护性) 。

2. 继承性:继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对 这些功能进行扩展。

3. 多态性(*):所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内 部结构的对象可以共享相同的外部接口。 

  • 类与对象的定义与使用

类:指的是共性的概念,而对象是一个具体的,可以使用的事物。

首先先有类(类是生产对象的蓝图),然后才可以产生对象。对象所具有的所有行为与属性,一定是在类中进行了完整的定义。

类中的组成:

a.方法(操作的行为)

b.属性(操作的数据,每个对象应该具有的特征)

范例:定义Person类

此时,方法不再由主类直接调用,而需要由对象调用。

实例化Person类对象:

此时,就可以通过对象调用Person类中的方法。

实例化对象应该注意,只要出现了new关键字,就开辟了内存。

 

  • 对象内存分析

我们可以简单的将java中的内存区域分为栈内存堆内存两块区域(实际Java内存区域的划分远比这个复杂)

1. 栈内存(虚拟机局部变量表):存放的是局部变量(包含编译期可知的各种基本数据类型、对象引用-即堆 内存的地址,可以简单的理解为对象的名称),Java栈是与线程对应起来的,每当创建一个线程,JVM就会 为这个线程创建一个对应的Java栈。

2. 堆内存:保存的是真正的数据。即对象的属性信息。

分析如下代码:

上面已经讲过了,只要出现了关键词new,表明在堆上分配了内存并且产生了Person类的对象per引用这部分内存

内存图如下:

通过per引用设置堆中属性值,内存图如下:

对象(引用数据类型)必须在实例化后调用,否则会出现NullPointerException(运行时异常)。如若出现此类异常,根据出错位置查看引用类型变量是否初始化。

  • private实现封装处理

让内部操作对外部不可见(在类的外部不能直接使用对象来操控属性),可以用private对属性进行封装,称为类的私有属性

封装上述Person类中的属性:

JAVA规范:所有私有属性要想访问与设置内容,提供对应的getter与setter方法。

getter方法:取得属性内容。

setter方法:进行属性内容的设置与更改。

 

类的设计原则:

a.类中的所有属性必须使用private封装。

b.属性若要被外部访问,必须定义相应的getter与setter方法。

 

  • 构造方法

所谓的构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。

对于构造方 法的定义,也需要遵循以下原则

1. 方法名称必须与类名称相同

2. 构造方法没有返回值类型声明

3. 每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)

注意:构造方法方法名和类名一致,没有返回值类型  !!!!

可以使用构造方法初始化对象,避免多次调用setter( )方法。

 

构造方法的重载:参数类型或个数不同

建议:若干构造方法,按照参数个数升序或降序。

 

  • this关键字

a.this调用本类属性

this.属性名   明确表示调用类中同名属性

分析以下代码:

通过以上代码我们发现,当参数与类中属性同名时,类中属性无法被正确赋值(就近原则)。

此时我们加上this关键字便可以正 确给对象属性赋值。

规范:在类的普通方法中访问本类属性,一定要加this关键字

b.this调用本类方法

调用普通方法:  this.方法名称(参数)

调用构造方法:  this(参数)

    (1)this调用本类其他构造方法必须放在首行调用   ---编译期语法错误

    (2)this调用构造方法不允许成环  ---编译期语法错误

构造方法可以互相调用(在满足上述两个条件的基础上)

c.this表示当前对象

同样的方法,调用对象不同,输出结果也不同,this代表的是当前的对象。

  • static关键字(!!!)可以修饰属性和方法。

static修饰属性(内部属性)

描述共享属性,只需在属性前添加static关键字即可 。

static属性又称为类属性,保存在全局数据区的内存之中,所有对象都可以进行该数据区的访问。

此时,如果我们修改了country属性值,则Person类所有的对象的country属性都被改变

结论:

1.访问static属性(类属性)应使用类名称.属性名

2.所有的非static属性(实例变量)必须在对象实例化后使用,而static属性(类属性)不受对象实例化控制

 

static修饰方法(类方法)   使用static定义的方法,直接通过类名称访问。

关于static方法有以下两点说明:

1. 所有的static方法不允许调用非static定义的属性或方法 (因为被static修饰的方法与对象无关,直接通过类名调用,而非static修饰的属性或方法与对象强相关)。

2. 所有的非static方法允许访问static方法或属性。 使用static定义方法只有一个目的:某些方法不希望受到类的控制,即可以在没有实例化对象的时候执行。

 

猜你喜欢

转载自blog.csdn.net/Sun_GLL/article/details/83994504
今日推荐