Java--类与对象(上)

类与对象

1.面向对象编程:对现实生活的抽象

1.1 面向对象三大特征
封装:将客观事物封装为抽象的类,并且类可以将自己的数据与方法只对可信的类与对象开放,对不可信的进行隐藏。内部操作对外部而言不可见。(保护性)

继承:继承描述的是一种能力:可以使用现有类的所有功能,并在无须重新编写原有类的情况下进行功能上的扩展。要使用继承,必须满足is-a原则(代码复用)

多态:一个类实例的相同方法在不同情形下有不同的表现形式。

1.2 面向对象名词扩展
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象编程

2.类与对象的定义与使用

类指的是共性的概念(人类),而对象是类的一个具体的、可以使用的事物(赵丽颖)。

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

类中的组成:
属性:描述每个对象的具体特点
方法:操作的行为

2.1类的定义

扫描二维码关注公众号,回复: 5788558 查看本文章

类使用class定义

class 类名称 {
属性1;
属性2;
属性n…

方法1(){}
方法2(){}
方法n(){}...

}

类中定义的普通属性与方法不再由主类直接调用,而要通过该类的对象来调用。

产生对象语法:
类名称 对象名称 = new 类名称();
// 产生一个名为per的Person对象
Person per = new Person();

2.2 对象内存分析

栈内存:方法的局部变量、方法形参、引用

堆内存(所有方法共享此内存):数组对象、所有类的对象
当看见关键字new,一定在堆上开辟了新空间

对象的引用传递:多个栈内存指向同一块堆内存

2.3 对象的空指针问题

所有引用数据类型变量必须赋值后使用,否则会抛出NullPointerException(运行时异常)

3.private实现封装处理

若类中属性直接暴露给对象操作,存在不安全问题(由于对象可以直接操作类中属性,无法限制属性是否正常设置)。

使用private对属性做封装。

使用private修饰的属性或方法,表示该属性与方法只能在本类中直接使用,其他类无法直接使用private封装的属性或方法。

default权限(啥也不写)
class Person {
String name;
}
Person类与name属性都是default权限(包访问权限,在同一个源文件中都可以访问)

若private封装的属性要被类的外部访问,需要提供setter/getter方法

setter方法用于设置属性值

getter方法用于取得属性值

类的设计原则:
I.编写类时,所有属性必须使用private封装
II.属性若要被外部访问,必须定义相应的getter与setter方法

4.类的构造方法
定义:构造方法是在使用关键字new实例化新的对象时调用的方法

1.Person 2.per = 3.new 4.Person();

1:类名称

2:对象引用

3:在堆上开辟空间

4:构造方法(无参构造)

构造方法特征:
I.构造方法名称必须与类名称相同
II.构造方法没有返回值类型声明
// 命名不规范的普通方法,必须通过对象调用
public void Person(){}
// 无参构造,在对象产生时调用
public Person(){}

III.每个类中一定至少存在一个构造方法(若没有明确定义,系统会生成一个默认的无参构造;若明确定义了构造方法,系统不再生成无参构造)

构造方法作用:
为类中属性初始化,避免多次的setter调用。

构造方法重载:
参数个数不同

this关键字

I.this表示本类属性
程序的就近取用原则:

使用this.属性名称表示直接从类中寻找同名属性
在类中使用本类属性一定要加上this关键字

II.this表示本类方法
a.this表示构造方法
this(方法参数);
1.this调用本类构造方法必须写在构造方法首行
2.this调用构造方法不能成"环"

b.this表示本类普通方法
this.方法名称(方法参数);
若在本类中调用普通方法,一般将this加上(尤其是在有继承的情况下,使用this可以明确表示调用的是本类方法)

III.this表示当前对象
当前调用的属性或方法是通过哪个对象调用的,this就指代他。

static关键字:与对象无关!
I.修饰本类属性,称为静态属性(类属性),所有对象共享此属性值;
非static属性称为成员变量或对象属性,每个对象都有此属性且值都不一样。
要描述类似国家这种共享属性,可以使用static修饰属性。静态属性一般通过类名直接调用,所有该类对象共享此属性值。

II.修饰本类方法
使用static修饰方法,称为类方法,直接通过类名称调用,与对象实例化无关。

静态方法常见于工具方法。
eg:java.util.Arrays.sort();
System.arraycopy();

静态方法能否访问类中普通属性?一定不能
静态方法能否访问类中静态属性?一定可以

普通方法能否访问类中静态属性?一定可以

猜你喜欢

转载自blog.csdn.net/qq_43876267/article/details/88933299