- 面向对象oop
- 面向对象与面向过程的区别
- 面向过程PO:这种编程思想强调的是过程,凡事亲力亲为
- 优点:性能比面向对象要高,因为类调用的时候需要实例化,资源消耗更大,比如单片机、嵌入式开发、Linux/Unix一般是面向过程开发,性能是最重要的因素
- 缺点:没有面向对象容易维护,容易扩展、容易复用
- OOP将数据封装于类中 完全面型对象 强调结果
- 优点:易维护易扩展易复用,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使得系统更加灵活,更加易于维护。
- 抽象会使复杂的问题更加简单化。
- 从以前面向过程的执行者,变成了张张嘴的指挥者。
- 面向对象更符合人类的思维,面向过程则是机器的思想
- 缺点:性能比面向过程低
- 优点:易维护易扩展易复用,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使得系统更加灵活,更加易于维护。
- 面向过程PO:这种编程思想强调的是过程,凡事亲力亲为
- 三大特性
- 封装
- 隐藏细节 只给出使用信息、使用方式,比如类和方法
- 隐藏对象的属性和实现细节
- 封装可以提高程序的安全性与复用性
- 高内聚
- 封装可以让资源按照我们预先规定的方式来操作
- 封装可以提高程序的安全性与复用性
- 使用private关键字进行封装
- 属性封装
- 右键空白处->Generate->Getter and Setter->选中subject属性->OK 自动生成一个公共的方式,供外界操作封装的属性的属性值
- setXxx – 对外提供公共的设置值方式
- getXxx – 对外提供公共的获取值方式
- 右键空白处->Generate->Getter and Setter->选中subject属性->OK 自动生成一个公共的方式,供外界操作封装的属性的属性值
- 方法封装
- 把私有方法放在公共方法里供外界调用即可
- 类的封装
- 在公共方法clean()中调用封装方法eat()的功能
- 属性封装
- 隐藏对象的属性和实现细节
- 隐藏细节 只给出使用信息、使用方式,比如类和方法
- 继承
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 继承提高代码复用性、降低开发周期和开发费用
- 继承是多态的前提
- 普遍性
- 父类中有的成员变量方法 子类也有
- 特殊性
- 增加父类没有的变量和方法 或者修改父类已有的变量和方法
- 特点
- 使用extends关键字来表示继承关系
- Java只支持单继承
- 相当于子类把父类的功能复制了一份
- 一个儿子只有一个爸爸 单继承(Java只支持单继承 多重继承是通过一个类继承多个接口实现的)
- 继承可以传递(爷爷/儿子/孙子这样的关系)
- 子类继承父类后,可以使用父类所有的非私有资源 私有资源也被继承 但是因为访问受限(private)不能使用
- 父类的私有成员也会被继承,但由于私有限制访问,所以子类不能使用父类的私有资源
- 继承多用于功能的修改,子类可以在拥有父类功能的同时,进行功能拓展
- 像是is a的关系
- 继承要求子类必须是父类的一种下属属性,依赖强,强耦合
- 继承的好处与坏处
- 好处
- 提高了代码的复用性(多个类相同的成员可以放在同一个类中)
- 提高了代码的维护性(如果方法的代码需要修改,只修改一处即可)
- 坏处
- 继承让类与类建立了关系,类的耦合性增强
- 当父类发生变化时,子类实现也不得不跟着变化,削弱了子类的独立性
- 好处
- super
- super可以理解为指向自己父类的一个指针,这个父类指的是离自己最近的一个父类
- 普通的直接引用
- 与this类似,super相当于是指向当前对象的父类的引用,这样就可以用super.xxx来引用父类的成员。
- 子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分
- 引用父类构造函数
- 子类在创建对象时默认调用父类的构造方法 因为子类构造函数时第一行默认存在super();--表示调用父类的无参构造
- 父类没有无参构造时,可以通过super(参数)调用父类的其他构造函数 子类必须调用一个父类的构造函数,无论有参还是无参必须选择一个
- this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
- super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
- 构造方法不能被继承 因为语法原因:要求构造方法名字必须是本类类名,不能在子类中出现一个父类名字的构造方法
- 普通的直接引用
- super可以理解为指向自己父类的一个指针,这个父类指的是离自己最近的一个父类
- 继承提高代码复用性、降低开发周期和开发费用
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 多态
- 不同类的对象接受到相同的信息时 得到不同的结果
- 前提
- 多态的前提1:是继承
- 多态的前提2:要有方法的重写
- 分类
- 静态多态性
- 动态多态性
- 实现
- 方法重载
- 一个类中有多个相同名字的方法 但这些方法的参数不同 参数个数或者参数类型不同
- 方法覆盖/重写
- 在子类中重写了父类的同名方法
- 方法重载
- 优点
- 多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法
- 提高了程序的可扩展性和可维护性
- 使用
- 多态对象把自己看做是父类类型
- 成员变量: 使用的是父类的
- 成员方法: 由于存在重写现象,所以使用的是子类的
- 静态成员: 随着类的加载而加载,谁调用就返回谁的
- 多态对象把自己看做是父类类型
- 口诀
- 父类对象不能使用子类的特有功能
- 父类引用指向子类对象
- 创造出来子类的地址值,交给父类类型的引用变量来保存
- 编译看左边,运行看右边
- 必须在父类在定义这个方法,才能通过编译,因为多态对象认为自己时父类类型 必须在子类中重写父类的方法 才能满足多态 实际干活的是子类
- 前提
- 目的 为了统一调用标准
- 不同类的对象接受到相同的信息时 得到不同的结果
- 第四特征 抽象
- 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
- 封装
- 七大原则
- 单一职责原则 一个类只干一件事,实现类要单一 便于理解,提高代码的可读性
- 开闭原则 对扩展开放,对修改关闭 降低维护带来的新风险
- 里氏替换原则 不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义 防止继承泛滥
- 依赖倒置原则 高层不应该依赖低层,要面向接口编程 更利于代码结构的升级扩展
- 接口隔离原则 一个接口只干一件事,接口要精简单一 功能解耦,高聚合、低耦合
- 迪米特法则 不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度 只和朋友交流,不和陌生人说话,减少代码臃肿
- 合成复用原则 尽量使用组合或者聚合关系实现代码复用,少使用继承 降低代码耦合
- 编写顺序
- 类 属性 方法 对象 修改对象的属性 通过对象调用方法
- 属性 方法 放在类中
- 同一类中的方法调用 不用创建对象
- 同一类中的方法调用 不用创建对象
- 运行顺序
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 1.当创建对象时,会触发构造函数
- 2.创建对象时,也会触发构造代码块,并且构造代码块优先于构造方法执行
- 3.我们创建好对象后才能通过对象调用普通方法
- 4.如果普通方法里有局部代码块,才会触发对应的局部代码块
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 类 属性 方法 对象 修改对象的属性 通过对象调用方法
- 面向对象与面向过程的区别
- 类/方法/变量/代码块
- 类
- 类是同一类型对象的抽象,对象是类的实体化,一类事物抽取共同属性与功能形成的
- 包含属性方法
- 属性
- 方法
- 普通方法
- 方法
- 方法定义的格式
-
- 方法的格式:修饰符 返回值类型 方法名(参数列表){方法体}
- 返回值类型不为空的话 需要return返回值
- 返回值类型(int)必须和返回的值的类型(return x)一致
- 方法的格式:修饰符 返回值类型 方法名(参数列表){方法体}
-
- 方法调用顺序图
-
- 调用方法的格式:方法名+参数列表
-
- 方法定义的格式
- 方法
- 构造方法/函数
- 概念
- 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
- 构造方法的主要功能就是完成对象创建或者初始化
- 当类创建对象(实例化)时,就会自动调用构造方法
- 构造方法与普通方法一样也可以重载.
- 作用
- 创造对象/初始化
- 每次 实例化对象 (new对象 )都会触发对应类的构造方法
- 格式 与类同名,且没有返回值类型,可以含参也可以不含参
- 创造对象/初始化
- 分类
- 无参构造
- 每个类都会默认存在一个没有参数的构造方法
- 如果提供了其他构造函数,默认的构造函数会被覆盖,所以我们要手动构建无参构造,为了不传参数也能创建对象
- 每个类都会默认存在一个没有参数的构造方法
- 含参构造
- 有一个参数
- 全参构造
- 全部参数(与本类属性完全一致)
- 创造对象时,能给此对象所有属性赋值
- 全部参数(与本类属性完全一致)
- 无参构造
- 概念
- 方法的重载
- 在一个类中定义多个同名的方法,在一个类中定义多个同名的方法,但是每个方法的参数列表不同(也就是指参数的个数和类型不同),程序在调用方法时,可以通过传递给他们的不同个数和类型的参数来决定具体调用哪个方法.
- 同一个类中,多个方法名相同,参数个数不同,一定构成重载
- 同一个类中,多个方法名相同,参数个数相同:看看对应参数位置上的参数类型 如果相同不重载 如果不同构成重载
- 在同一个类中,存在多个方法名相同,参数列表不同的方法在在
- 在一个类中定义多个同名的方法,在一个类中定义多个同名的方法,但是每个方法的参数列表不同(也就是指参数的个数和类型不同),程序在调用方法时,可以通过传递给他们的不同个数和类型的参数来决定具体调用哪个方法.
- 方法重写Override
- 继承以后,子类就拥有了父类的功能
- 在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
- 子类中方法的签名与父类完全一样时,会发生覆盖/复写的现象
- 注意: 父类的私有方法不能被重
- 要求
- 两同:子类方法的 方法名与参数列表 和父类方法的相同
- 一大:子类方法的 方法修饰符权限 >= 父类方法的
- 两小:子类方法的返回值类型 <= 父类方法的返回值类型
- 注意:这里所说的<=是指子类方法的返回值类型是父类返回值类型的子类或者与父类的返回值类型一致,如果父类方法的返回值类型是void,子类保持一致即可
- 构造函数\this\方法重写、重载的区别
- 构造方法
- 构造方法的作用
- 一是创建对象时调用构造方法创建对象
- 二是可以初始化多个属性
- 构造函数的结构及注意事项
- 1、结构:【public 类名([参数类型1 参数名1,参数类型2 参数名2..... ])】
- 2、参数可无
- 3、一般在创建一个类的时候,如果创建的类没有构造函数程序会自动创建一个默认的无参构造函数,当你在类中已经写有构造函数,那么默认无参构造函数将会被覆盖,也就是不存在。
- 构造函数不能被继承
- 构造方法的作用
- 关键字this
- this主要有三个作用:
- 1、在本类中作为对象调用属性,在属性名与参数名相同时,需要用this来调用属性给属性赋值,否则无法赋值。
- 2、调用构造函数
- 3、可以返回本类对象(目前用途我还不是很清楚...)
- this主要有三个作用:
- 方法重载
- 方法重载是在同一个类中写的
- 是为了外界调用方法时方便,不管传入什么样的参数,都可以匹配到对应的同名方法
- 其次方法重载是要求方法名相同,返回类型、参数列表(类型与个数)至少要有一个不一样
- 方法重载是在同一个类中写的
- 重写
- 方法重写是建立了继承关系以后在子类中对父类的方法进行重写,也就是不同类中
- 方法重写要求方法名,返回类型、参数类型、参数个数全部相同
- 方法重写的访问权限只能扩大(权限大小:public > protected > 缺省 > private),而方法重载对权限无要求。
- 两同:子类方法的 方法名与参数列表 和父类方法的相同
- 一大:子类方法的 方法修饰符权限 >= 父类方法的
- 两小:子类方法的返回值类型 <= 父类方法的返回值类型
- 注意:这里所说的<=是指子类方法的返回值类型是父类返回值类型的子类或者与父类的返回值类型一致,如果父类方法的返回值类型是void,子类保持一致即可
- 构造方法
- 普通方法
- 访问控制符
-
- java中子类的定义为在有继承关系的类中extends前面的类则是子类
- 子类与父类可以跨包继承,也就是子类与父类并不一定在同一个包
- 由小到大 private ->default->protected->public private
-
- 对象(实例)
- 流程
- Person p = new Person();//短短这行代码发生了很多事情
- 1.把Person.class文件加载进内存
- 2.在栈内存中,开辟空间,存放引用变量p
- 3.在堆内存中,开辟空间,存放Person对象
- 4.对成员变量进行默认的初始化
- 5.对成员变量进行显示初始化
- 6.执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)
- 7.堆内存完成
- 8.把堆内存的地址值赋值给变量p ,p就是一个引用变量,引用了Person对象的地址值
- Person p = new Person();//短短这行代码发生了很多事情
- 调用 属性 方法
- 对象就是事务的名字 对象就是根据类创建出来的一个个独立且具体的实例
- 一个类可以创建出多个对象,我们通过对象唯一的地址值区分不同的对象
- 对象具有各种特征,并且每个对象的每个特征都可以有自己特定的值
- 对象具有各种行为,每个对象可以执行的操作
- 每个对象具有三个特点:对象的状态(属性),对象的行为(功能)和对象的标识。
- 对象的状态用来描述对象的基本特征。
- 对象的行为用来描述对象的功能。
- 对象的标识是指对象在内存中都有一个唯一的地址值用来和其他对象区分开来
- 类和对象的关系
- 我们先创建类,再通过类创建出对象
- 我们可以通过一个类创建出多个对象
- 类是抽象的,对象是具体的
- 创建对象时内存发生了什么
不熟悉- 在栈内存中开辟一块空间,Phone类型的引用类型变量p,把p压入栈底,此时p只有一个默认值null
- 在堆内存中开辟一块空间用于存放Phone类型的对象
- 要给这个对象进行初始化,比如:String brand = null;
- 此对象已经准备好,所以会生成一个唯一的地址值,并将这个地址值交给栈内存中的变量p来保存
- 如果后续想要对对象做操作,比如:p.price=88.8;先会找到栈中p变量保存的地址值,根据这个地址找到堆中的对象再做进一步的操作
-
-
- p有没有默认值得看是不是成员变量
-
-
- 流程
- 代码块
- 分类
- 构造代码块(成员变量位置)
- 位置 类里方法外
- 作用 用于提取所有构造方法的共性功能
- 执行时机 每次创建对象都会执行构造代码块,并且优于构造函数执行
- 局部代码块(局部变量位置)
- 位置 方法里
- 执行时机 调用所处方法时才会执行
- 作用 用于控制变量的执行范围,变量的作用范围越小越好
- 静态代码块
- 创造静态代码块 类里方法外 静态代码块也属于静态资源,随着类的加载而加载,优于对象加载
- 静态代码块也是静态资源 只会加载一次
- 作用:用于需要第一时间加载,并且只加载一次的资源,常用来初始化
- 特点: 被static修饰,位置在类里方法外
- 构造代码块(成员变量位置)
- 三种代码块的比较
- 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
- 构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
- 局部代码块:方法里的代码块,限制局部变量的范围
- 运行顺序
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 1.当创建对象时,会触发构造函数
- 2.创建对象时,也会触发构造代码块,并且构造代码块优先于构造方法执行
- 3.我们创建好对象后才能通过对象调用普通方法
- 4.如果普通方法里有局部代码块,才会触发对应的局部代码块
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 分类
- 静态变量和实例变量的区别
- 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
- 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
- 静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
- 运行顺序
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 1.当创建对象时,会触发构造函数
- 2.创建对象时,也会触发构造代码块,并且构造代码块优先于构造方法执行
- 3.我们创建好对象后才能通过对象调用普通方法
- 4.如果普通方法里有局部代码块,才会触发对应的局部代码块
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 类
- 类/方法/变量/代码块
- 类
- 类是同一类型对象的抽象,对象是类的实体化,一类事物抽取共同属性与功能形成的
- 包含属性方法
- 属性
- 方法
- 普通方法
- 方法
- 方法定义的格式
-
- 方法的格式:修饰符 返回值类型 方法名(参数列表){方法体}
- 返回值类型不为空的话 需要return返回值
- 返回值类型(int)必须和返回的值的类型(return x)一致
- 方法的格式:修饰符 返回值类型 方法名(参数列表){方法体}
-
- 方法调用顺序图
-
- 调用方法的格式:方法名+参数列表
-
- 方法定义的格式
- 方法
- 构造方法/函数
- 概念
- 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
- 构造方法的主要功能就是完成对象创建或者初始化
- 当类创建对象(实例化)时,就会自动调用构造方法
- 构造方法与普通方法一样也可以重载.
- 作用
- 创造对象/初始化
- 每次 实例化对象 (new对象 )都会触发对应类的构造方法
- 格式 与类同名,且没有返回值类型,可以含参也可以不含参
- 创造对象/初始化
- 分类
- 无参构造
- 每个类都会默认存在一个没有参数的构造方法
- 如果提供了其他构造函数,默认的构造函数会被覆盖,所以我们要手动构建无参构造,为了不传参数也能创建对象
- 每个类都会默认存在一个没有参数的构造方法
- 含参构造
- 有一个参数
- 全参构造
- 全部参数(与本类属性完全一致)
- 创造对象时,能给此对象所有属性赋值
- 全部参数(与本类属性完全一致)
- 无参构造
- 概念
- 方法的重载
- 在一个类中定义多个同名的方法,在一个类中定义多个同名的方法,但是每个方法的参数列表不同(也就是指参数的个数和类型不同),程序在调用方法时,可以通过传递给他们的不同个数和类型的参数来决定具体调用哪个方法.
- 同一个类中,多个方法名相同,参数个数不同,一定构成重载
- 同一个类中,多个方法名相同,参数个数相同:看看对应参数位置上的参数类型 如果相同不重载 如果不同构成重载
- 在同一个类中,存在多个方法名相同,参数列表不同的方法在在
- 在一个类中定义多个同名的方法,在一个类中定义多个同名的方法,但是每个方法的参数列表不同(也就是指参数的个数和类型不同),程序在调用方法时,可以通过传递给他们的不同个数和类型的参数来决定具体调用哪个方法.
- 方法重写Override
- 继承以后,子类就拥有了父类的功能
- 在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
- 子类中方法的签名与父类完全一样时,会发生覆盖/复写的现象
- 注意: 父类的私有方法不能被重
- 要求
- 两同:子类方法的 方法名与参数列表 和父类方法的相同
- 一大:子类方法的 方法修饰符权限 >= 父类方法的
- 两小:子类方法的返回值类型 <= 父类方法的返回值类型
- 注意:这里所说的<=是指子类方法的返回值类型是父类返回值类型的子类或者与父类的返回值类型一致,如果父类方法的返回值类型是void,子类保持一致即可
- 构造函数\this\方法重写、重载的区别
- 构造方法
- 构造方法的作用
- 一是创建对象时调用构造方法创建对象
- 二是可以初始化多个属性
- 构造函数的结构及注意事项
- 1、结构:【public 类名([参数类型1 参数名1,参数类型2 参数名2..... ])】
- 2、参数可无
- 3、一般在创建一个类的时候,如果创建的类没有构造函数程序会自动创建一个默认的无参构造函数,当你在类中已经写有构造函数,那么默认无参构造函数将会被覆盖,也就是不存在。
- 构造函数不能被继承
- 构造方法的作用
- 关键字this
- this主要有三个作用:
- 1、在本类中作为对象调用属性,在属性名与参数名相同时,需要用this来调用属性给属性赋值,否则无法赋值。
- 2、调用构造函数
- 3、可以返回本类对象(目前用途我还不是很清楚...)
- this主要有三个作用:
- 方法重载
- 方法重载是在同一个类中写的
- 是为了外界调用方法时方便,不管传入什么样的参数,都可以匹配到对应的同名方法
- 其次方法重载是要求方法名相同,返回类型、参数列表(类型与个数)至少要有一个不一样
- 方法重载是在同一个类中写的
- 重写
- 方法重写是建立了继承关系以后在子类中对父类的方法进行重写,也就是不同类中
- 方法重写要求方法名,返回类型、参数类型、参数个数全部相同
- 方法重写的访问权限只能扩大(权限大小:public > protected > 缺省 > private),而方法重载对权限无要求。
- 两同:子类方法的 方法名与参数列表 和父类方法的相同
- 一大:子类方法的 方法修饰符权限 >= 父类方法的
- 两小:子类方法的返回值类型 <= 父类方法的返回值类型
- 注意:这里所说的<=是指子类方法的返回值类型是父类返回值类型的子类或者与父类的返回值类型一致,如果父类方法的返回值类型是void,子类保持一致即可
- 构造方法
- 普通方法
- 访问控制符
-
- java中子类的定义为在有继承关系的类中extends前面的类则是子类
- 子类与父类可以跨包继承,也就是子类与父类并不一定在同一个包
- 由小到大 private ->default->protected->public private
-
- 对象(实例)
- 流程
- Person p = new Person();//短短这行代码发生了很多事情
- 1.把Person.class文件加载进内存
- 2.在栈内存中,开辟空间,存放引用变量p
- 3.在堆内存中,开辟空间,存放Person对象
- 4.对成员变量进行默认的初始化
- 5.对成员变量进行显示初始化
- 6.执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)
- 7.堆内存完成
- 8.把堆内存的地址值赋值给变量p ,p就是一个引用变量,引用了Person对象的地址值
- Person p = new Person();//短短这行代码发生了很多事情
- 调用 属性 方法
- 对象就是事务的名字 对象就是根据类创建出来的一个个独立且具体的实例
- 一个类可以创建出多个对象,我们通过对象唯一的地址值区分不同的对象
- 对象具有各种特征,并且每个对象的每个特征都可以有自己特定的值
- 对象具有各种行为,每个对象可以执行的操作
- 每个对象具有三个特点:对象的状态(属性),对象的行为(功能)和对象的标识。
- 对象的状态用来描述对象的基本特征。
- 对象的行为用来描述对象的功能。
- 对象的标识是指对象在内存中都有一个唯一的地址值用来和其他对象区分开来
- 类和对象的关系
- 我们先创建类,再通过类创建出对象
- 我们可以通过一个类创建出多个对象
- 类是抽象的,对象是具体的
- 创建对象时内存发生了什么
不熟悉- 在栈内存中开辟一块空间,Phone类型的引用类型变量p,把p压入栈底,此时p只有一个默认值null
- 在堆内存中开辟一块空间用于存放Phone类型的对象
- 要给这个对象进行初始化,比如:String brand = null;
- 此对象已经准备好,所以会生成一个唯一的地址值,并将这个地址值交给栈内存中的变量p来保存
- 如果后续想要对对象做操作,比如:p.price=88.8;先会找到栈中p变量保存的地址值,根据这个地址找到堆中的对象再做进一步的操作
-
-
- p有没有默认值得看是不是成员变量
-
-
- 流程
- 代码块
- 分类
- 构造代码块(成员变量位置)
- 位置 类里方法外
- 作用 用于提取所有构造方法的共性功能
- 执行时机 每次创建对象都会执行构造代码块,并且优于构造函数执行
- 局部代码块(局部变量位置)
- 位置 方法里
- 执行时机 调用所处方法时才会执行
- 作用 用于控制变量的执行范围,变量的作用范围越小越好
- 静态代码块
- 创造静态代码块 类里方法外 静态代码块也属于静态资源,随着类的加载而加载,优于对象加载
- 静态代码块也是静态资源 只会加载一次
- 作用:用于需要第一时间加载,并且只加载一次的资源,常用来初始化
- 特点: 被static修饰,位置在类里方法外
- 构造代码块(成员变量位置)
- 三种代码块的比较
- 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
- 构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
- 局部代码块:方法里的代码块,限制局部变量的范围
- 运行顺序
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 1.当创建对象时,会触发构造函数
- 2.创建对象时,也会触发构造代码块,并且构造代码块优先于构造方法执行
- 3.我们创建好对象后才能通过对象调用普通方法
- 4.如果普通方法里有局部代码块,才会触发对应的局部代码块
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 分类
- 静态变量和实例变量的区别
- 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
- 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
- 静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
- 运行顺序
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 1.当创建对象时,会触发构造函数
- 2.创建对象时,也会触发构造代码块,并且构造代码块优先于构造方法执行
- 3.我们创建好对象后才能通过对象调用普通方法
- 4.如果普通方法里有局部代码块,才会触发对应的局部代码块
- 静态代码块->构造代码块->构造方法->普通方法->局部代码块
- 类
- 内部类
- 特点
- 1) 内部类可以直接访问外部类中的成员,包括私有成员
- 2) 外部类要访问内部类的成员,必须要建立内部类的对象
- 3) 在成员位置的内部类是成员内部类
- 4) 在局部位置的内部类是局部内部类
- 内部类对象根据内部类位置不同分为
- 成员内部类(类里方法外)
- 局部内部类(方法里)
- 创建对象的格式
- 外部类名.内部类名 对象名=外部类对象.内部类对象
- 资源调用
- 内部类可以直接调用外部类的资源,包括私有资源,外部类使用内部类的资源时,需要先创建内部类的对象,通过内部类对象来调用
- 成员内部类被封装
- 需要在外部创立公共方法,间接访问内部资源
- 静态内部类不需要先创建外部类对象,而是要先通过外部类的类名找到内部类,再创建内部类的对象
- 如果静态内部类有静态资源,可以不创建一个对象,就通过外部类名.内部类名.静态资源名 的链式加载的方式,使用资源
- 直接创建外部类对象,调用局部内部类所处的方法时,并不会触发内部类的功能需要在内部类所处的方法中,创建内部类对象,并调用其功能,功能才会被触发
- 匿名内部类没有名字,通常与匿名对象结合在一起使用
- 如果想要多次使用实现后的功能,还是要创建之前的普通对象,匿名对象只能使用一次,一次只能调用一个功能,匿名内部类其实就是充当了实现类的功能,去实现未实现的方法,只是没有名字而已
- 没懂
- 特点