1.参数传递
参数传递时,对于基本数据类型和引用数据类型,两个是不一样的!
基本数据类型有自己的独立空间,而形参变量里面存放的是具体的引用地址,所以会改变实参的数值。
其实就是栈和堆的缘故!
如果在方法中,重新去申请了新的内存,则引用数据也将不会改变
1.1内存结构栈之区
参数的传递涉及到内存结构的栈区,每次调用一个方法的时候,都会在栈中为该方法分配一个空间,也就是栈帧,栈帧中存放着局部变量(LV Local Variable),操作数栈(OS Operand Stack),动态链接(DL Dynamic Link),方法返回地址(RA Return Adress) 方法调用结束的时候,该空间就被清除。
2.方法的重载
方法的重载主要和参数的个数,类型,以及顺序,和返回值类型没有关系
3.this关键字的基本概念
this关键字一个很重要的应用场景,构造方法,例如:
参数在使用的时候,会遵循就近原则使用局部变量,所以为了能够正确的赋值,会使用this.参数名的形式来表示成员变量,因为是在构造方法中,所以表示的当前正在构造的对象。
3.1this关键字的使用
this关键字为什么一定要在第一行?
因为如果第一行没写的话,编译器会默认的在第一行去使用一个没有参数的this()去初始化,而在第一次初始化后,再在后面出现this()的话,就是第二次初始化,很明显,两次的初始化操作是不支持的。
4.Static关键字
static关键字修饰成员变量时,就是把该成员变量从对象的层级提升到类层级。也就是说这个类中,只有这一个成员变量,这个变量,被所有的对象都是共享。
那个既然当前这个变量被static修饰了,提升到了类的层次,这也就意味着,在使用这个变量的时候,可以用类名.变量名的方式来使用,这样就可以做到在不创建对象的前提下,做到了对这个变量的使用。
4.1Static关键字的使用
新建一个没有任何修饰的Singleton类,再在测试类中,新建两个对象
那么很明显这个时候的我们new出来的两个对象,两个是肯定不相等的。
那么如果我们想要每次去使用这个类去实例化对象的时候,都要拿到同一个对象应该怎么做?
1.很明显,我们在创建这个对象的时候,我们是会去调用这个类的构造方法的,因为构造方法是共有的,所以就可以无限制的去调用它来生成新的对象,所以首先我们要在Singleton类中,对构造方法进行私有化。
但是这样虽然让我们在外部不能直接使用构造方法了,但是我们也不能创建新的对象了,所以我们需要在类的内部,就先生成一个对象,同时所以为了能在外面没有对象的前提下使用它,我们需要给它加上static关键字,使他提升到类级别,这样我们就可以在不使用对象的前提下去。为了对这个对象进行规范和一个防护措施,我们再给他加上private关键字进行保护。
为了能正确的得到这个对象,我们此时就需要一个公有的get方法,来返回这个对象
但是这个方法的调用,需要对象,我们又没有对象,所以还需要再加上static关键字的修饰。
这样一来,我们在测试类中,只需要去用SingintenTest.getIntace就可以去获得对象, 且生成的都是同一对象。
5.单例设计模式
上述的这种每次一个类只生成一个对象的情况,我们称这个类为单例类其实就是我们熟知的单例设计模式。
单例设计模式有两种
饱汉式:调用方法的时候创建对象
饿汉式:类中直接创建。
6.多态
父类类型的引用指向子类类型的对象。
6.1多态的实际意义:
有两个类继承了同一个类,想要使用一个方法能同时兼容两个类,就需要涉及到使用多态来同时兼容两个类。
例如:有一个shape抽象类,rect类和cirle类同时继承了这个类,他们都继承了shape类的draw方法,想要在一个方法中能同时支持两个类的实现,就应该使用多态。在编译阶段,会使用父类的draw方法,到了运行阶段,又会根据子类的对象,去执行具体的方法。
public void draw(Shape s){
s.draw();
}
7抽象类和抽象方法
7.1抽象方法的概念
抽象方法是指不能具体实现的方法,并且使用abstract关键字修饰,也就是没有具体的方法体
格式:public abstract void cry();
7.2抽象类的概念
抽象类主要是指不能实例化的类,也就是不能创建对象的类
7.3抽象类和抽象方法的关系
7.4抽象类的实际意义
因为抽象类不能实例化对象,所以他都会被其他类所继承,继承了抽象类后,必须实现它的抽象方法,否则该类也就将变成抽象类,所以抽象类对于子类有强制性和规范性,也就是模板设计模式
8.接口
接口是比抽象类还要抽象的类,它的内部只能有抽象方法(JDK8以后,可以使用public default去修饰方法,JDK9以后可以使用private去修饰方法)。接口也只能有常量。接口中也没有构造方法,因为它都不能去new一个对象,所以就没有有构造方法的意义。
8.1 接口的实际意义:
一个类可以是很多个类,但是继承只能支持单继承,所以使用接口,可以来使用多实现来实现这个需求。
8.2接口和抽象类的区别:
9:枚举类型
枚举类型的值必须写在第一行,也都是常量
9.1:枚举的实际意义:
很多事物是可以一一列举出来的,像这些可以直接全部列举出来的,就可以使用枚举类型。
9.2:枚举类的常用方法
9.3:枚举类实现接口的方式:
1.重写一个(常用的重写的方法)
2.在每个对象中重写(也就是每一个枚举对象中,也是在枚举类中)
10:内部类
10.1:普通内部类
普通内部类其实和大多数类一样,只是在创建对象的时候,需要使用外部类对象来进行创建。
10.2静态内部类
静态内部类也就是提升到了类层级的内部类,所以不能访问外部的非静态成员。
10.3局部内部类
局部内部类,是在方法内部的类,所以只能在方法中使用,包括创建对象,如果要去访问外部的局部变量,也必须是final的,不然很有可能访问到的是已经改变的值。
10.4匿名内部类
这是最常用的内部类的方式,是在创建对象的时候,直接在其中对方法进行重写
接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };