大部分引用自《Thinking in JAVA》(the 4th edtion)
1 面向对象及java简介
1.1 抽象过程
面向过程与面向对象
我要去承德
面向过程:我开车,我开导航,我踩离合,我挂档,我踩油门,我上五环,我上京承。。。。
面向对象:我命令车去承德,车怎么去的不关我事
1.2 一切都是对象;
Smalltalk语言发明人Alan Kay所总结的面向对象特征:
1万物皆对象。将对象视为奇特变量,可以存储数据,也可以要求其在自身上进行操作
2程序是对象的集合,通过发送消息来告知彼此该做的。可以把消息看作是某个对象的方法调用请求。
3 每个对象都有自己的由其他对象所构成的存储。可以通过构建一个包含其他对象的包的形式来创建新对象,比如组合的形式
4 每个对象都拥有其类型。通用的说法是每个对象(class)都是某个类的实例(instance)
5 某一特定类型的所有对象都可以接受同样的消息。“圆形”类型的对象同时也是“几何形”类型的对象,所以一个“圆形”类型的对象可以接收发送给 “几何形”对象的消息,比如“几何形”可以求面积,“圆形”也可以。这就意味着可以编写与“几何形”交互并自动处理所有与“几何形”相关类型事物的代码。(继承、多态)
通常我们总结出的java面向对象的特征:
抽象:
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下:
class Person{
String name;
int age;
doSomething(){
……
}
}
人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。
封装:
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。
例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。
通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。
继承:是复用类的一种手段,子类继承父类后,子类可以直接获得父类的属性和方法
老鼠的儿子会打洞
多态:子类对象可以赋值给父类对象,在此父类对象调用方法时依然表现出子类的特征.
鹅和企鹅都是鸟,他们如何移动?
鹅(天鹅也是鹅):飞,游泳,走路
企鹅:游泳,走路,潜水
这样的场景,假设你不知道你面前的动物是鹅还是企鹅,你只知道这是鸟,你撵这只鸟,如果不是懒到家它肯定会移动,它只能去做它能做的事情,即使企鹅是鸟也学不来鹅的飞翔
1.3 Java简介
传统意义上,JAVA技术体系包括(Sun官方):
l Java程序设计语言
l Java虚拟机
l Class文件格式
l Java Api类库
l 来自商业机构和第三方社区的Api类库
JDK(java development kit):Java程序设计语言、Java虚拟机、Java Api类库
JRE(java runtime environment):Java虚拟机、Java Api类库中的JavaSE Api类库
根据业务领域来划分:
l Java Card
l Java ME
l Java SE
l Java EE
Java的核心运行机制:jvm+GC
而且具有跨平台性:
Java开发环境搭建
- 根据操作系统环境安装相应jdk
- 设置环境变量
- 选择一款集成开发环境(eclipes、myeclipes、intelliJ idea)或者文本编辑器(Vim,sublime text,记事本)
1.4 本讲涉及的Java基础
类:
class关键字定义,
class Person{
}
属性
class Person{
int age;
String name;
}
方法(构造方法、成员方法与静态方法):
class Person{
int age;
String name;
Person(){
age = 30;
name = “Li Lei”
}
sayHello(){
System.out.println(“Hello! I am” + name + “,” + age + “year old!”);
}
static staticMethod(){
System.out.println(“staticMethod calling”);
}
}
抽象类、接口
abstract
interface
interface animal{
void eat();
}
2 简单面向对象实例
封装一个类 正方形square
class Square{
int edgeLen;
int edgeNum = 4;
Square(){
edgeLen = 10;
}
Square(int edgeLen){
this.edgeLen = edgeLen;
}
int perimeter(){
System.out.println("正方形周长");
return edgeNum*edgeLen;
}
int area(){
System.out.println("正方形面积");
return edgeLen*edgeLen;
}
}
测试下:
public class TestObject(){
public static void main(String[] args){
Square square = new Square(10);
System.out.println(square.perimeter());
System.out.println(square.area());
}
}
继承
//正多边形
class RegularPloygon{
int edgeLen;
int edgeNum;
RegularPloygon(int edgeLen, int edgeNum){
this.edgeLen = edgeLen;
this.edgeNum = edgeNum;
}
int perimeter(){
System.out.println("正多边形周长");
return edgeNum * edgeLen;
}
int area(){
System.out.println("正多边形面积");
return 0;
}
// void draw(){
// System.out.println("正多边形绘制");
// }
// void erase(){
// System.out.println("正多边形擦除");
// }
}
//正三角形,继承正多边形
class Triangle extends RegularPloygon{
int high;
//不能继承父类构造器,但可以通过super调用
Triangle(int edgeLen){
super(edgeLen, 3);
high = Math.sin( Math.PI/3 )*edgeLen;
}
//重写父类方法
@Override
int area(){
System.out.println("正三角形面积");
return edgeLen * high / 2;
}
}
测试下:
public class TestExtends(){
public static void main(String[] args){
Triangle triangle = new Triangle(10);
System.out.println(triangle.perimeter());
System.out.println(triangle.area());
// 父类接收子类引用,再调用父类方法会发生什么?
// RegularPloygon p = new Triangle(10);
// System.out.println(p.perimeter());
// System.out.println(p.area());
}
多态
实际上,java程序中多态最广泛的应用在于接口的调用
接口 几何形 shape
public interface Shape{
void draw();
void erase();
}
改写以上几个类实现shape接口
class Square extends RegularPloygon{
int edgeLen;
int edgeNum = 4;
Square(int edgeLen){
System.out.println("正方形构造器调用");
this.edgeLen = edgeLen;
}
int perimeter(){
System.out.println("正方形周长");
return edgeNum*edgeLen;
}
int area(){
System.out.println("正方形面积");
return edgeLen*edgeLen;
}
void draw(){
System.out.println("正方形绘制");
}
void erase(){
System.out.println("正方形擦除");
}
}
//正多边形
class RegularPloygon implements Shape{
int edgeLen;
int edgeNum;
RegularPloygon(int edgeLen, int edgeNum){
System.out.println("正多边形构造器调用");
this.edgeLen = edgeLen;
this.edgeNum = edgeNum;
}
int perimeter(){
System.out.println("正多边形周长");
return edgeNum * edgeLen;
}
int area(){
System.out.println("正多边形面积");
return 0;
}
void draw(){
System.out.println("正多边形绘制");
}
void erase(){
System.out.println("正多边形擦除");
}
}
class Triangle extends RegularPloygon{
float high;
Triangle(int edgeLen){
super(edgeLen, 3);
System.out.println("正多边形构造器调用");
high = Math.sin( Math.PI/3 )*edgeLen;
}
//重写父类方法
@Override
int area(){
System.out.println("正三角形面积");
//四舍五入
return Math.round(edgeLen * high / 2);
}
void draw(){
System.out.println("正三角形绘制");
}
void erase(){
System.out.println("正三角形擦除");
}
}
//添加圆形
class Circle implements Shape{
void draw(){
System.out.println("圆形绘制");
}
void erase(){
System.out.println("圆形擦除");
}
}
测试一下
关于多态的应用,最常见的就是集合类的使用
诸如
List<String> list = new ArrayList<String>();
List<String> list = new LinkedList<String>();
Map<String,Object> XXXXmap = new HashMap<String,Object> ();
Map<String,Object> XXXXmap = new TreeMap<String,Object> ();