类声明与对象创建
1、类与对象的关系
- 类是对一类对象的描述 ;
- 对象是类的具体实例 。
2、类声明
[public] [abstract | final] class 类名称 [extends 父类名称] [implements 接口名称列表] { //类体 数据成员声明及初始化; 方法声明及方法体; }
class
:表明其后声明的是一个类。extends
:如果所声明的类是从某一父类派生而来,那么类的名字应写在extends
之后implements
:如果所声明的类要实现某些接口,那么名字应写在implements
之后public
:表明此类为公有类abstract
: 指明此类为抽象类final
:指明此类为终结类
3、对象的声明与创建
- 创建类的实例(对象),通过使用功能。
对象引用声明
语法:类名 引用变量名;
注意:声明一个引用变量时并没有生成对象。
对象的创建
语法:new 类名( [初始化参数] )
例如:
Clock aclock; //对象引用声明 aclock = new Clock(); //对象创建
new的作用:
- (运行时)在内存中为这一类型的对象分配内存空间
- 返回对象的引用
注意:引用变量可以被赋空值(例如:aclock = null;
)
数据成员
- 表示对象的状态
- 用来存放在整个类的所有对象之间要共享的数据
- 可以是任意的数据类型(简单类型,类的对象,接口,数组等)
1、数据成员声明
语法形式
[public | protected | private] [static] [final] [transient] [volatile] 数据类型 变量名1[=初始值], 变量名2[=初始值], ……;
说明
public
、protected
、private
为访问控制符。static
指明这是一个静态成员变量(类变量)。final
指明变量的值不能被修改。transient
指明变量是不需要序列化的。(把整个对象序列化时会被忽略,适用于一些敏感数据,如密码等)volatile
指明变量是一个共享变量。
2、实例变量(属于对象的属性)
- 没有 static 修饰的变量(数据成员)称为实例变量;
- 存储所有实例都需要的属性,不同实例的属性值可能不同;
- 可通过表达式
实例名.实例变量名
访问实例属性的值。
例如:
//Circle.java public class Circle { int radius; } //ShapeTester.java public class ShapeTester { public static void main(String[] args) { Circle c; c = new Circle(); System.out.println(c); System.out.println("r = " + c.radius); } }
输出结果:
Circle@28a418fc r = 0
说明:
对象的输出调用
toString()
,默认的toString()
返回://对象名+@+对象的哈希(hash)码(转成十六进制的字符串) getClass().getName()+"@"+Integer.toHexString(hashCode());
在Java中,数值类型的变量(数据成员),如果它没有被显式的初始化的话,会默认的初始化为0
3、类变量(静态变量)(为该类的所有对象共享)
用
static
修饰。在整个类中只有一个值。
类初始化的同时就被赋值。
适用情况:
- 类中所有对象都相同的属性。
- 经常需要共享的数据。
- 系统中用到的一些常量值。
引用格式:
类名|实例名.类变量名
方法成员
分为实例方法和类方法。
- 实例方法:用来表示每一个实例对象的功能或者行为。
- 类方法:类的公共的、共同的行为或者功能。
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
修饰符;
实例方法调用
给对象发消息,使用对象的某个行为或功能——调用对象的某个方法。
实例方法调用格式:
对象名.方法名([参数列表]);
对象名为消息的接收者。
参数传递
- 值传递:参数类型为基本数据类型时
- 引用传递:参数类型为对象类型或数组时
3、类方法(静态方法)
- 表示类中对象的共有行为
- 也称为静态方法,声明时前面需加
static
修饰。 - 不能被声明为抽象的。
- 可以类名直接调用,也可用类实例调用。
4、可变长参数
- 可变长参数使用省略号表示,其实质是数组。
- 例如,
String … s
表示String[] s
。 - 对于具有可变长参数的方法,传递给可变长参数的实际参数可以是零个到多个对象。
包
- 包是一组类的集合。
- 一个包可以包含若干个类文件,还可包含若干个包(子包)。
1、包的作用
- 将相关的源代码文件组织在一起。
- 类名的空间管理,利用包来划分名字空间可以避免类名冲突。
- 提供包一级的封装及存取权限。
2、包的命名
- 每个包的名称必须是“独一无二”的。
- Java中包名使用小写字母表示。
- 命名方式建议:
- 将机构的Internet域名反序,作为包名的前导;
- 若包名中有任何不可用于标识符的字符,用下划线替代;
- 若包名中的任何部分与关键字冲突,后缀下划线;
- 若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线。
3、编译单元
- 一个Java源代码文件称为一个编译单元,由三部分组成:
- 所属包的声明(省略,则属于默认包);
Import
包的声明,用于导入外部的类;- 类和接口的声明。
- 一个编译单元中只能有一个
public
类,该类名与文件名相同,编译单元中的其他类往往是public
类的辅助类(不加public
,成为缺省的类),经过编译,每个类都会产一个class文件(非public
的类也会生成class文件)。
4、包的声明
- 命名的包(Named Packages):例如
package Mypackage;
- 默认包(未命名的包):不含有包声明的编译单元是默认包的一部分。
5、包与目录
- 包名就是文件夹,即目录;
- 目录名并不一定是包;
6、引入包
为了使用其它包中所提供的类,需要使用import语句引入所需要的类。
Java编译器为所有程序自动引入包
java.lang
。import语句的格式:
import package1[.package2…].(classname | *);
package1[.package2…]
表明包的层次,对应于文件目录;classname
指明所要引入的类名;- 如果要引入一个包中的所有类,可以使用星号(*)来代替类名。
6、静态引入
如果在程序中需要多次使用静态成员,则每次使用都加上类名太繁琐。用静态引入可以解决这一问题。
单一引入是指引入某一个指定的静态成员,例如:
import static java.lang.Math.PI;
全体引入是指引入类中所有的静态成员,例如:
import static java.lang.Math.*;
例:
import static java.lang.Math.PI; public class Circle { int radius; public double circumference() { return 2 * PI * radius; } }