对于初学java的人来说,由于习惯了写面向过程的程序,拿过来一个问题,总想将其分为一步一步来做,面向过程的思想根深蒂固,即使用java来写,也是披着面向对象的皮写面向过程的代码,下面通过一个例子来说明一下面向对象的设计思维(封装):例子:老张开车去东北
1,首先考虑问题域里面可以抽象出几个类(名词),进行封装。老张作为一个具体对象,可以抽象成司机类(Driver),车抽象成Car类,东北抽象成Address类
2,属性:不可脱离具体的应用环境,Driver有一个属性name,Address有一个属性name
3,方法:考虑动作,Driver有一个方法drive(),Car有一个方法go()
4,类与类之间的关系。
//司机类
public class Driver {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void drive(Car c) {
v.go(new Address("东北"));
}
public void drive(Car c) {//
c.go(new Address(“东北”));
}
}
//Car类
public class Car {
public void go(Address dest) {
System.out.println("去" + dest.getName());
}
}
//地址类
public class Address {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address(String name) {
super();
this.name = name;
}
}
//测试类
public class Test {
public static void main(String[] args) {
Driver d = new Driver();//实例化一个对象
d.setName("老张");
d.drive(new Car());//对象调用方法
}
}
虽然这样可以实现这个问题,但是作为一个程序设计者,要考虑到设计的程序具有可扩展性,如果需求增加,不至于大幅改动我的源码,
就这个例子,如果我的交通工具变了,或者去的地点不是东北,等等,我们就要考虑使用多态,继承
5,继承:如果满足这句话就可以使用继承,什么什么是一种什么什么
6,多态:特点为有继承、有重写、有父类引用指向子类对象
定义一交通工具抽象类:
public abstract class Vihecle {
public abstract void go(Address dest);
}
public class Car extends Vihecle{
public void go(Address dest) {
System.out.println("跑去了" + dest.getName());
}
}
public class Plane extends Vihecle{
public void go(Address dest) {
System.out.println("飞去了" + dest.getName());
}
}
public class Driver {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void drive(Vihecle v) {
v.go(new Address("东北"));
}
public void drive(Car c, Address dest) {
c.go(dest);
}
}
public class Test {
public static void main(String[] args) {
Driver d = new Driver();
d.setName("老张");
d.drive(new Plane());
}
}