类和对象重难点总结1
引入🤡
面向对象的语言三大特性:封装,继承,多态。要很好的理解它们,首先我们得很清晰的理解 类和对象,这也是很抽象,给人一种很难理解的感觉,今天我们一起来看看这其中到底有什么玄机吧!🤡🤡🤡
类和对象的对话
类:我现在要制定一套标准,你们要想使用我,必须按照我的规则行事!
对象:我要去想使用一些类,但是我必须得遵循有我想要使用对象得规则!
类:好的,你既然想要使用我,那我就来说一下我的规则:
- 我有三个组成部分,对象你要仔细听:字段(Filed),⽅法(Method),构造⽅法(Constructor),当然我也有可能去指定其它的标准(内部类);
- 字段我也把它叫做成员变量,有时候也叫做实例变量,在编译时不占⽤内存空间,在运⾏时获取内存,也就是说,只有在对象实例化( new 一个对象)后,字段才会获取到内存,这也正是它被称作“实例”变量的原因。
- 方法也叫做成员方法,听清楚了吗?我叫成员方法,我没有别的名字,比如我的好兄弟–实例变量。那为什么我不叫实例方法了?那我可要好好给你说道说道了。其实我比我的好兄弟先来到这个世界上,在类加载的时候,我就和我的好兄弟(实例变量)的表弟静态变量一起来到了一个美好的地方–方法区。为什么我要这么做了?在类(Class)文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
- 随着成员方法的离去,成员变量也想出来看看,毕竟世界这么大,伴随着new 类名()的一声令下,调用了构造方法,一个对象产生了,而构造方法局会对成员变量约法三章,人家也是由占有欲的嘛,构造方法对他的“小娇妻”规定了,必须按照我给定的值来初始化你们,如果有一天我忘了,你们也必须按照我给定的规则(默认构造方法)来约束自己(基本数据类型初始为0,boolean类型为false,引用类型为null),千万不可以乱来哦!
对象:我一定遵守这些规则,类大人,请实例化我把!
访问权限修饰符之间的攀比
private:我是一个非常害羞的一个人,我不能修饰外部类,如果我修饰了它们,它们就不能被实例化了,我只能修饰一些成员变量和非必要公开的方法,java中的封装也就是我来实现的,我是不是很厉害了,对于一些想隐藏的变量或者方法,只需要我去和它们呆在一起就可以了。
默认(default):我也叫做包访问权限,我所修饰的类,变量,方法,能在整个包中被访问到,包就是一个文件夹,里面放的是class文件,我是不是比前面那个私有的家伙开朗多了?
protected:我叫继承访问权限,总能听得到一句:“你是想笑死我,然后继承我的花呗?”的笑话,我和这个笑话中的继承有什么区别了?被我修饰的东西,我是喜欢认干儿子的,被我当作干儿子的小伙子,你就得到了老夫的认可,可以访问我!但也就是我的这个认干儿子的特点,外部类不愿意被我修饰。举个例子,如果类A用protected修饰,与类A不同包的类B想要访问类A的话,类B就必须是继承类A的(或者说类B必须为类A的子类),但是类B继承类A的前提又是类B可以访问到类A,有点绕对吧,仔细想想会发现这里是冲突的,其实这就说明了为什么不能用protected来修饰外部类。再说,protected是用来表示在继承关系中的访问权限的,在同一个包和子类中都可以访问,因为继承就是为了拥有父类的属性和方法,所以protected是用于修饰类的方法和属性的,也就是说,我想要这个类的属性和方法可以被任何子类继承,我就用protected。
public:我就是太阳!!!常常听到有很多年轻人向往自由,老夫也不懂凡尔赛,老夫生下来就是无拘无束,没有人控制的日子是真的好难受啊!正在这时,某位bug员打开了源码,将所有public改成了private,然后他的脸上露出了某种笑容~~~老夫对于这种“来骗,来偷袭的行为感到不耻”,对于某些bug员的“不讲武德”的行为感到羞耻😏想想还是算了,谁让我没什么能管的了,它们嫉妒罢了!
累不累?内部类?
21世纪的我们虽然处于相对和平的年代,但是每天的工作学习压力也还是很大,你累不累了?java中似乎也玩懂了这个谐音梗,给类里面定义一个类的这种方式叫做内部类。
内部类分为:实例内部类,静态内部类,局部内部类
实例内部类
实例内部类,顾名思义,可以理解为一个实例成员,调用一个实例成员需要对象,没错我们能需要一个外部类的对象的引用来创建这个内部类的对象,当然这个值得注意的是这个内部类的成员中不能有静态的,因为静态修饰的成员是类加载的时候就会被执行,而如果写在内部类当中,就会拖到后面的实例化内部类的时候去执行这是不应该的。当让对于实例化内部类可以加上一个final修饰成员属性,这样就可以认为他是一个常量,在编译期间就确定了!
在实例内部类当中 获取外部类的this : 外部类.this
而外部类访问内部类必须创建内部类对象
静态内部类
就是内部类被static修饰了,也只有内部类才能被static修饰,外部类是没有这种待遇的。其中静态内部类只能访问外部类静态的方法和属性,为什么了?因为外部类的非静态成员需要依赖外部类的对象去访问,而我们在创建静态内部类对象时并没有产生外部类对象的引用!其余的内部类可以访问所有的外部类成员变量及方法(同实例内部类)。记住这句话:静态内部类不依赖于外部类存在。
理解:静态内部类只有实在使用的时候才会被加载,在加载时会首先检查外部类时否被加载,如果没有,会首先加载外部类,然后再加载内部类,这点和对象的创建有不同之处。这也能解释为什么静态内部类能够存在静态成员和非静态成员!
总结
上面提到的是类与对象重难点的部分理解,这是我觉得有理解盲区的地方,后续还会持续更新这部分的知识。