Java程序设计类与对象的基本概念(上)
Posted BkbK-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java程序设计类与对象的基本概念(上)相关的知识,希望对你有一定的参考价值。
类与对象的基本概念(上)
文章目录
一、面向对象的基本概念
(1)面向对象程序设计&结构化程序设计
1.结构化程序设计
- 通常由若干个程序模块组成,每个程序模块都可以是子程序或函数
- 数据和功能分离,代码难于维护和复用
2.面向对象程序设计
- 基本组成单位是类
- 程序在运行时由类生成对象,对象是面向对象程序的核心
- 对象之间通过发送消息进行通信,互相协作完成相应功能
(2)面向对象方法的特性
1.抽象
- 忽略问题中与当前目标无关的方面
- 只关注与当前目标有关的方面
2.封装
封装是一种信息隐蔽技术
- 利用抽象数据类型将数据和基于数据的操作封装在一起
- 用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的
- 封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象
3.继承
基于已有类产生新类的机制
- 是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的子类(也称为派生类);
- 在继承过程中子类继承了超类的特性,包括方法和实例变量;
- 子类也可修改继承的方法或增加新的方法;
- 有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量。
Java语言仅支持单继承:
• 单继承: 一个子类只有单一的直接超类。
• 多继承:一个子类可以有一个以上的直接超类。
4.多态
- 超类及其不同子类的对象可以响应同名的消息,具体的实现方法却不同;
- 主要通过子类对父类方法的覆盖来实现。
(3)类与对象的关系
类是对一类对象的描述, 对象是类的具体实例。
1.类的定义
- 将属性及行为相同或相似的对象归为一类
- 类可以看成是对象的抽象,代表了此类对象所具有的共有属性和行为
- 在面向对象的程序设计中,每一个对象都属于某个特定的类
2.对象的定义
- 现实世界中
- 万物皆对象
- 都具有各自的属性,对外界都呈现各自的行为
- 程序中
- 一切都是对象
- 都具有标识 (identity), 属性和行为(方法)
- 通过一个或多个变量来保存其状态
- 通过方法(method) 实现他的行为
二、类与对象的创建
(1)类的声明
[public] [abstract | final] class 类名称
[extends 父类名称]
[implements 接口名称列表]
{
数据成员声明及初始化;
方法声明及方法体;
}
class
: 表明其后声明的是一个类。extends
: 如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后implements
: 如果所声明的类要实现某些接口,那么,接口的名字应写在implements之后public
: 表明此类为公有类abstract
: 指明此类为抽象类final
: 指明此类为终结类
(2)对象的声明与创建
对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new创建对象时,会调用构造方法初始化对象。
-
对象引用声明
声明一个引用变量时并没有生成对象,引用变量可以被赋以空值
类名 引用变量名;
-
对象的创建
new关键字返回一个对象的引用
new <类名>(构造函数参数)
三、数据成员与方法成员
(1)数据成员
表示对象的状态 ,可以是任意的数据类型(简单类型,类,口,数组等)
1.数据成员声明
[public | protected | private]
[static][ final][transient] [volatile]
数据类型 变量名1[=变量初值], 变量名2[=变量初值], … ;
▫ public
、protected
、private
为访问控制符。
▫ static
指明这是一个静态成员变量(类变量)。
▫ final
指明变量的值不能被修改。
▫ transient
指明变量是不需要序列化的。
▫ volatile
指明变量是一个共享变量。
2.数据成员类型
一个类可以包含以下类型变量:
-
局部变量:
在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
-
成员变量(实例变量):
成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 没有
static
修饰的变量(数据成员)称为实例变量; - 存储所有实例都需要的属性,不同实例的属性值可能不同;
- 可通过下面的表达式访问实例属性的值
<实例名>.<实例变量名>
- 没有
-
类变量(静态变量):
类变量也声明在类中,方法体之外,但必须声明为 static 类型。
-
用
static
修饰。 -
在整个类中只有一个值,为该类的所有对象共享
-
类初始化的同时就被赋值。
-
适用情况
- 类中所有对象都相同的属性。
- 经常需要共享的数据。
- 系统中用到的一些常量值。
-
引用格式
<类名 | 实例名>.<类变量名>
(2)方法成员
1.方法的声明
[public | protected | private]
[static][ final][abstract] [native] [synchronized]
返回类型 方法名([参数列表]) [throws exceptionList]
{
方法体
}
public
、protected
、private
控制访问权限。static
指明这是一个类方法(静态方法)。final
指明这是一个终结方法。abstract
指明这是一个抽象方法。native
用来集成java代码和其它语言的代码。synchronized
用来控制多个并发线程对共享数据的访问。
返回类型 :
- 方法返回值的类型,可以是任意的Java数据类型;
- 当不需要返回值时,返回类型为void。
参数类型 :
- 简单数据类型、引用类型(数组、类或接口);
- 可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数。
方法体:
- 方法的实现;
- 包括局部变量的声明以及所有合法的Java语句;
- 局部变量的作用域只在该方法内部。
throws exceptionList
- 抛出异常列表。
2.参数传递
- 值传递:参数类型为基本数据类型时
- 引用传递:参数类型为对象类型或数组时
可变长参数:
static double maxArea(Circle c, Rectangle... varRec) {
Rectangle[] rec = varRec;
for (Rectangle r : rec) {
//…
}
}
- 可变长参数使用省略号表示,其实质是数组。
- 对于具有可变长参数的方法,传递给可变长参数的实际参数可以是零个到多个对象。
3.实例方法和类方法
①实例方法
表示特定对象的行为, 声明时前面不加static
修饰符
-
实例方法调用
给对象发消息,使用对象的某个行为/功能:调用对象的某个方法。
<对象名>.<方法名>([参数列表])
<对象名>为消息的接收者。
②类方法
表示类中对象的共有行为,也称为静态方法,声明时前面需加static
修饰,不能被声明为抽象的。
-
类方法的调用
可以类名直接调用,也可用类实例调用。
<对象名>.<方法名>([参数列表])
<类名>.<方法名>([参数列表])
四、包
包是一组类的集合,一个包可以包含若干个类文件,还可包含若干个包
(1)包的作用
- 将相关的源代码文件组织在一起。 (把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。)
- 类名的空间管理,利用包来划分名字空间可以避免类名冲突。 (如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。)
- 提供包一级的封装及存取权限。(包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。)
(2)包的命名
- 每个包的名称必须是“独一无二”的。
- Java中包名使用小写字母表示。
命名方式建议:
- 将机构的Internet域名反序,作为包名的前导;
- 若包名中有任何不可用于标识符的字符,用下划线替代;
- 若包名中的任何部分与关键字冲突,后缀下划线;
- 若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线。
(3)Java编译单元
- 一个Java源代码文件称为一个编译单元,由三部分组成:
- 所属包的声明(省略,则属于默认包);
- Import (引入)包的声明,用于导入外部的类;
- 类和接口的声明。
- 一个编译单元中只能有一个public类,该类名与文件名相同,编译
单元中的其他类往往是public类的辅助类,经过编译,每个类都会
产一个class文件。
(4)包的声明
- 1.命名的包(Named Packages)
-
其他的一个源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。
-
包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
-
例如: package Mypackage;
-
- 2.默认包(未命名的包)
- 如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
- 不含有包声明的编译单元是默认包的一部分。
注:
• 包名就是文件夹名,即目录名;
• 目录名并不一定是包名;
(5)包的引入
为了使用其它包中所提供的类,需要使用import语句引入所需要的类。
Java编译器为所有程序自动引入包java.lang。
1.import 关键字
import package1[.package2…].(classname|*);
- package1[.package2…]表明包的层次,对应于文件目录;
- classname指明所要引入的类名;
- 如果要引入一个包中的所有类,可以使用星号(*)来代替类名。
2.静态引入
如果在程序中需要多次使用静态成员,则每次使用都加上类名太繁
琐。用静态引入可以解决这一问题
-
单一引入是指引入某一个指定的静态成员,例如:
import static java.lang.Math.PI;
-
全体引入是指引入类中所有的静态成员,例如:
import static java.lang.Math.*;
以上是关于Java程序设计类与对象的基本概念(上)的主要内容,如果未能解决你的问题,请参考以下文章