大部分引用自《Thinking in JAVA》(the 4th edtion)java
面向过程与面向对象编程
我要去承德jvm
面向过程:我开车,我开导航,我踩离合,我挂档,我踩油门,我上五环,我上京承。。。。编程语言
面向对象:我命令车去承德,车怎么去的不关我事编辑器
Smalltalk语言发明人Alan Kay所总结的面向对象特征:ide
1万物皆对象。将对象视为奇特变量,能够存储数据,也能够要求其在自身上进行操做测试
2程序是对象的集合,经过发送消息来告知彼此该作的。能够把消息看做是某个对象的方法调用请求。this
3 每一个对象都有本身的由其余对象所构成的存储。能够经过构建一个包含其余对象的包的形式来建立新对象,好比组合的形式idea
4 每一个对象都拥有其类型。通用的说法是每一个对象(class)都是某个类的实例(instance)spa
5 某一特定类型的全部对象均可以接受一样的消息。“圆形”类型的对象同时也是“几何形”类型的对象,因此一个“圆形”类型的对象能够接收发送给 “几何形”对象的消息,好比“几何形”能够求面积,“圆形”也能够。这就意味着能够编写与“几何形”交互并自动处理全部与“几何形”相关类型事物的代码。(继承、多态)
一般咱们总结出的java面向对象的特征:
抽象:
抽象就是找出一些事物的类似和共性之处,而后将这些事物归为一个类,这个类只考虑这些事物的类似和共性之处,而且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你可以想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,以下:
class Person{
String name;
int age;
doSomething(){
……
}
}
人原本是很复杂的事物,有不少方面,但由于当前系统只须要了解人的姓名和年龄,因此上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象能够避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的全部方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统须要什么,就只考虑什么。
封装:
封装是保证软件部件具备优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变更影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法能够直接访问同一个对象中的属性。
例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪一个对象呢?因为画圆须要使用到圆心和半径,圆心和半径显然是圆的属性,若是将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人之后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不该该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象本身的行为(方法)来读取和改变。
一般状况下,只要记住让变量和访问这个变量的方法放在一块儿,将一个类中的成员变量所有定义成私有的,只有这个类本身的方法才能够访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操做的方法和相关的方法放在同一个类中,把方法和它操做的数据放在同一个类中。
继承:是复用类的一种手段,子类继承父类后,子类能够直接得到父类的属性和方法
老鼠的儿子会打洞
多态:子类对象能够赋值给父类对象,在此父类对象调用方法时依然表现出子类的特征.
鹅和企鹅都是鸟,他们如何移动?
鹅(天鹅也是鹅):飞,游泳,走路
企鹅:游泳,走路,潜水
这样的场景,假设你不知道你面前的动物是鹅仍是企鹅,你只知道这是鸟,你撵这只鸟,若是不是懒到家它确定会移动,它只能去作它能作的事情,即便企鹅是鸟也学不来鹅的飞翔
传统意义上,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开发环境搭建
类:
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();
}
封装一个类 正方形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> ();