面向对象1

来源:互联网 发布:淘宝店客服怎么设置 编辑:程序博客网 时间:2024/06/16 19:01




面向对象概述:

面向对象的三大特征:

1.        封装 2. 集成 3. 多态

描述事物:事物的属性(类中的变量) + 事物的行为(类中的成员函数)

封装:(我将资源控制在我的手里,我只提供给你我能提供的方法)

1.        将不惜要对外提供的内容全部隐藏。

2.        把属性都隐藏,提供公共方法对其访问。

构造函数:

构造函数特点:

1.        函数名与类名相同

2.        不定义返回类型

3.        不可写return语句

4.        在创建对象的同事被执行,相当于初始化该对象

构造函数VS一般函数

1.        写法上不同

2.        构造函数是对象已建立便调用,而一般方法只有在调用时才执行

3.        调用次数:构造函数尽在对象被建立时调用一次,一般函数可多次调用

构造函数注意点:

  当一个类中没有定义构造函数时,那么系统就会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。

构造代码块:

特点:给所有该类型的对象进行初始化。优先于构造函数运行。

构造代码块和构造函数的区别:

1、构造代码块是给所有对象进行初始化。

2、而构造函数是给对应的(重构)对象初始化。

3、构造代码块中定义的是不同对象共性的初始化内容。

This关键字和this方法

This关键字:

其指代的是本类的对象。当有重名变量时可以通过调用它区分是本类对象的变量还是外部传入变量。This所开辟的空间在栈中,它只是指向对象的一个引用


This()函数:

相当于调用自己的构造函数。

注意:其只能定义在构造函数第一行,因为初始化需要先被执行。因此,其只能存在于构造函数之间,不能由其他函数调用。

静态变量与静态方法:

修饰关键字:static

特点:

1.      随着类的加载而加载,随着类的消失而消失

2.      优先于对象存在

3.      被所有对象所共享

4.      可以直接被类名锁调用

注:类消失的情况

JVM的流程:加载 -- 连接 -- 初始化 -- 使用 -- 卸载

在卸载时:
在类使用完之后可能会被卸载,可能性如下:
如果有下面的情况,类就会被卸载:

1.        该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

2.        加载该类的ClassLoader已经被回收。

3.        该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。

 

静态变量和静态方法特点:

1、静态变量和静态方法可以通过类名进行调用。

2、静态方法只能访问静态成员

3、静态方法中不可以定义this,super关键字。因为静态先于对象被建立。

主函数解析:

Eg:

public static void main(String[] args)

{

           System.out.println("HelloWorld!");

}

Public:代表着该函数的访问权限,为公共访问

Static:代表着主函数随着类的加载而加载

Void:主函数没有返回值

Main:虽然不是关键字,但是是一个特殊的标志,能被JVM(java virtual machine java虚拟机)识别

String[] args:该参数的类型为一个字符串

注:java虚拟机只识别名称为main,参数列表为String[]的main函数。

Main函数支持向内传入字符串数组的传入。

 

静态代码块:

随着类的加载而执行,先于类被执行且执行一次。用于给类进行初始化。


注意:类被加载的前提为类被使用。这里没有对类进行new,则类没有被加载。仅仅创建了该类的引用。因此不会执行静态代码块

静态代码块VS构造代码块

1.        目的:静用于给类进行初始化;构 对对象进行初始化

2.        顺序:静先于类执行; 构 先于构造函数执行

3.        次数:均只执行一次

 

通过javadoc制作帮助文档

函数内部


调用的CMD命令


最终生成的效果


 

注意:javadoc只能对public修饰的类进行注释。这个文档所体现的是你准备向外暴露的内容。Private 和default不会暴露出去。

 

创建person.class对象的整个流程

加载类阶段

1.        加载class文件:因为new用到person.class,所以会先找到person.class文件并加载到内存中(方法区);

2.        执行静态代码块:执行该类中的static代码块,给person.class类进行初始化;

3.        开辟类内存:在堆中开辟空间,分配内存地址(堆区)。

4.        初始化静态属性:开辟空间存储静态变量并对静态数据进行初始化(方法区)

5.        存储静态函数:在内存中为静态函数开辟空间(方法区)。

存储对象阶段

6.        为属性开辟空间:在存中建立对象的特有属性,并对其进行默认初始化初始化(堆区)

7.        初始化属性:对属性进行显示地初始化(堆区)

8.        执行构造代码块:对对象进行构造代码块初始化:执行构造代码块(堆区)

9.        执行构造函数:对对象进行构造函数初始化。(堆区)

10.    将地址赋给对象:将内存地址赋给栈内存中的变量p

单例设计模式

单例模式:希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

应用:一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。

注意点:如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。

1.        饿汉模式


Single类一进内存就已经初始化了对象

1)       为了保证让类自己负责保存自己的实例,类中的变量都为private,并且构造函数也为private,不让外界创建;

2)       为了保证对象随时都可以被访问,以及其唯一性,因此将对象定义为static 并在内部自己创建

3)       为了能使外部得到该对象,我们暴露了获得对象的方法。

2.        懒汉模式


Single类进入内存,对象还未存在,只有当调用方法时才建立对象

继承:(弊端:打破了封装性)

概述:

Java中只支持单继承,不支持多继承(会引起隐患,当多个父类中定义了相同的功能时,不确定执行哪个)

但是,java中保存了多继承机制,通过另外一种形式体现——接口;

创建子类对象的原则:1、父类不能创建对象

                                 2、创建的子类对象具有更多的功能,包括基类的和特有的

子、父类出现之后类成员的特点:

变量:

1、 子父类出现同名变量时,用this访问本类变量,用super访问父类变量。

函数:

1、 当子父类出现同名的函数,则子类函数覆盖父类函数,但是父类函数依然存在,但是体现的功能为子类的功能。

复写时需要注意的地方:

1、 子类复写父类,要保证子类权限大于等于父类。若父类中的函数为private,子类看不到,即使子类有同名函数也不算复写。

2、 Static只能复写static

3、 没有权限标识符的默认为default类

重载VS复写

重载:多个同名函数同时存在,具有不同的参数个数/类型。重载跟返回值无关。

只看函数的参数列表;

复写:子类中定义某方法与其父类有相同的方法名、返回类型和参数表,我们说该方法被重写 。子父类方法要一模一样。(子类权限必须大于或等于父类才能复写)

构造函数:

1、 在子类进行初始化时,父类构造函数也会运行,因为子类构造函数的第一行有个隐式的super(),从而调用了父类构造函数。若父类中而没有无参的构造函数时,就需要手动super去访问有参的构造函数。

2、 调用super()的原因:子类在建立时,需要查看父类,并对其中一些数据进行初始化,因此需要用super()来对父类进行创建

3、 Super()语句与this()语句水火不容,只能有一个在第一行。所有子类构造函数都有super()。当子类无构造函数时,我们需要手动super()来访问父类的构造函数,当父类无对应格式的构造函数,则编译失败。

注:子类初始化一定要先去初始化父类的原因为,在子类建立对象时,需要参考父类的方法。

Final修饰符:

特点:

1、 可以修饰类、函数、变量

2、 被final修饰的类不可以被继承

3、 被final修饰的方法不可以被复写

4、 被final修饰的变量智能赋值一次,从此以后便为常量(有点像宏定义,定义一个值,并给他去个名字eg:  final double PI = 3.14;)


0 0