0 前言
计算机程序的发展经历了面向过程到面向对象的转变。如何理解面向过程和面向对象呢?我们以做一个盒子的例子说明:
面向过程:不去想做什么样子的盒子,随即取工具制作,然后慢慢做成想要的样子;
面向对象:先想好做一个什么样的盒子,搭好整体框架,再去找对应的工具去做细节。
简单来说,面向对象就是建立在更符合人类思维的、更抽象的客观世界模型上来解决问题的。我们知道,客观世界是由许多不同种类的对象组成的,每一个对象都有各自的运动规律和内部状态,且不同对象之间相互联系、相互作用。为了减少程序的冗余,增强逻辑性和管理,我们将同属性的对象归类,在类中定义对象的属性、方法,然后再通过调用,按照不同对象的特点去实例化对象、对象属性和方法。
再用一个例子来理解上面这段话:比如一个教室里有很多学生,每一个学生都有名字、性别、年龄等属性,学生最关注的是成绩,可以按成绩排出及格、优秀、差等生三类。在这个例子中,学生属于类,单个学生就是对象,而名字、姓名、年龄属于对象的属性;按照成绩排等级属于对象的一种方法。
这样,就建立了类、对象、方法的概念了。
面向对象技术以基本对象模型为单位,将对象内部的细节封装在模型中,重视对象模块间的接口联系和对象与外部环境之间的关系。就好比我们买来一个电视机,这个电视机的操作就是一个面向对象的设计,我们不需要管电视机是怎么设计、内部原理是怎么运行的,只需要知道它与外界的交互关系(也就是上面的按钮怎么操作)即可。
从这个角度来看,面向对象存在抽象性、封装性、继承、多态性等特征。
1 类、对象和方法的创建及使用
在面向对象的程序中,首先要声明对象的类,并通过实例化的方式构造对象,然后赋予对象属性和方法。
(1)类的创建格式
类是用来创建对象的模板,定义对象的共同特征,包括数据和操作。例如,猫、狗、鸡等属于对象,他们虽然外形不同,但都属于同一类——动物类,因此,可以创建动物这个类,来涵盖这些个对象。
类的语法结构包括关键字class和跟在后面的类名称。如果要继承自某个类,还需要用extends关键字,关于继承部分内容后面会详细给出。
类创建的格式如下:
class 类名称{
属性
方法
}
例如:
class Person{
String name;
int age;
public void tell(){
System.out.Println(name+age);
}
}
在这个例子中,class是类关键字,Person是类名; name、age是对象属性,tell是对象方法(该方法用于输出姓名和年龄)。这便创建了一个类。
(2)对象的创建格式
上文提到,声明对象的类后,需要在主程序中通过实例化操作来创建对象。对象的创建格式为:
类名称 对象名=new 类名称()
例如:
Person per=null;//声明
per=new Person();//实例化
也可以用一句代码直接实例化
Person per = new Person();//实例化
其中,new是实例化操作的关键字,用于开辟堆空间,存放具体内容。在刚创建的时候per里面存放的是空(null)。
总结而言,要获得一个类的对象需要两步,其一,必须声明该类类型的一个变量,也就是上述代码中的per,第二部,声明创建一个对象的实际物理空间存放具体内容,这是通过new运算符来实现的,new运算符为对象动态分配内存空间,并返回对它的一个引用。
(3)对象对属性和方法的调用方式
对象的属性和方法通常在主程序或者类方法中调用,调用格式为:
对象.属性
对象.方法
例如:
public static void main(String[] args) {
Person per=null;//声明
per=new Person();//实例化
per.setName("Sonny");
per.setAge(24);
per.tell();
}
其中,per是实例化创建的对象,per.tell()便是对象per调用的tell方法。
(4)方法
方法是在类中定义,用来实现对象操作的过程或者函数,属于一个给定对象的过程和函数,反应的是对象的行为而不是数据。
其定义格式为:
访问修饰符 返回值类型 方法名(){
方法主体
}
例如:
public void tell(){
System.out.Println(name+age);
}
其中,访问修饰符包括缺省、public、private、protected四种,用于限定可访问性属性
通常方法可分为有返回值和无返回值两种,有返回值的方法必须标明返回值类型,如int 等,没有返回值的必须标明void关键字。
当一个实例变量不是被该实例变量所在类的部分代码访问时,必须通过该对象加点运算符来访问,但是当一个实例变量被定义该变量的类的代码访问时,该变量可以被直接引用,同样的规则也适用于方法。
(5)整体范例
前文讲述了如何创建类、对象和方法的分别创建,但放在一个可运行有实际目的的程序中,应该如何编写呢?下面举一个例子,以使得对该部分内容有一个整体上的认知。
例:
编写并测试一个代表地址的address类,地址信息由国家、省份、城市、区等组成,并可以返回完整的地址信息。
package demo;
class Address{
//声明类,类名为Address
String country;//声明对象属性
String province;
String city;
String strict;
public void addressInfo(){
//声明对象方法
System.out.println(country+province+city+street);
}
}
public static void main(String[] args){
//主程序入口
Address ad=new Address();//实例化对象
ad.country="中国";//对象属性赋值
ad.province="湖北";
ad.city="武汉";
ad.strict="洪山"
ad.addressInfo();//调用对象方法
}
补充说明:java程序的注释
在任何程序语言中都存在注释,以方便阅读,java根据功能的不同,注释分为三种:
单行注释——
//
例如:
int num; // 定义一个整数
多行注释——
/*
*/
例如:
/*
int c=10;
int x=5;
*/
文档注释——
/**
*/
2. 封装性
2.1 概述
类的目的是封装复杂性,在类的内部就应该有隐藏实现复杂性机制,类中的每个方法或变量都可以被标记为私有、公共。类的公共接口代表类的外部用户需要知道或可以知道的每件事情;私有方法和数据仅能被一个类的成员代码所访问,其他任何不是类的成员的代码都不能访问私有的方法或变量。
既然类的私有成员仅能被程序中的其他部分通过该类的公共方法访问,那么你就能保证不希望发生的事情一定不会发生。这便是封装。
封装将数据和处理数据的代码链接起来,但同时也提供另一个重要属性:访问控制。通过控制访问,可以阻止对象的滥用。前文已提到过访问修饰符,不再赘述。
(1)封装目的
封装性是为了保护某些属性和方法不被外部所看见
(2)封装的实现
为属性和方法进行封装是通过关键字private声明的,声明后该属性和方法不能被直接调用,而需要使用该属性的set和get方法
package control;
class Person{
private int age;
private String name;
public void tell() {
System.out.println("姓名"+getName()+"年龄"+getAge());
}
public int getAge() {
return age;
}
public void setAge(int a) {
age=a;
}
public String getName() {
return name;
}
public void