java基础——面向对象1

来源:互联网 发布:阿斗 知乎 编辑:程序博客网 时间:2024/06/06 01:10
面向过程和面向对象:
面向过程的缺陷:
面向过程的设计,是采用至顶而下的实际方式,在设计阶段就需要考虑每一个模块应该细分成那些子模块,每一个字模块有细分为更小的子模块,如此类推,直到将模块细分为一个个函数
存在的问题:
  1. 设计不够直观,与人类的思维方式不一致;
  2. 系统软件适应性差,可扩展性差,维护性低
面向过程最大的问题在于随着系统的膨胀,面向过程将无法适应,最终导致系统的崩溃,为了解决这一种软件的危机,我们提出面向对象思想.

面向对象:一种基于面向对象的新的编程思想
三大特征:
  1. 封装
  2. 继承
  3. 多态
  4. 抽象
----------------
抽象:从特定的角度出发,从已经存在的事物中抽取我们所关注的特性,行为,
从而形成一个新的事物的思维过程,是一种从复杂到简洁的过程
类和对象的关系
具有相同特性(状态)和行为(功能)的对象的抽象就是类.因此,对象的抽象就是类,类的具体化就是对象,也就是说类的实例就是对象,类实际上就是一种数据类型
类具有特性,对象的状态,用成员变量来描述,数据封装
类具有功能.对象的性,用方法来描述
----------------------------------------------------------------------
什么是类:类是对象的类型/模板.创建
在面向对象编程里,先有类,再有对象

类的定义:
[修饰符] class 类名
{
N个成员变量
N个方法
}
----------------
定义类的注意:
  1. 如果类使用了public修饰符,必须保证当前文件名称和当前类名相同.
  2. 类名使用名称表示,类表示某一类事物,首字母大写,如果是多个单词组成使用驼峰表示法.
  3. 在面向对象的过程中,定义类的时候,专门为描述对象提供一个类,该类不需要main方法
专门再定义一个测试类来运行程序.

根据类来创建对象的语法:
类名 变量 = new 类名;
给字段设置值:
对象变量.字段名称 = 值;
获取自动的值:
该字段类 变量 = 对象变量.字段值;
通过对象调用方法:
对象变量.方法名称(传递实参);
内存分析:(成员变量才有初始值,局部变量没有,所以局部变量必须先初始化)


对象的打印和比较对象以及匿名对象和对象的生命周期
-------------------------------------------------------------------------
  1. 对象的打印操作:
打印对象的时候,打印出来的效果:Servant@14e8cee
类的名称@十六进制的hash值
其实我们打印对象,往往关注的是该对象中的数据是多少,(object的toString方法);
  1. 对象比较
==号:对于基本数据来说比较的值,对于引用数据类型比较的是在内存中的地址值
对于new关键字,表示在堆中新开辟一块内存空间,不同的内存空间,地址不同
需求:如果对象拥有完全相同的数据,我就希望表示他们相等.object 的equal方法
  1. 对象的生命周期:
对象什么时候生:每次new 就会在内存新开辟一块空间,对象开始存在
对象的结束:当堆中的对象没有被任何变量引用,此时对象就成了垃圾,就等着垃圾回收器GC来清理,当被回收的时候,对象被销毁,结束了生命周期.
  1. 匿名对象:没有名称的对象,创建对象之后就没有赋值给一个变量
New Servant();//匿名对象,只是在堆中开辟一块新的内存空间
构造器概述和趋势构造器

Student s1 = new Student();
这个代码特别像:在调用一个方法名称为student的无参数方法;
-------------------
把这个方法称之为构造方法(构造器:constructor)

编译器在编译源文件的时候,会创建一个缺省的构造器.

构造器的作用:
  1. 创建对象,凡是必须和new一起使用
  2. 完成对象的初始化操作,

构造器的特点:
  1. 构造器的名称和当前所在类的名相同
  2. 禁止定义返回类型,不要使用void作为返回类型,void student()是普通方法
假设需要些返回类型,也是student student();
左边反编译结果,右边代码
  1. 构造器中不需要使用return语句
其实构造器是有返回值的,返回的是当前创建对象的引用

编译器创建的默认构造器的特点:
  1. 符合构造器的特点
  2. 无参数的
  3. 无方法体的
  4. 如果类A没有使用public修饰,则编译器创建的构造器也没有public修饰
------------------------------------------------------------------------------------------------------------

自定义构造器及构造器重载问题
构造器:如果我们没有显示提供构造器,则编译器在编译时创建一个缺省构造器,(无参数无结构体)
如果我们显示定义了一个构造器,则编译器不再创建默认构造器.
------------------------------>某一个类至少存在一个构造器
方法的重载(overloader):避免了在同一个类中,相同功能的方法名称不同的问题.
判断的依据:两同一不同(同类同名称,参数列表不同)
------------------------>构造器是一种特殊的方法
构造器的重载 :

对象都有name 和age状态,但是不同对象的name值和age不一样的
Person p1 = new Person();
P1.name = julie;
P1.age = 18;

Person p2 = new Person();
P2.name = Allen;
P2.age = 16;

----------------------------------
Name和age是属于对象的,而生活中幼儿写东西不是属于某一个具体对象的,而是属于整个类的.比如:全世界的总数,人类的毁灭
毁灭的行为应该属于人类而不是属于某一个人
------------------------
状态和行为应该有对象和类型之分
有的状态和行为应该属于对象,不同的对象,状态和行为不一样
有的状态和行为应该属于类型,不属于对象
问题:现在如何表示人类毁灭这个行为
要解决该问,得学习static修饰
Static修饰符表示静态的,可修饰字段,方法,内部类,期修饰的成员属于类,也就是说static修饰的字眼属于类级别,而不是对象级别的
Static修饰符的特点:
  1. static修饰的成员(自动/方法),随着类的加载而加载:
当jvm把字节码加载进Jvm的时候,static修饰符就已经在内存中存在了
  1. 先于对象存在
  2. Static修饰的成员被该类型的所有对象共享
根据该类创建出来的任何对象,都可以访问static成员
  1. 直接使用类名方法static成员
因为static修饰的成员直接属于类,而不属于对象,所有可以直接使用类名.成员访问
类成员和实例成员的访问
类中的成员:字段,方法,内部类
类成员:使用static修饰的成员
实例成员:没有使用static修饰的成员
--------------------------
类成员只能访问类成员,实例成员只能实例成员
-----------------------
类成员,知己属于类,可以通过类来访问static字段和static方法
实力成员,只属于对象,通过对象来访问非static字段和非static方法
-----------------------
Static方法,只能调用static成员.
非static方法,可以访问静态成员,也可以访问实例成员

什么时候定义成static字段和方法:如果这个状态/行为属于整个事物,就直接使用static修饰
被所用对象共享.
-----------------------------------------------------------------------------------------
在开发中,往往把工具方法使用static修饰.
如果不使用static修饰,则这些方法属于该类的对象我们得先创建对象再调用方法
在开发中工具对象只需要一份即可,此时我们往往把该类设计为单例的

 说明:本文为学习整理笔记,参考别处内容而来