面向对象
面向对象和面向过程都是一种语言设计思想
案例:把大象装进冰箱
面向过程:procedure oriented programming(POP)
站在问题本身的角度去思考问题,解决问题的具体实现,将一个大问题转换为很多十分基础的小问题
分析出解决问题所需要的步骤,然后把步骤一步步实现,面向对象直接关注流程
面向对象:object oriented programming(OOP)
站在人的角度进行问题思考
先对问题进行分类,然后根据不同的类进行深入的细节处理,更符合人类的认知习惯
先设计,对现实客观事物进行分类,创建出类(在类中定义功能),创建出具体的对象,让对象去做具体的事情
OOP关注宏观上把握事物之间的关系
AOP关注实现过程的细节
面向过程和面向对象之间相辅相成,面向对象无法取代面向过程,面向对象中的方法的具体实现的底层还是面向过程
类
类:是一个模板,是描述一类事务的属性和方法的集合,是表示一个客观世界某类群体的一些基本特征抽象
类是对现实世界某些具有相同特征的事物的抽象,将他们的公共属性和行为放入到一个名为类的抽象概念中,类只是一个模板我们不能直接去使用模板,就好比汽车设计图就相当于类,我们不能驾驶汽车设计图我们只能驾驶使用类实例化出来的汽车,在现实世界中我们是现有的对象再有的类,就好比我们人,一开始并没有人类这个概念慢慢地我们发现我们人都有某些相同的特征,并将这些特征抽象出来形成了一个模板,才有了人类这个抽象概念
类的结构
成员变量:描述事物的属性
方法:描述事物的行为(功能,可以做的事情)
构造方法:用于对象的创建
内部类:在类体中声明的类
块:一段没有名称的代码块
类的定义
访问权限修饰符 修饰符 class 类名{}
public访问权限修饰符修饰的类类名和文件名必须相同
对象:以类为模板在内存中创建的实际存在的实例
同一个类的每个对象有不同的成员变量存储空间
同一个类的每个对象共享该类的方法(在创建对象时,堆中存放的是方法的地址)
类和对象
类是对象的抽象,对象是类的实例化,创建对象就是实例化对象
对象的创建:
Dog dog = new Dog();// 类名 对象名 = new 类的构造方法
// 对象:具体存在的客观事物,可以拿来使用的
生活中是先有对象在有类,而编程时是先有类才能创建对象
变量
按照位置
成员变量
成员变量定义在类体中方法体之外
成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)
定义成员变量时如果不对其进行初始化,那么Java会使用默认的值进行初始化
成员变量在创建对象时会从类中复制一份到对象中
成员变量可以被类中的方法,构造方法和特定的类的语句块访问
成员变量作用的范围是整个类体
局部变量
在方法,构造方法或者语句块中定义的变量称为局部变量
局部变量可以使用Java语言中任何一种数据类型
局部变量在声明时必须进行初始化操作
局部变量的声明和初始化都是在方法中,方法结束后变量就会自动销毁
成员方法
没有被static关键字修饰的方法,可以被对象所调用
构造方法:方法名和类名相同,且没有返回值,且不需要使用void修饰
构造方法不能被final,abstract,static关键字修饰
每一个类中会默认存在一个构造方法
作用:在构造方法中为创建的对象初始化赋值
方法重载:同一个类中具有相同名字,但是参数不同的方法
参数个数,类型,顺序
方法重载与返回值无关
成员方法也可以重载
方法重载的好处:解决功能相同但是传入参数不同的情况
对象与引用
Java语言中除基本类型外的变量类型都称为引用类型
对象的创建分为三个步骤
Car car = new Car();
/**
* 1、右边的new Car(),是创建一个Car类型的对象,在创建对象时并调用了Car类的无参构造方法
* 2、左边的Car car,是创建一个Car类型的变量,可以用来指向Car类型的对象
* 3、= 用于赋值操作,把对象在堆中的地址赋值给左边的引用变量,相当于指针将左边的变量指向右边的对象,这样通过引用变量就可以调用对象中的属性和方法
*/
使用new创建的对象我们无法直接使用,必须通过声明一个指向和对象同一类型的引用变量,并通过引用变量指向对象就可以使用对象以及调用对象中的属性和方法
方法,对象和对象的引用变量由于没有在同一个空间中,所以只有对应的地址
例如:方法存放在方法区内存中所以对象在创建时堆中的方法只是对应方法的地址,对象存放在堆内存当中所以在 栈中的对象引用变量只是对应对象的地址
值传递和引用传递
this表示当前正在操作的对象,在成员方法,构造方法中使用成员变量,使用this调用
基本类型和引用类型严格意义来说都是值传递只不过基本类型在进行参数传递时会将值赋值给方法中的变量,而引用类型在进行传递时只是将地址传递给了另一个引用变量,没有重新创建新的对象,所以在被调用方法中基本类型变量的改变不会影响原来变量的值,而引用变量由于传递的是对象的地址,两个变量操作的是同一个地址所以在被调用方法中变量的改变也会影响到原来的值
static关键字
static静态,可以用来修饰类中的属性,方法,代码块和内部类
static修饰的变量为类变量,修饰的方法为类方法只有一份,随着类的加载而加载,优先于对象存在,被所有对象所共享,可以通过类名调用也可以通过对象名调用
静态的成员变量和方法会随着类的加载而加载,非静态的成员变量和方法会随着对象的创建而加载,静态的方法只能调用静态的变量和方法,非静态的方法则都可以调用
代码块
类加载
main方法在类中执行
创建类的对象
调用类中的静态变量和静态方法(静态常量在被调用是不会进行类加载)
静态代码块和实例代码块
静态代码块 在类加载时调用,如果有多个静态的按照先后顺序加载
实例代码块 在创建对象时调用,在调用构造方法之前,没创建一个对象就执行一次
为什么构造方法不能被final,static,abstract关键字修饰?
由于构造方法不能被子类所继承,而且使用final关键字修饰的方法不能被重写,所以使用final关键字修饰构造方法是没有意义的
使用abstract关键字修饰的方法没有方法体,需要由子类重写来实现,但是由于构造方法不能被子类所继承,也就无法实现父类的构造方法,所以无法使用abstract关键字修饰构造方法
构造方法是对象使用用来对成员变量进行初始化复制的,如果使用static关键字修饰,那么构造方法就是数组类的,会出现矛盾