(基本概念、对象和类、构造器、static)
一、基本概念
面向对象是站在对象的角度思考问题,把多个功能合理的放到不同对象里,强调的是具备某些功能的对象。具备某种功能的实体,称为对象。面向对象最小的程序单元是:类.
面向对象三大特征:
1:封装(Encapsulation):将对象的实现细节隐藏起来,通过公共的方法来向外暴露该对象的功能。
2:继承(Inheritance):子类继承父类,子类是一种特殊的父类,能直接或间接获得父类里的成员。
3:多态(Polymorphism):直接把子类对象赋给父类变量,但是运行时依然表现出子类的行为特征,这意味着同一类型的对象在运行时可能表现出不同的行为特征。
千万不要误解为面向对象一定就优于面向过程的设计
简单的说:编码是人的工作,面向对象更加适合人,而面向过程更适合计算机。
二、对象和类
对象可以定义成包含状态和行为的一个实体,对象(object)也称为实例(instance)。
具有相同特性(状态)和行为(功能)的对象的抽象就是类。
对象是类的实例,类是对象的模板。
类具有特性,对象的状态,用成员变量来描述,封装数据。
类具有功能,对象的行为,用方法来描述。
1、类相关
类定义类的全限定名称: 包名.类名;
2、对象
1):根据类来创建对象的语法: 类名 变量 = new 类名();
2):给字段设置值: 对象变量.字段名 = 该类型的值;
3):获取字段的值: 该字段类型 变量 = 对象变量.字段值;
4):通过对象调用方法. 对象变量.方法(实参);
对象实例化过程对象的打印和比较对象以及匿名对象和对象的生命周期:
-------------------------------------------------------------
1):对象的打印操作:
打印对象的时候,打印出来的效果,如:Servant@3294e4f4.
类的名称@十六进制的hashCode.
其实,我们打印对象,往往关系的是该对象中的数据是多少,期待讲解Obejct的toString方法.
2):对象比较操作:
==号:对于基本数据类型来说,比较的是值.
对于引用数据类型来说,比较的是在内存中的地址值.
每次使用new关键字,都表示在堆值新开辟一块内存空间,不同的内存空间,地址值不同.
需求:如果对象拥有完全相同的数据,我就想让他们相等. 期待:Object的equals方法.
3):对象的生命周期:
对象什么时候出生:每次使用new关键字的时候,就会在内存开辟新的空间,此时对象开始存在.
对象的结束:当堆中的对象,没有被任何变量所引用,此时该对象就成了垃圾,就等着垃圾回收器(GC)来回收该垃圾,当被回收的时候,对象被销毁了,回收垃圾的目的,释放更多的内存空间.
4):匿名对象: 没有名称的对象,创建对象之后没有赋给某一个变量.
new Servant();//匿名对象,匿名对象只是在堆中开辟一块新的内存空间,但是没有把该空间地址赋给任何变量.
因为没有名称,匿名对象仅仅只能使用一次,一般的,把匿名对象作为方法的实参传递.
三、构造器
构造器:如果我们没有显示提供构造器,则编译器在编译时创建一个缺省的构造器.
但是,如果我们显示定义了一个构造器,则编译器不再创建默认构造器.
构造器是一种特殊的方法,也可以存在重载.
四、static
static修饰的资源属于类级别,而不是对象级别。
static修饰符的特点:
1):static修饰的成员(字段/方法),随着所在类的加载而加载. 当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了.
2):优先于对象的存在. 对象是我们手动通过new关键字创建出来的.
3):satic修饰的成员被该类型的所有对象所共享. 根据该类创建出来的任何对象,都可以访问static成员.
表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系(通过反编译看到的).
4):直接使用类名访问static成员 因为static修饰的成员直接属于类,不属于对象,所以可以直接使用类名访问static成员.
什么时候定义成static的字段和方法:
如果这个一个状态/行为属于整个事物(类),就直接使用static修饰. 被所有对象所共享.
在开发中,往往把工具方法使用static修饰.(工具对象只需要一份即可,把该类设计为单例的)
网友评论