Java

类声明与对象创建

1、类与对象的关系

  • 类是对一类对象的描述 ;
  • 对象是类的具体实例 。

2、类声明

1
2
3
4
5
6
7
8
[public] [abstract | final] class 类名称
[extends 父类名称]
[implements 接口名称列表]
{
//类体
数据成员声明及初始化;
方法声明及方法体;
}
  • class:表明其后声明的是一个类。
  • extends:如果所声明的类是从某一父类派生而来,那么类的名字应写在extends之后
  • implements:如果所声明的类要实现某些接口,那么名字应写在implements之后
  • public:表明此类为公有类
  • abstract: 指明此类为抽象类
  • final:指明此类为终结类

3、对象的声明与创建

  • 创建类的实例(对象),通过使用功能。

对象引用声明

语法:类名 引用变量名;

注意:声明一个引用变量时并没有生成对象。

对象的创建

语法:new 类名( [初始化参数] )

例如:

1
2
Clock aclock;			//对象引用声明
aclock = new Clock(); //对象创建

new的作用:

  • (运行时)在内存中为这一类型的对象分配内存空间
  • 返回对象的引用

注意:引用变量可以被赋空值(例如:aclock = null;

数据成员

  • 表示对象的状态
  • 用来存放在整个类的所有对象之间要共享的数据
  • 可以是任意的数据类型**(简单类型,类的对象,接口,数组等)**

1、数据成员声明

语法形式

1
2
3
[public | protected | private]
[static] [final] [transient] [volatile]
数据类型 变量名1[=初始值], 变量名2[=初始值], ……;

说明

  • publicprotectedprivate为访问控制符。
  • static指明这是一个静态成员变量(类变量)。
  • final指明变量的值不能被修改。
  • transient指明变量是不需要序列化的。(把整个对象序列化时会被忽略,适用于一些敏感数据,如密码等)
  • volatile指明变量是一个共享变量。

2、实例变量(属于对象的属性)

  • 没有 static 修饰的变量(数据成员)称为实例变量;
  • 存储所有实例都需要的属性,不同实例的属性值可能不同;
  • 可通过表达式 实例名.实例变量名 访问实例属性的值。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
//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);
}
}

输出结果:

1
2
Circle@28a418fc
r = 0

说明:

  • 对象的输出调用 toString(),默认的 toString() 返回:

    1
    2
    //对象名+@+对象的哈希(hash)码(转成十六进制的字符串)
    getClass().getName()+"@"+Integer.toHexString(hashCode());
  • 在Java中,数值类型的变量(数据成员),如果它没有被显式的初始化的话,会默认的初始化为0

3、类变量(静态变量)(为该类的所有对象共享)

  • static 修饰。

  • 在整个类中只有一个值。

  • 类初始化的同时就被赋值。

  • 适用情况:

    • 类中所有对象都相同的属性
    • 经常需要共享的数据。
    • 系统中用到的一些常量值
  • 引用格式:类名|实例名.类变量名

方法成员

分为实例方法类方法

  • 实例方法:用来表示每一个实例对象的功能或者行为。
  • 类方法:类的公共的、共同的行为或者功能。

1、语法形式

1
2
3
4
5
[public | protected | private]
[static] [final] [abstract] [native] [synchronized]
返回类型 方法名( [参数列表] ) [throws exceptionList]] {
方法体;
}
  • publicprotectedprivate 控制访问权限。
  • 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语句的格式:

    1
    import package1[.package2…].(classname | *);
    • package1[.package2…]表明包的层次,对应于文件目录
    • classname 指明所要引入的类名;
    • 如果要引入一个包中的所有类,可以使用星号(*)来代替类名。

6、静态引入

如果在程序中需要多次使用静态成员,则每次使用都加上类名太繁琐。用静态引入可以解决这一问题。

  • 单一引入是指引入某一个指定的静态成员,例如:

    1
    import static java.lang.Math.PI;
  • 全体引入是指引入类中所有的静态成员,例如:

    1
    import static java.lang.Math.*;

例:

1
2
3
4
5
6
7
import static java.lang.Math.PI; 
public class Circle {
int radius;
public double circumference() {
return 2 * PI * radius;
}
}