1.面向对象编程简述
面向过程编程缺少了可重用设计性
1.1.面向对象三大特征
封装性
:所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。简而言之,内部操作对外部而言不可见(保护性
)继承性
:继承是一种能力,指的是他可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展多态性
:所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口
1.2.名词扩展
- OOA:面向对象分析
- OOD:面向对象设计
- OOP:面向对象编程
面向对象最大的特征就是可以进行生活的抽象
2.类与对象的定义和使用
2.1.类与对象的概念
类
:共性的概念对象
:一个具体的可使用的事物
编程中首先产生类(类是生产对象的蓝图
),而后再产生对象。对象的所有行为一定在类中进行了完整的定义
。
类的组成:
方法
:操作行为属性
:操作数据,描述对象的具体特点
2.2.类与对象的定义和使用
定义一个类的语法如下:
class 类名称{
属性1;
属性2;
...
属性n;
方法1(){}
方法2(){}
...
方法n(){}
}
如上是一个类的完整定义,此时类中的方法要由类的对象去调用
。Person类定义示例如下:
class Person{
public String name;
public int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getPersonInfo(){
return "姓名:" + name + "、年龄:" + age;
}
}
有了类,现在我们可以定义对象了,生产对象的语法如下:
类名称 对象名称 = new 类名称();
以Person类为例生产一个Person对象:
Person per1 = new Person("邹大",18);
通过对象调用实例变量与实例方法,代码如下:
class Person{
public String name;
public int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getPersonInfo(){
return "姓名:" + name + "、年龄:" + age;
}
}
public class Test{
public static void main(String[] args) {
Person per1 = new Person("邹大",18);
System.out.println(per1.name);
System.out.println(per1.age);
System.out.println(per1.getPersonInfo());
}
}
//邹大
//18
//姓名:邹大、年龄:18
!!!!注
:只要出现了关键字new
,就开辟了新的内存
,而Java中常说的性能调优其实就是调整内存
。
2.3.对象内存分析
我们可以简单将Java中的内存区域分为栈内存
和堆内存
两块区域(实际Java内存区域的划分远比这个复杂)
- 栈内存(
虚拟机局部变量表
):存放的是局部变量
(包含编译期可知的各种基本数据类型
,对象引用
——即堆内存的地址,可以简单理解为对象名称),Java栈是与线程对应起来的,每当创建一个线程
,JVM就会为这个线程创建一个对应的Java栈
- 堆内存:保存的是
真正的数据
,即对象的属性信息
通过如下代码分析两部分内存:
class Person{
String name;
int age;
}
public class Test {
public static void main(String[] args) {
Person per = new Person();
per.name = "tim";
per.age = 18;
}
}
main方法中的第一行代码:
Person per = new Person();
如上出现了关键字new,表名在堆上分配了内存并且产生了Person类的对象per引用这部分内容,内存图如下:
接下来两句代码:
per.name = "tim";
per.age = 18;
通过per引用设置堆中属性值,内存图如下:
对象(引用数据类型)必须在实例化后调用
,否则就会产生NullPointerException(运行时
错误),编译时不会出错。“NullPointerException”在开发中会一直存在,只有引用类型(数组、类、接口)才会产生此类异常
。一旦出现此类异常,就要根据出错位置查看引用数据类型变量是否已经初始化
。