本文讲述java的部分面向对象编程特性
抽象数据类型简介
API(方法)
对象
对象的使用
继承
输入与输出
抽象数据类型简介
数据类型指的是一组值和一组对这些值的操作的集合。我们已经接触过原始数据类型,在java中编程的基础主要是使用class为关键字构造的被称为 “引用类型” 的数据类型,这种编程风格叫做面向对象编程。
“引用类型”是一种“抽象数据类型(ADT)”, 是一种能够对使用者隐藏数据的数据类型。在使用抽象数据类型时,我们把注意力集中在API的描述上而不去关心数据的表示,在实现抽象数据类型时,我们把注意力集中在数据本身而不取关心API的实现
API(方法)
API要包括构造函数和实例方法
- 各种方法的特点
构造函数:一种没有返回值的函数,可以理解为初始化方法,创建对象的标识
静态方法:主要作用是实现一个函数(不对对象属性修改)
实例方法:主要作用就是操作数据类型中的值(对对象属性进行修改)公有方法:可以被对象调用
私有方法:不可以被对象调用
实例方法和静态方法不同之处:
如图所示
-
构造函数的实现
-
实例方法的实现
扫描二维码关注公众号,回复: 8750898 查看本文章 -
方法中变量的作用域
对象
-
对象的三大重要特性
- 标识:区别不同的对象,可以认为标识就是对象在内存中的位置
- 状态:状态就是指数据结构中的值(python中称为"属性")
- 行为:行为就是指对数据结构的操作 (python中称为"方法‘)
-
创建对象
Counter heads = new Counter("heads");
- 为新对象分配内存空间
- 调用构造函数初始化对象中的值
- 返回该函数的一个引用
引用是一种访问对象的方式,可以认为引用就是内存地址
对象的使用
一. 直接调用方法
-
通过语句
-
通过表达式
-
通过自动类型转换
二. 其他使用方式
- 给对象赋值
在引用类型中,赋值语句将会创建出一个新的副本,不会创建新的对象的地址,而是指向另一个对象的地址(起别名)
- 将对象作为参数
当我们在调用方法时把对象作为参数,相当于对象每个参数值都放进方法这种方式叫做 ------ 按值传递
- 将对象作为返回值
直接举个例子:
public class FlipMax{
public static Counter max(Counter x, Counter y){ // 返回对象的静态函数max()
if (x.tally() > y.tally()) return x;
else return y;
}
public static void main(String[] args){
int T = Integer.parseInt(args[]);
Counter heads = new Counter("heads");
Counter tails = new Counter("tails");
for (int i = 0; i < T; t++){
if (StdRandom.bernoulli(0.5)) //正的概率为0.5 (掷硬币)
heads.increment();
else tails.increment();
}
if (heads.tally() == tails.tally()) StdOut.println("Tie");
else StdOut.println(max(heads, tails) + " wins");
}
}
- 数组 ---- 也是一个对象
在java中,所有非原始数据类型都叫引用类型, 所有非原始数据类型的值都是对象
故所以,数组也是对象
tip:故所以在数组间使用赋值语句,是在创建数组地址的副本,而不是数组本身的副本(效果正合适)
对象数组:数组元素为对象的引用(对象的地址),而非对象本身
public class Rolls{
public static void main(String[] args){
int T = Integer.parseInt;
int SIDES = 6;
Counter[] rolls = new Counter[SIDES + 1]; // 声明并创建大小为7数组rolls[]
for (int i = 1; i <= SIDES; i++)
rolls[i] = new Counter(i + "s");
for (int t = 0; t < T; t++){
int result = StdRandom.uniform(1, SIDES+1);
rolls[result].increment();
}
for (int i = 1; i <= SIDES; i++)
StdOut.println(rolls[i]);
}
}
- 字符串 ---- 也是一个对象
在java中,所有非原始数据类型都叫引用类型, 所有非原始数据类型的值都是对象
故所以,字符串跟数组一样也是对象
字符串的API:如图所示
继承
- 接口继承
- 子类继承:
一个类 (子类) 继承另一个类 (父类) 所有的实例方法和实例变量
每个类都是java的object基类的子类,这就以为着每个类都含有某些自带的方法
输入和输出
输入和输出建立起java程序与外界交流的模型
- 重定向与管道
% java RandomSeq 1000 100.0 200.0 > data.txt // 重定向 从输出到屏幕变为输出到txt文件
% java Average < data.txt // 重定向 从键盘获取输入vi变为从txt文件中获取输入
% java java RandomSeq 1000 100.0 200.0 || Average // 管道 一个程序的输出重定向为一个程序的输入
- 标准的输入和输出
- 基于文件的输入和输出
-
多输入与多输出(面向对象)
实例: