引言:
面向对象Q是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。
但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。
在面向对象定义之中,也规定了—些基本的特征:
(1)封装:保护内部的操作不被破坏;
(2)继承:在原本的基础之上继续进行扩充;
(3)多态:在一个指定的范围之内进行概念的转换。
对于面向对象的开发来讲也分为三个过程:OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)
类与对象时整个面向对象中最基础的组成单元。
类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。
可以一句话来总结出类和对象的区别:类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
java中一切皆对象!!!
类比现实生活,比如我们每个人,都是真真正正存在的实体,在计算机中即描述为对象。描述这些对象的时候,发现这些对象具有一些共同的特征描述这些对象的时候,发现这些对象具有一些共同的特征:
比如:
1.具有相同的属性:五官,四肢等等…
2.具有相同的行为:都要吃喝玩乐等等…
因此我们把具有相同属性和行为的一类对象抽象为类使用类来描述这类对象的特性。
举个栗子:
比如我们和彭于晏有什么区别?(我们都属于人类这个类,都是人类的对象)
共性:我俩都有五官,他有的东西。我也有,其他任何人类的对象都有。
区别:我们的属性值不同。
在程序世界中,有很多的编程范式(思想),C语言就是面向过程的编程语言。java 和 C++ 是面向对象的编程语言。
举个栗子:
大家都在描述狗吃屎这个事儿~~
C语言中=>吃狗屎=>所有的行为也罢,属性也罢,在C中都是一个接一个的方法调用,关注的就是行为本身。而 java 中 =>狗吃屎 =>是 狗 + 吃 + 屎
世界上所有的行为都可以归纳为对象+行为+对象
行为一定是某个对象发出,然后作用于另一个对象或某些对象。一切都围绕对象进行,找对象,建对象,用对象。
类和对象。谁先有?
类是描述某一些对象的统称,对象是这个类的一个实例而已。
这一类对象所具备的共同属性和行为(方法)都在类中定义。
class类名称{
// field(实例属性,成员属性)
// 行为 (实例方法,成员方法)
}
定义一个Person类:
class Person{
String name;
String sex;
int age;
void print(){
System.out.println("姓名"+ age + "性别"+ sex + "年龄" + age);
}
}
注意:
1.类的命名使用有意义的大驼峰单词命名法
从第一个单词开始首字母就大写,多个单词都是首字母大写:class Person,class ChinaPerson2.类中定义的成员变量都有默认值
类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型,我们就能根据类来产生一个具体的对象
//类名称 引用名称 = new 类名称 ();
Person per = new Person();
引用数据类型与基本数据类型最大的不同在于:引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。
当一个实例化对象产生之后,可以按照如下的方式进行类的操作:
对象.属性:表示调用类之中的属性,
对象.方法():表示调用类之中的方法。
范例:
public class ClassAndObjects {
public static void main(String[] args) {
Person person = new Person();//声明并实例化对象
Person person2 = new Person();//声明并实例化对象
person.name = "彭于晏";//操作属性内容
person.age = 18;
person.sex = "男";
person.message();//调用类中的message方法
person2.name = "老八";//操作属性内容
person2.eat("hamburger");//调用类中的eat方法
}
}
class Person {
String name;
String sex;
int age;
void eat(String food) {
System.out.println(name + " 正在吃 " + food);
}
void message() {
System.out.println("姓名: " + name + " 性别: " + sex + " 年龄: " + age);
}
}
运行结果
//姓名: 彭于晏 性别: 男 年龄: 18
//老八 正在吃 hamburger
我们从内存的角度看下空间如何分配。首先,给出两种内存空间的概念:
(1) 堆内存:保存对象的属性内容。堆内存需要用new关键字来分配空间;
(2) 栈内存:保存的是堆内存的地址(在这里为了分析方便,可以简单理解为栈内存保存的是对象的名字)。
内存表示如下图:
null在Java中表示"空引用",只有名字没有保存任何堆内存中的地址,如果直接使用值为null的引用去操作任何属性或方法(成员变量和成员方法)都会报错。
范例:
NullPointerException ->空指针异常,一定使用了一个值为null的引用去访问属性或者方法了。
未完待续…