面向对象(1)

来源:互联网 发布:mac安装office2016 编辑:程序博客网 时间:2024/05/23 00:06
1、面向对象的三个特征:封装,继承,多态

2、类类型变量指向对象

3、成员变量:作用于整个类中,在堆内存中,因为对象的存在而存在

局部变量:作用于函数或语句中,在栈内存中

4、封装Encapsulation:隐藏对象的属性和实现细节,仅对外提供公共访问方式。

      原则:把不需要对外提供的内容都隐藏起来;把属性都隐藏,提供公共方法对其访问

5、匿名对象使用方式:1)当对象的方法只调用一次时,可以用匿名对象来完成,简化书写;如果对一个对象进行多个成员调用,必须实例化对象。2)将匿名对象作为实际参数进行传递

6、构造代码块:给对象进行初始化,对象一建立就运行,优先于构造函数执行。给所有对象统一初始化,定义的是不同对象共性的初始化内容。

构造函数:给对应对象初始化。当一个类中没有定义构造函数时,系统默认给给该类创造一个空参的构造函数。将构造函数私有化private后,将强制该类不能建立对象

静态代码块:

      static

{

      //静态代码块中执行的语句

}

   特点:随着类的加载而执行,只执行一次,并优先于主函数而执行。用于给类进行初始化

7、this用于区分成员变量和局部变量同名情况,代表所在函数所属对象的引用,哪个对象在调用this所在的函数,this就代表哪个对象。但凡本类功能内部使用本类对象,都用this表示

this语句用于函数间的互相调用,只能定义在构造函数的第一行,因为初始化要先执行。

8、static 用于修饰成员变量和成员函数,被修饰后的成员具备以下特点

  • 随着类的加载而加载:静态随着类的消失而消失,生命周期最长
  • u 优先于对象存在
  • u 被所有对象共享
  • u 可以直接被类名调用

使用时注意:静态方法只能访问静态成员;非静态方法即可以访问静态也可以访问非静态;静态方法中不可以写this,super关键字(因为静态优先于对象存在)

利处:对象的共享数据进行单独空间的存储,节省空间

弊端:生命周期过长,访问有局限性(静态只能访问静态)

何时定义静态变量(类变量):对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。

何时定义静态函数:功能内部没有访问到非静态数据(对象特有的数据),该功能可以定义为静态

静态工具类:每一个应用程序中都有共性的功能,将这些功能进行抽取,独立封装,以便复用。

9、实例变量和类变量的区别

   存放位置:

类变量随着类的加载而存在于方法区中

      实例变量随着对象的建立而存在于堆内存中

   生命周期:

      类变量生命周期最长,随着类的消失而消失

      实例变量生命周期随着对象的消失而消失

10、主函数:特殊的函数,可以被jvm识别,修饰符为static代表主函数随着类的加载就已经存在

11、java文档制作API Application program Iterface:要把一个类制作成帮助文档的话,该类必须被public修饰

set classpath=.;c:\myclass

javadoc –d  d:\myhelp -author  -version  -ArrayToolDemo.java

12、对象的初始化过程:

   Person p = new Person(“zhangsan”,20);

  • 因为new用到了Person.class,所以先找到Person.class文件加载到内存
  • 执行该类中的static代码块,如果有的话给Person.class类进行初始化
  • 在堆内存中开辟空间,分配内存地址
  • 将内存地址付给栈内存中的p变量
  • 在堆内存中建立对象的特有属性,并进行默认初始化
  • 对属性进行显示初始化
  • 对对象进行构造代码块初始化
  • 对对象进行对应的构造函数初始化

13、继承:类与类之间有所属关系才可以继承。

      提供代码复用性;让类与类之间产生了关系,有了关系,才有了多态的特性   

      java语言只支持单继承,不支持多继承,多继承容易带来安全隐患。

      java支持多层继承。

14、聚集:聚合与组合

15、覆盖

  • 子类覆盖父类,必须保证子类权限大于等于父类权限,才可覆盖,否则编译失败
  • 静态只能覆盖静态
  • 重载:只看同名函数的参数列表
  • 重写:子父类方法要一摸一样

16、子父类中的构造函数

      在对子类对象进行初始化时,父类的构造函数也会运行,因为子类的构造函数默认第一行有一条隐式的语句super(),super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super()

   为什么子类一定要访问父类中的构造函数?

   因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的,因此子类对象在初始化时,要先访问一下父类中的构造函数,如果要访问父类中指定的构造函数,可以手动指定super语句。

   注:super语句一定要定义在子类构造函数的第一行

子类的实例化过程

  • 子类所有的构造函数,默认都会访问父类中空参数的构造函数,因为子类每一个构造函数内的第一行都有一句隐式的super()。
  • 当父类中没有空参数的构造函数时,子类必须手动通过super()形式指定要访问的父类构造函数。当然:子类构造函数的第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少有一个构造函数会访问父类中的构造函数

17、final关键字: 可以修饰类,方法,变量

  • final修饰的类不可以被继承
  • final修饰的方法不可以被覆盖
  • final 修饰的变量是一个常量,只能被赋值一次
  • 内部类只能访问被final修饰的局部变量

  public staticfinal double PI = 3.14;

18、抽象类

  •   抽象方法一定在抽象类中
  •   抽象方法和抽象类都必须被abstract关键字修饰
  •   抽象类不可以用new创建对象,因为调用抽象方法没有意义
  •   抽象类中的抽象方法要被使用,必须由子类复写其所有抽象方法后,建立子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类
原创粉丝点击