本页面更新日期: 2016年07月17日
前言
Java 是面向对象的程序设计语言, Java 语言提供了 定义类, 成员变量, 方法 等基本功能.
类 可以被认为是一种自定义的数据类型.
可以使用类来 定义变量,所有使用类定义的变量都是 引用变量.
它们将会引用到 类的对象.
类用于描述客观世界里 某一类对象的共同特征.
而对象则是 类的具体存在.
Java 使用 类的构造器 来创建该类的对象.
Java 也支持面向对象的三大特征: 封装/继承/多态
Java提供了 private / protected/ public 三个访问控制修饰符来实现良好的封装.
提供了 extends 关键字来让 子类继承父类.
子类继承父类就可以继承 父类的成员变量和方法.
如果访问控制允许, 子类实例可以直接调用 父类里定义的方法.
继承是实现类复用的重要手段.
使用继承关系来实现复用时, 子类对象可以直接赋值给父类变量.
这个变量具有 多态性, 会让编程更加灵活.
构造器用于对 类实例进行初始化操作. 构造器支持重载.
如果多个重载的构造器里包含了相同的初始化代码, 则可以把这些初始化代码放置在普通初始化块里完成.
在类初始化阶段被执行.
如果继承树里的某一个类需要被初始化时, 系统将会同时初始化该类的所有父类.
定义类
面向对象的程序设计过程中有两个重要概念: 类(class) 和 对象(object 也被称为实例, instance).
其中 类是某一批对象的抽象, 可以把类理解成某种概念.
对象 才时一个具体存在的实体.
从这个概念上来看, 日常所说的人, 其实都是人的实例, 而不是人类.
Java语言是面向对象的程序设计语言, 类和对象 是面向对象的核心内容.
Java语言提供了对 创建类和创建对象 的语法支持.
Java语言里定义类的简单语法如下:
[修饰符] class 类名
{
零到多个 构造器定义...
零到多个 成员变量...
零到多个 方法...
}
在上面的语法格式中, 修饰符可以是 public / final/ abstract 或者省略不写. (修饰符的作用以后我们再讲).
其中 类名 必需是由一个或多个有意义的单词连缀而成, 每个单词 首字母大写, 其它字母 全部小写.
单词与单词之间不要使用任何分隔符.
对于定义类而言, 可以包含三种最常见的成员: 构造器/成员变量/方法.
三种成员都可以定义 零个或多个. 如果三种成员都不写, 就是定义了一个空类, 这样没有实际意义.
类里面定义各成员的顺序可以随意, 各成员之间 可以相互调用.
但需要指出的是, 被 static 修饰的成员 不能访问没有 static 修饰的成员.
成员变量用于定义该类或该类的实例所包含的状态数据.
方法则用于定义该类或该类的实例的行为特征或功能实现.
构造器用于构造该类的实例.Java语言通过 new 关键词来调用构造器, 从而返回该类的实例.
构造器 是一个类创建对象的根本途径.
如果一个类没有构造器, 这个类通常无法创建实例.
因此, Java语言提供了一个功能: 如果程序员没有为一个类编写构造器.
则系统会为该类提供一个默认的构造器.
一旦程序员为类提供了构造器, 系统将不再为该类提供构造器.
定义成员变量的语法格式如下:
[修饰符] 类型 成员变量名 [默认值];
定义成员变量语法格式的详细说明如下:
- 修饰符: 可以省略, 也可以是 public/protected/private/static/final . 其中 public/protected/private 三个最多只能选一个出现, 不过可以与后面的 static/final 组合起来修饰成员变量.
- 类型: 类型可以是Java语言允许的任何数据类型, 包括之前说过的基本类型和现在介绍的引用类型.
- 成员变量名: 成员变量名应该由一个或多个有意义的单词连缀而成, 第一个单词首字母小写,后面每个单词首字母大写.例如: helloWorld .单词与单词之间不要使用任何分隔符.
- 默认值: 定义成员变量可以指定一个默认值, 也可以不写.
定义方法的语法格式如下:
[修饰符] 方法返回值类型 方法名(形参列表)
{
//由零条到多条 可执行性语句组成的方法体
}
定义方法语法格式详细说明:
- 修饰符: 可以省略, 也可以是 public/protected/private/static/final/abstract.其中 public/protected/private 三个最多出现一个. abstract 和 final 两者最多一个. 它们可以和 static 组合起来修饰方法.
- 方法返回值类型: 返回值类型可以是 Java语言允许的任何数据类型. 包括基本类型和引用类型; 如果声明了方法返回值类型, 则方法体内必需有一个有效的 return 语句, 该语句返回一个变量或表达式, 这个变量或者表达式的类型必需与此处声明的类型匹配. 除此之外, 如果一个方法没有返回值, 则必需使用 void 来声明没有返回值.
- 方法名: 方法名的命名规则与成员变量的命名规则相同.
- 形参列表: 形参列表用于定义该方法可以接受的参数, 形参列表由零组到多组[参数类型 形参名] 组合而成. 多组参数之间以英文逗号 , 隔开. 形参类型和形参名之间以英文空格隔开. 一旦在定义方法时指定了形参列表, 则调用该方法时必需传入对应的参数值–也就是说, 谁调用方法, 谁负责为形参赋值.
方法体里多条可执行语句之间有 严格的执行顺序 排在方法体前面的语句总是先执行.
static 是一个特殊的关键字, 它可以用于 修饰方法/成员变量等成员.
static 修饰的成员表明 它属于这个类本身 , 而不属于该类的单个实例.
因此通常把 static 修饰的成员变量和方法 称为类变量/类方法.
不使用 static 修饰的方法/成员变量 则属于该类的单个实例, 而不属于该类.
因此通常把不使用 static 修饰的成员变量和方法称为 实例变量/实例方法.
由于static的英文直译就是静态的意思.
因此有时也把 static 修饰的成员变量和方法称为静态变量和静态方法.
把不使用static修饰的成员变量和方法称为非静态变量和非静态方法.
静态成员不能直接访问非静态成员
定义构造器的语法格式
[修饰符] 构造器名(形参列表)
{
//由零条到多条 可执行语句组成的构造器执行体
}
定义构造器语法格式详细说明:
- 修饰符: 可以省略, 也可以是 public/protected/private 其中之一
- 构造器名: 构造器名字必需和类名相同
- 形参列表: 和定义方法形参列表的格式完全相同.
值得指出的是, 构造器既不能定义返回值类型, 也不能使用 void 声明构造器没有返回值.
如果构造器定义了返回值类型, 或者使用 void 声明构造器没有返回值. 编译虽然不会报错.
但 Java会把这个所谓的构造器当成方法来处理–它就不再是构造器.
现在, 结合之前的内容定义一个类
public class Person
{
//下面定义了两个成员变量
public String name;
public int age;
//下面定义了一个say方法
public void say(String content)
{
System.out.println(content);
}
}
上面的 Person类代码里没有定义构造器.
我们上面说过, 你没有定义, Java就会默认给一个构造器. 但是你肉眼是看不见的. 同时, 系统提供的构造器是没有任何参数的.
定义类之后, 接下来就可以使用该类了.
Java类的大致作用如下:
- 定义变量
- 创建对象
- 调用类的类方法或访问类的类变量
下面,先介绍使用类来定义变量和创建对象
对象的产生和使用
创建对象的根本途径是使用构造器.
通过 new 关键字来调用某个类的构造器即可创建这个类的实例.
上面我们写了一个 Person类 , 下面写一个 PersonTest 类
//使用Person类来定义一个Person类型的变量
Person p;
//通过 new 关键字调用 Person 类的构造器, 返回一个 Person 实例
p = new Person();
上面代码可以简写为如下形式:
//定义 p 变量的同时为 p 变量赋值
Person p = new Person();
创建对象之后, 就可以使用该对象了.
Java 对象大致有如下作用:
- 访问对象的实例变量
- 调用对象的方法
如果访问权限允许, 类里定义的方法和成员变量都可以通过类或实例进行调用.
类或实例访问方法或成员变量的语法是: 类.类变量/方法 或 实例.实例变量/方法
在这种方式中, 类或实例是主调者, 用于访问该类或该实例的成员变量或方法.
其中, static 修饰的方法和成员变量, 既可以通过类来调用, 也可以通过实例来调用.
而没有使用 static 修饰的方法或成员变量, 只能通过实例来调用.
下面代码通过 Person 实例来调用 Person 的成员变量和方法
//访问 p 的 name 实例变量, 直接为该变量赋值
p.name = "萌萌";
//调用 p 的 say() 方法, 声明 say() 方法时定义了一个形参
//调用该方法必须为形参指定一个值
p.say("呵呵哒呵呵呵呵哒");
//直接输出 p 的 name 实例变量
System.out.println(p.name);
上面代码中通过 Person 实例调用了 say() 方法, 调用方法时必需为方法的形参赋值. 因此在这行代码中调用 Person 对象的 say() 方法时, 必需为 say() 方法传入一个字符串作为形参的参数值.
这个字符串将被传给 content 参数.
大部分时候, 定义一个类就是为了重复创建该类的实例 .
同一个类的多个实例具有相同的特征.
而类则是定义了多个实例的共同特征.
从某个角度来看, 定定义的是多个实例的特征.
因此类不是一种具体存在, 实例才是具体存在.
完全可以这样说, 你不是人这个类, 我也不是人这个类, 我们都只是人这个类的实例.