面向对象
面向对象与面向过程
-
面向对象(OOP)与面向过程(POP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备了功能的对象。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。 -
面向对象的三大特征
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)
java类及类的成员
- 现实世界万事万物是由分子、原子构成的。同理,Java代码世界是由诸多个不同功能的类构成的。
- 现实世界中的分子、原子又是由什么构成的呢?原子核、电子!那么,Java中用类class来描述事物也是如此
属 性:对应类中的成员变量
行 为:对应类中的成员方法
面向对象的思想概述
- 可以理解为:类 = 汽车设计图;对象 = 实实在在的汽车
- 面向对象程序设计的重点是类的设计
- 定义类其实是定义类中的成员(成员变量和成员方法)
类的语法格式
修饰符 class 类名 {
属性声明;
方法声明;
}
说明:修饰符public:类可以被任意访问
类的正文要用{ }括起来
举例:
public class Person{
public int age ; //声明公有变量 age
public void showAge() { //声明方法showAge( ) System.out.println(age);
} }
类的成员之一:属性
- 语法格式:
修饰符 类型 属性名 =初值 ; - 说明:
修饰符private:该属性只能由该类的方法访问。
修饰符public:该属性可以被该类以外的方法访问。
类型:任何基本类型,如int、boolean或任何类。
举例:
public class Person{
private int age; //声明private变量 age
public String name = “Lila”; //声明public变量 name
}
成员变量与局部变量
-
在方法体外,类体内声明的变量称为成员变量。
-
在方法体内部声明的变量称为局部变量。
-
成员变量:
成员变量定义在类中,在整个类中都可以被访问。
成员变量分为类成员变量和实例成员变量,实例变量存在于对象所在的堆内存中。
成员变量有默认初始化值。
成员变量的权限修饰符可以根据需要,选择任意一个 -
局部变量:
局部变量只定义在局部范围内,如:方法内,代码块内等。
局部变量存在于栈内存中。
作用的范围结束,变量空间会自动释放。
局部变量没有默认初始化值,每次必须显式初始化。
局部变量声明时不指定权限修饰符
类的成员之二:方 法
-
语法格式:
修饰符 返回值类型 方法名 ( 参数列表) {
方法体语句;
} -
说明:
修饰符:public, private, protected等。
返回值类型:return语句传递返回值。没有返回值:void。
举例: public class Person{
private int age;
public int getAge() { return age; } //声明方法getAge
public void setAge(int i) { //声明方法setAge age = i; //将参数i的值赋给类的成员变量age
} }
方法是类或对象行为特征的抽象,也称为函数。
Java里的方法不能独立存在,所有的方法必须定义在类里。
- 什么是方法(函数)?
方法是类或对象行为特征的抽象,也称为函数。
Java里的方法不能独立存在,所有的方法必须定义在类里。
修饰符 返回值类型 方法名(参数类型 形参1,参数类型 形参2,….){
程序代码
return 返回值;
}
其中:
形式参数:在方法被调用时用于接收外部传入的数据的变量。
参数类型:就是该形式参数的数据类型。
返回值:方法在执行完毕后返还给调用它的程序的数据。
返回值类型:方法要返回的结果的数据类型。
实参:调用方法时实际传给函数形式参数的数据。
方法的调用
方法只有被调用才会被执行
方法调用的过程分析
方法的重载(overload)
例题
- void show(int x,char y,double z){} //no
- int show(int a,double c,char b){} //yes顺序不同也是重载
- void show(int a,double c,char b){} //yes顺序不同也是重载
- boolean show(int c,char b){} //yes
- void show(double c){} //yes
- double show(int x,char y,double z){} //no
- void shows(){double c} //no
方法的参数传递
-
方法,必须有其所在类或对象调用才有意义。若方法含有参数:
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值 -
Java的实参值如何传入方法呢?
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
类的成员之三:构造器(构造方法)
-
语法格式:
修饰符 类名 (参数列表) {
初始化语句;
}
举 例:
public class Animal {
private int legs;
public Animal() {legs = 4; } //构造器
public void setLegs(int i) { legs = i; }
public int getLegs(){return legs;}
}
创建Animal类的实例:Animal a=new Animal();
//调用构造器,将legs初始化为4。
-
构造器的特征
它具有与类相同的名称
它不声明返回值类型。(与声明为void不同)
不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值 -
构造器的作用:创建对象;给对象进行初始化
如:Order o = new Order(); Person p = new Person(Peter,15);
如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。 -
根据参数不同,构造器可以分为如下两类:
隐式无参构造器(系统默认提供) 显式定义一个或多个构造器(无参、有参) -
注 意: Java语言中,每个类都至少有一个构造器 默认构造器的修饰符与所属类的修饰符一致
一旦显式定义了构造器,则系统不再提供默认构造器 一个类可以创建多个重载的构造器 父类的构造器不可被子类继承
构造器重载
- 构造器一般用来创建对象的同时初始化对象。如
class Person{
String name;
int age;
public Person(String n , int a){ name=n; age=a;}
} - 构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。
构造器重载举例:
public class Person{
public Person(String name, int age, Date d) {this(name,age);…}
public Person(String name, int age) {…}
public Person(String name, Date d) {…}
public Person(){…}
} - 构造器重载,参数列表必须不同
关键字—package
- package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:
package 顶层包名.子包名 ;
举例:
pack\Test.java
package p1; //指定类Test属于包p1
public class Test{
public void display(){
System.out.println(“in method display()”);
} }
- 包对应于文件系统的目录,package语句中,用 “.” 来指明包(目录)的层次;
- 包通常用小写单词,类名首字母通常大写。
关键字—import
- 为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。
- 语法格式:
import 包名[.子包名…]. <类名 |*>
应用举例:
import p1.Test; //import p1.*;表示引入p1包中的所有类
public class TestPackage{
public static void main(String args[]){
Test t = new Test(); //Test类在p1包中定义
t.display();
}}
注意:
若引入的包为:java.lang,则编译器默认可获取此包下的类,不需要再显示声明。
import语句出现在package语句之后、类定义之前
一个源文件中可包含多个import语句
可以使用import lee.* ;语句,表明导入lee包下的所有类。而lee包下sub子包内的类则不会被导入。import lee.sub.*;
import语句不是必需的,可坚持在类里使用其它类的全名
JDK 1.5加入import static语句
关键字—this
- 在java中,this关键字比较难理解,它的作用和其词义很接近。
它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象。 - this表示当前对象,可以调用类的属性、方法和构
造器 - 什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this。
JDK中主要的包介绍
-
java.lang----包含一些Java语言的核心类,如String、Math、Integer、
System和Thread,提供常用功能。 -
java.net----包含执行与网络相关的操作的类和接口。
-
java.io ----包含能提供多种输入/输出功能的类。
-
java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、
使用与日期日历相关的函数。 -
java.text----包含了一些java格式化相关的类
-
java.sql----包含了java进行JDBC数据库编程的相关类/接口
-
java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的
多个类,这些类被用来构建和管理应用程序的图形用户界
面(GUI)。 -
java.applet----包含applet运行所需的一些类。
面向对象特征之一:封装和隐藏
使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。
- Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
便于修改,增强代码的可维护性;