权限访问修饰符
这里讨论的范围有,类,同一个包,子类,不同包
对于public修饰的,那就以上四类都可以
对于protected修饰的,在不同包中不可访问
默认的也就是default修饰的,子类和其他包中不能访问
private修饰的,是权限最少的,只有同一个类中可以被访问,常用于封装,再提供setter和getter方法起到保护数据的作用
规律就是四个修饰符,四个权限范围,从大到小也就是从上到下,每次减少一个权限
什么是面向对象呢
把相关的数据和方法组织为一个整体来看待,让我们在看待程序的时候更加的贴近事物自然运行的模式
对于一个程序员而言,是思想从执行者到指挥者的变化
就一个问题而言,面象过程的解决办法是如何去解决,分哪些步骤去解决
面向对象的解决办法是,找谁去解决,那么就创建可以解决这个问题的对象,就交给这个对象了
EG: 要怎么吃饭?
对于这个场景,面向过程的解决办法是,想,首先去买菜,再烧水,放米,烧油。。。
而对于面象对象的就是,招一个保姆,保姆去解决
现在将这个问题放大,如果是一个土豪,每天除了要吃饭,还要修建,要浇水,要搞卫生。。。
这个时候,如果是面向过程的思维,就是要先这样,再这样。。。等等等等一大堆,举都举不完,栗子太多了
所以就显得不合理,就体现出了面向对象的思维的优势,我就招一个管家,让管家去处理,管家还能再招聘工人,保姆等等
面向对象的三大思想是
OOA : object oriented analysis ——面向对象分析
OOD : object oriented design——面向对象设计
OOP : object oriented programming——面向对象程序
面向对象的三大特征: 封装,继承,多态
类和对象的关系:
类就是共性的产物,是一个综合特征,对象是一个个性的产物,是从类中抽象出来的一个个具体的实例
比如有个汽车类,那就是一个综合的,四个轮子的,地上跑的,就是汽车,很大的一个概念,
对象就具体了,比如牌子叫宝马,型号是XXX,车牌照XXX,颜色XX等等
然后,类要通过对象才能进行使用,对象的所有操作都是在类中定义的
类是由属性和方法组成的,对象在使用的时候就是调用的这些个属性或者方法来具体化自身
对象创建过程中的内存的分析
创建的对象会被存储在栈内存空间中,而new过了的就会在堆内存中为其开放一块空间,有唯一的地址,栈中的对象根据该地址找到该空间
如果改变了类中定义的属性,那么就会在堆内存中相应的改变,
假设已经建立了 Book book = new Book();
现在用Book book2 = book;
也就是说现在book2指向的地址就是book1在堆内存中的地址
所以现在如果用book2对类的属性进行操作改变,是相对的堆中的地址进行了改变
而现在的book指向也还是堆中的那块地址,所以这不是一个简单的复制过程,内部的逻辑也需要理清楚
Java类中至少会有一个构造方法,也就是常说的构造器
如果没有明确的定义构造方法,系统会自动生成一个无参的构造方法(不推荐依赖此方法)
Java允许出现同名函数,这就是方法的重载
判断是否重载的方法:1.方法名是否相同 2.参数是否不同(具体体现在,类型和长度上)
对于静态修饰符Static
静态的数据会被存放在方法区中,在类被第一次加载的时候使用,可以看成是类的具体属性,而不是对象的具体属性
比如汽车店中,那么他有车,有这种那种车,那是具体的对象,对于车而言的,那么如果是卖出去了多少车,那么就是对于店而言的
用static修饰,可以通过类名.static修饰的方法或属性直接调用,
要注意
静态方法在被调用的时候,有可能还没有创建具体的对象,也就是说,没有创建对象,也可以直接通过类来调用修改static的值
但是,静态不能访问非静态,非静态可以访问静态
因为非静态可用,就说明对象已经创建,对象已经创建就说明类已经被加载,那么类呗加载就肯定能用静态的了
就像现在2020年你不能找2030年的人玩,他还没出生,但是到了2030年,他就能找你2020年的人来玩
关于代码块的问题
普通代码块,那就是普通大括号包起来的部分,写在方法里,没什么特殊的
构造代码块,写在类中,直接大括号包起来,在对象被创建的时候被调用,执行在构造方法之前
静态代码块,就是添加了static修饰符的代码块
staic{
}
这种代码块在类被加载的时候,就是第一次使用的时候而执行,因为类的加载只一次,所以这个代码块的执行也只一次
面试题:
执行顺序是?
静态——》构造代码块——》构造方法 很明显,在对象的创建之前,就需要把类加载到内存,所以静态代码块会先执行