一.面向对象编程
按照博主的理解,编程是一个对客观世界建立模型的过程。面向对象编程就是把客观世界的事情看做是对象的沟通,而各个对象划分为不同的种类。
与面向过程相比,这种方法更适合于大型项目的构建与开发。更适合与多人协作模型。
就比如说,要对一个学校的人数统计然后分类然后对于各类做处理做一个程序。在C程序思考中,我们会把数据类型与函数分开,函数接受一个名单数组,然后对于名单数组里的名字进行遍历然后分类。然后返回很多数组,表示分类。然后再编写处理函数,虽然这些过程在现实联系紧密,但在我们的程序中这些过程之间关系并不紧密。
而对于面向对象来说,我们更应该考虑有一个学校对象,里面有很多人对象分成学生对象,教师对象,有一个方法能够在学校对象内分类各种人对象,又有一些方法能够处理对象分类。这样就把我们关系很密切的方法联系在了一起。我们要做的就是告诉学校类去分类。
在面向对象中
1.万物都是对象
2.程序是对象的集合
3.每个对象都包含其他对象
4.每个对象都有类型
5.每个特定类型对象都可以接受消息,做出反应(对人对象要求的分类可以学生对象和老师对象可以回应)
而类就是我们抽象出来的对象分类,比如张三对象和李四对象,我们在学校分类时不考虑具体的姓名,于是我们只需要定义一个学生类创建两个学生类的对象就可以了。
面向对象能够实现的重要因素是,所有程序都是对现实的一种仿真,现实世界可以表述为物体的相互作用,所以面向对象考虑符合这种表达。
二.类的定义
我们定义一个类,我们要定义两部分的内容。比如我们要定义一个人的类,他得有名字,他得会说话,他得有性格,他得会有心理活动
上面分为两个部分,有什么,会什么。
有什么就是类的字段,或者叫属性,会什么就是类的方法。
定义类就要定义属性和方法。
我们再考虑一下,一个人的性格是不能被直接让外部了解的。一个人的心理活动外部也是不能读取的,所以类的这两个应该拒绝外部调用,就是私有的。
定义类使用class+类名的方式,后跟{}定义属性和方法。
{}内部定义的属性可以是别的类,对于外部访问的限定可以加上private,public关键字。
class People
{
public String name;
private String character;
public String speak()
{....}
private String think()
{}
}
详细访问限定会以后写到。
三.对象的创建
对象的创建使用new 对象名创建();
new student();
但这样创建的对象我们无法拿去使用,这时候我们就需要为他创建一个标识符。对象的引用,对象的引用指向我们实际的对象,而不同的引用可以对应一个对象。标识符之间的赋值还是对应一个对象。但都是A。
class People
{
String name;
void Setname(String a)
{
name = a;
}
String Getname()
{
return name;
}
}
People zhangguoqing = new People("zhangguoqing");
People shadiao = zhangguoqing;
shadiao.setname("shadiao");
System.out.println(zhanguoqing.getname());
//Output:shadiao
在这里我们明明只修改了shadiao可是zhangguoqing也被修改了,这就是因为两个引用引用的同一个对象。
在Java中永远不用销毁对象,这是由Java虚拟机自动完成的,不需要用户操心。
四.类的关系
类之间不是相互独立的,对象张三是一个学生,学生属于人的一种。对象张三内部有心脏对象,对象张三的行为被大脑对象控制。
这就是类的继承,组合,复用
继承关系是is-a,人是学生。
组合关系是has-a,学生有心脏
代理关系Java中没有明确方法,但可以通过继承组合模拟。
创建一个对象的继承类用class A extends B表示A类是B类特例。
创建对象的组合,A类的属性有B类。
其中继承后A类可以调用B类的任何public方法,A对象也可以赋给B类的引用。
问题是两个类中同名方法怎么办,这就是多态部分的内容了。过几天就会在新的博客中阐述。
class A
{
public void greet()
{
System.out,println("I am A");
}
}
class B extends A{}
class C{};
A a = new B();
B b = new B();
//C c = new B(); Complier Error
//B b = new A();Complier Error
a.greet();
b.greet();
//Out I am A
//Out I am A
我们可以看出B类没有定义任何方法,B类可以调用greet方法,而且B类对象可以赋给A引用。就好比说,我想要一个人,你当然可以从学校里找一个学生,可你不能找一只狗。
但是A类对象不能赋值给B类引用,我想要一个学生,你不能给我随便来一个人。
Java中继承只有单继承,理解is-a关系就可以准确掌握继承,后面会说的接口与多态是继承的特殊情况。以后再说,现在就只要把握is-a就可以。