JavaSE面向对象部分

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 接口/父类类型() { 方法的重写 };

11常见的预制注解

你可能感兴趣的:(JavaSE面向对象部分)