面向对象编程概念
计算机程序语言发展的阶段
1.面向机器语言:早期的程序设计语言,以及机器语言的抽象——汇编语言。缺点是与硬件关联性大,实现困难,可移植性差
2.面向过程语言:以具体的解题过程为研究和实现的主题,过程完备。如c语言。缺点是无法将复杂的系统描述清楚,满足现在对软件规模和复杂度的需求
3.面向对象语言:以求解问题中所涉及的各种对象为主体,力图求解过程符合人们日常的思维习惯,降低了求解问题的难度和复杂性,提高了编程的效率。如C++,Java
面向对象语言的优越性:
1.对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,减轻了程序员保持数据与操作相容的负担
2.对象的数据封装性还可以把对象的私有数据和公共数据分开,保护了私有数据,减轻了可能的模块间干扰,达到了降低程序复杂性,提高可控性的目的
3.对象作为独立的整体具有良好的自理性,即它可以通过自身定义的操作来管理自己。一个对象的操作可以完成两类功能,一是修改自身的状态,二是向外界发布消息
面向对象的程序设计是将数据及对数据的操作封装在一起,将具有相同特征的对象抽象成为一种新的数据类型一类
面向对象编程特征
1.封装
将数据(属性)和对数据的操作(功能)封装在一起。即成员变量,成员方法,类
2.继承
子类可以继承父类的属性和功能,同时又可以增加子类独有的属性和功能
3.多态
多个操作具有相同的名字,但是接受的消息类型必须不同,同一个操作被不同类型的对象调用时产生不同的行为。对外同一个接口,对内多种实现
类和对象
类的基本结构

构造方法
类创建对象时,需要使用构造方法完成对象的初始化工作
构造方法的名称必须与类名相同
构造方法没有任何返回数据类型

如果类定义中显式地给出了构造方法,系统不再提供默认的构造方法
一个类中可以有若干个构造方法(名称相同),但是构造方法的参数必须不同
如果类中没有构造方法,系统为类定义一个默认的构造方法,该构造方法没有参数,类体为空
对象的创建
1.对象的声明
类名 对象名
Circle aCircle;
aCircle是一个空对象,它不能访问成员变量和成员方法
2.创建对象
对象名=new 构造方法名(参数列表)
aCircle=new Circle();
aCircle=new Circle(5.0);
也可以声明同时创建
Circle aCircle=new Circle(5.0)
对象的使用
通过使用运算符.访问
成员变量
实例变量
不用关键字static修饰
一个类中不同对象的实例变量将被分配不同的存储空间
只能通过对象访问实例变量
静态变量(类变量)
用关键字static修饰
一个类所有对象的某个静态变量被分配同一个内存,所有对象共享这个静态变量
可以通过类名访问静态变量,也可以通过某个对象访问静态变量


final成员变量
如果一个成员变量修饰为final,就是常量,常量的名字习惯用大写字母
final int MAX=100;
如果final变量是简单类型,则其值不能发生变化
如果final变量是复合类型,则其指向对象的引用不能发生变化,但是引用所指向的值可以改变



成员方法
构造方法
供类创建对象时使用,给出类所创建的对象的初始状态
对象不能调用构造方法
一般方法
1.方法声明和方法体
方法类型 方法名(参数列表)
{
方法体的内容
}
2.一般方法包括实例方法和类方法
实例方法:方法声明中不用static修饰,必 须通过对象来调用
类方法(静态方法):方法声明中用static修饰,可以通过类名调用
静态方法可以访问静态变量和静态方法,但不能访问非静态变量和非静态方法
非静态方法既可以访问非静态变量和非静态方法,也可以访问静态变量和静态方法
3.参数传值
基本数据类型参数的传值
实参和形参占有不同的内存空间,形参的改变不影响实参
实参的级别低于形参的级别


引用类型参数的传值
引用类型数据包括对象,数组以及接口和泛型等
实参和形参指向共同的内存
改变形参引用的实体,会导致实参引用的实体发生同样的变化


方法过载
方法过载是多态性的一种,是指一个类中可以有多个方法具有相同的名字,但是参数数量不同或者参数类型不同
方法的类型和参数的名字不参与比较
this关键字
this可以出现在实例方法和构造方法中,但是不能出现在类方法中
在构造方法中使用this(this可省略)


在实例方法中使用this(代表使用该方法的当前对象,this可以省略)

使用this区分成员变量和局部变量(这里的局部变量指在成员方法的参数列表或者在方法体中定义的变量)
如果成员变量和局部变量名称相同,则成员变量被隐藏,即成员变量在方法内暂时失效
如果想在方法中使用成员变量,对于实例方法,应使用"this.成员变量",对于类方法,应使用"类名.成员变量"
this不可省略

继承和多态
子类与父类
类之间的继承关系是一种由已经存在的类创建新类的机制,可以有效地实现代码的重复使用
可以先定义一个公有属性的一般类(父类或超类),在此基础上定义新的类(子类)
子类可以继承父类的属性和方法(子类不继承父类的构造方法),也可以定义自己独有的属性和方法
父类可以是Java类库中的类,也可以是自己编写的类
Java不支持多重继承,即子类只能有一个父类
类继承的语法
class 子类名 extends 父类名
{
子类的类体
}
如果一个类的声明没有使用关键字extends,这个类被系统默认为是Object类的子类,Object类是java.lang中的类
类继承的使用
如果子类继承了父类的成员变量和成员方法,就可以将它们作为已用,就像在子类中定义的一样
子类如果没有继承父类的某些成员变量或成员方法,则子类无法对他们进行访问或调用

在B类中调用A类的成员变量和成员方法
B b=new B();
b.first=200;
成员变量的隐藏
子类中定义的新的变量如果和继承过来的变量名称相同,则会隐藏继承过来的成员变量

方法的重写
是多态的一种表现
是指子类可以改写父类方法所实现的功能,但是子类重写的方法必须与父类中对应方法有相同的名称,返回类型和参数列表
方法的重写必须有相同的名称,返回类型,参数列表,与方法的过载不同
如果父类中的方法被子类重写,则子类的对象调用这个方法时,实际运行的是子类中改写之后的方法,父类中的相应方法被隐藏了起来



关键字super
关键字super代表当前对象的父类部分
super有两种用法:
1.子类使用super调用父类的构造方法
子类不继承父类的构造方法
子类中有些初始化工作需要调用父类的构造方法帮助实现,需要用super关键字
子类构造方法中调用父类构造方法的语法为super(参数列表)
子类构造方法中使用super调用父类构造方法时,必须把调用语句放在最开始

2.子类使用super操作父类中被子类隐藏的成员变量和方法
super.变量名
super.方法名(参数列表)

访问权限
包
为了使类易于查找和使用,也为了防止命名冲突和限定类的访问权限,可以将一组相关类与接口包裹在一起形成包
包具有特定的访问控制权限,同一个包中的类之间拥有特定的访问权限
包的声明
package 包名
package语句是Java源文件的第一条语句
如果源文件中没有package语句,则其中的类被默认为在无名包中
包名可以是标识符,也可以是若干标识符加.组成,建议小写
例如:package adder;
package com.sun.jdk;
import语句
import语句可以引入包中的类
import语句必须写在package语句和源文件中类的定义之间
成员变量和成员方法的访问权限
成员变量和成员方法的访问控制修饰符包括
private
一个类中,带有private的成员变量和成员方法称为私有成员变量和私有成员方法,它们只能被类自身访问
Class Adder
{
private int x;//私有变量
private int increase(int basic)//私有方法
{
return basic+x;
}
}
Class User
{
void use(int input)
{
Adder adder=new Adder();
adder.x+=1;//非法
int result=adder.increase(6);//非法
}
}
对某个类的私有静态方法或私有静态变量,其他类不能用类名对它们直接访问
public
一个类中,用public修饰的变量成员和成员方法称为公有变量和公有方法
任何包中的任何类都可以直接访问任何包中的公有成员和公有方法
不使用修饰符(或者称default)
一个类中,不用任何访问权限控制符修饰的成员变量和成员方法称为默认权限的成员变量和成员方法
默认权限的成员变量和成员方法可以被类本身和同一个包中的其他类访问
protected
一个类中,带有protected的成员变量和成员方法称为受保护权限的成员变量和成员方法
被protected修饰的成员变量和成员方法可以被类本身,类的子类以及用一个包中的其他类访问
package yours;
class Adder
{
protected int x;//受保护权限变量
int y;//默认权限变量
//受保护权限方法
protected int increase(int basic)
{
return basic+x;//合法
}
}
package other;
import yours;
class Unknown
{
Adder a=new Adder();
a.x++;//非法
a.y++;//非法
a.increase(3);//非法
}
package mine;
class User extends Adder
{
void use(int input)
{
Adder adder=new Adder();
adder.x+=1;//合法
adder.y+=2;//非法
int result=adder.increase(6)//合法
}
}

类的访问权限
公共权限
关键字class前面加public
默认权限
不用public修饰的类
其他的类要使用默认权限的类创建的对象,或者使用该类的名称访问类的静态成员,则两个类必须在同一个包中
构造方法的访问权限
private,default,public,protected同样适合于构造方法
使用类创建该类的对象时,对构造方法的访问权限是类的访问权限和构造方法的访问权限的交集
如果一个类没有明确地声明构造方法,则系统会给该类定义一个无参默认构造方法,这个构造方法的访问权限和类的访问权限相同