JavaSE基础之面向对象
一、面向对象简述
面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。
但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。
在面向对象定义之中,也规定了一些基本的特征:
(1)封装:保护内部的操作不被破坏;
(2)继承:在原本的基础之上继续进行扩充;
(3)多态:在一个指定的范围之内进行概念的转换。
对于面向对象的开发来讲也分为三个过程:OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)。(Object Oriented 面向对象)
二. 类与对象
1.类
1)是同类型东西的概念,是对现实生活中事物的描述,映射到Java中描述就是class定义的类。类是对象的模板、图纸,是对象的数据结构定义。简单说就是“名词”。
2)其实定义类,就是在描述事物,就是在定义属性(变量)和方法(函数)。
3)类中可以声明:属性,方法,构造器;属性(变量)分为:实例变量,局部变量;
实例变量:用于声明对象的结构的,在创建对象 时候分配内存,每个对象有一份!实例变量(对象属性)在堆中分配,并作用于整个类中,实例变量有默认值,不初始化也能参与运算;
局部变量: 在栈中分配,作用于方法或语句中,必须初始化,有值才能运算。
4)类与类之间的关系:
①关联:一个类作为另一个类的成员变量:需要另一个类来共同完成。class A { pulic B b } class B {}
②继承:class B extends A {} class A {}
③依赖:个别方法和另一个类相关。class A { public void f(B b) {}//参数里有B public B g() {}//返回值里有B } class B {}
5)null与空指针异常:引用类型变量用于存放对象的地址,可以给引用类型赋值为null(如: Person per = null;//声明对象 ),表示不指向任何对象。当某个引用类型变量为null时无法对对象实施访问(因为它没有指向任何对象)。此时,如果通过引用访问成员变量或调用方法,会产生NullPointerException空指针异常。
注意事项:除了8中基本类型,其他都是引用类型变量。
2.对象
类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型
对象是一类事物实实在在存在的个体!利用类做为模板创建的个体实例,本质是数据。
匿名对象:使用方式一:当对象的方法只调用一次时,可用匿名对象来完成,这样比较简化。如果对一个对象进行多个成员调用,则必须给这个对象起个名字。
使用方式二:可以将匿名对象作为实际参数进行传递。
class A { public void f(B b) {}//参数里有B } class B { } public void Test() { A a = new A(); a.f(new B(初始化参数)); }
声明对象方式:
(1)格式一:声明并实例化对象
类名称 对象名称 = new 类名称 () ;
(2)格式二:先声明对象,然后实例化对象:
类名称 对象名称 = null ;
对象名称 = new 类名称 () ;
引用数据类型与基本数据类型最大的不同在于:引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。
当一个实例化对象产生之后,可以按照如下的方式进行类的操作:
对象.属性:表示调用类之中的属性;
对象.方法():表示调用类之中的方法。
3.引用传递
看下面示例:
class Person { String name ; int age ; public void tell() { System.out.println("姓名:" + name + ",年龄:" + age) ; } } public class TestDemo { public static void main(String args[]) { Person per1 = new Person() ; // 声明并实例化对象 per1.name = "张三" ; per1.age = 20 ; Person per2 = per1 ; // 引用传递 想创建的对象per1 也指向了 per2的堆内存地址 per2.name = "李四" ; // per2 与 per1 指向的地址内容发生改变 per1.tell() ; } }
class Person { String name ; int age ; public void tell() { System.out.println("姓名:" + name + ",年龄:" + age) ; } } public class TestDemo { public static void main(String args[]) { Person per1 = new Person() ; // 声明并实例化对象 Person per2 = new Person() ; per1.name = "张三" ; per1.age = 20 ; per2.name = "李四" ; per2.age = 30 ; per2 = per1 ;// 引用传递 per2也指向了 per1的内存地址 per2.name = "王五" ; //per2 与 per1 指向的地址内容发生改变 per1.tell() ; } }
4.垃圾