Java面向对象学习

来源:互联网 发布:网络英语教学平台排名 编辑:程序博客网 时间:2024/04/29 11:27

一、 类、对象、方法和变量
  1. 类是一批对象的抽象,对象是具体存在的实体。可以把类当做一种抽象的数据类型,使用类来定义的变量成为引用型变量。
  2. 类中包含的三种成员:构造器,属性和方法;各成员之间的定义顺序没有任何影响,各成员之间可以相互调用;构造器是一个类创建对象的根本途径,如果在Java中一个类没有定义,则系统会提供一个默认的无参数的构造器。
  3. 使用new关键字调用类的构造器可以创建该类的对象。类里定义的方法和属性都可以通过类或者对象来调用。
  4. 引用型变量里存放的仅仅是一个引用,它指向实际的对象。引用变量存放在栈中,真正的对象则存放在堆中。Java中的引用相当于C语言中的指针。
  5. this关键字是一个对象的默认引用,它总是指向调用该方法的对象。出现在构造器中,引用该构造器执行初始化的对象;出现在普通方法中,指向调用该方法的对象。
  this可以代表任何对象,且具有不确定性,但它的类型是确定的,它所代表的对象只能是当前类,只有当this所出现的方法被调用时,它所代表的对象才会被确定下来:谁在调用这个方法,this就代表谁。
  静态方法中不能使用this关键字。
  6. 方法不能独立存在,所有的方法都必须在类中定义。使用static声明的方法属于类,否则属于对象。执行方法必须使用类或者对象进行调用。
  7. 方法的参数传递方式只有值传递一种,就是讲实际参数值的副本传入方法内,而参数本身不会受到影响。对于引用类型参数同样采用的值传递。
  8. 同一个类中包含了多个方法名相同但形参列表不同的方法称为方法重载。
  9. 构造器是用于创建类对象并进行初始化的特殊方法,可以在其中进行显式初始化(系统会默认初始化)。 但是对象并非完全由构造器负责创建,当系统开始执行构造器之前,系统已经创建了一个对象,当构造器的执行体执行结束之后,这个对象会作为构造器的返回值被返回并赋给引用类型的变量。
  10. 构造器和普通方法一样可以重载。当一个构造器需要包含另一个构造器时,可以使用this([形参列表])来调用另一个重载构造器。
  11. Java中变量分为成员变量和局部变量。成员变量又分为类变量和实例变量,分别属于类和对象,与其生命周期相同。局部变量分为形参,方法局部变量和代码块局部变量。局部变量除了形参外,其他都需要显式初始化。另外,同名的局部变量会覆盖成员变量,可以使用this关键字避免冲突。

二、 封装
  1. 封装是将对象的状态隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。需要考虑到:一是将对象的属性和实现细节隐藏起来,不允许外部直接访问;二是把方法暴露出来,让方法来操作或访问这些属性。即遵循:把该隐藏的隐藏起来,把该暴露的暴露出来。
  2. 封装需要通过访问控制符来实现。

三、 继承
  1. 继承是一种一般和特殊的关系。子类通过继承,可以获得父类的全部属性和方法。但需要注意的是子类不能获得父类的构造器。
  2. 大部分时候,子类总是以父类为基础,额外增加新的属性和方法。同时,也可以重写(覆盖)父类方法。方法的重写需要方法名,形参列表相同,子类方法的返回值和抛出的已成类型需要小或等于父类方法,子类方法的访问权限需要大于父类方法。另外,覆盖与被覆盖的两个方法类型(类方法还是实例方法)须一致。被覆盖的父类方法可以在子类中通过super(实例方法)或类型(类方法)来调用。
  3. Java程序创建某个类的对象时,系统会隐式创建该类父类的对象。Super指向父类对象。另外,由于子类不会获得父类的构造器,使用super([形参列表])来调用父类的构造器。

四、 多态
  1. 引用变量的编译类型和执行类型不一致的情况下,执行该引用类型的方法实际上是执行在子类中被覆盖的方法。而对于属性则没有这种性质。
  2. Java允许把一个子类对象赋给赋给一个父类引用变量和无须进行任何类型转换。
  3. 使用instanceof运算符用于判断是否可以进行向上转型。

 

五、 处理对象的通用方法

  1. toString方法。所有的类都从Object中继承了这个方法。当打印对象时,实际上是在调用该方法。另外,当对象和字符串相连时,也会自动调用该方法。通过重写自定义。

  2. equals方法。这个方法用于比较引用类型是否引用的是同一个对象,可以通过重写自定义。

 

 

六、 final修饰符

  1. final修饰变量时,表示该变量一旦获得了初始值后就不可改变。

对于final修饰的成员变量,由于成员变量的初始值可以被系统默认赋初值,也可以由构造器或者构造块赋初值,因此,一旦初始化后,就不能在普通方法中对成员变量重新赋值了。final成员变量必须显式初始化系统不会对其进行隐式的赋值。

对于final修饰的局部变量,既可以在定义时也可以不在定义时指定默认值,后者情况可以在后面代码中指定初始值,但只能一次。

对于final修饰的引用类型变量,final只保证这个引用所引用的地址不会改变,即一直引用同一对象,但这个对象完全可以发生改变。

  2. final修饰的方法不可被重写。

  3. final修饰的类不可有子类。

 

七、 抽象类

  1. 可以包含抽象方法的类是抽象类,通过abstract关键字声明。抽象类不能被实例化,即使其中不包含抽象方法。抽象类可以包含类的各种成员,其构造器不能用于创建实例,主要是用于被子类调用。

  2. 抽象类与普通类的差别在于,可以包含抽象方法,不可以被初始化。 

  3. 抽象类被当做父类被其他子类继承。它是从多个具体类中抽象出来的父类,作为其子类的模板,避免子类设计的随意性,体现了模板模式的设计。

 

 

八、 接口

  1. 接口定义的是多个类共同的公共行为规范,其中定义了一组抽象方法作为共用方法。使用interface关键字声明。

  2. 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。

  3. 接口的定义只是一种规范,不能包含构造器和初始化块定义。接口中包括常量属性,抽象方法,内部类(接口)和枚举类定义。需指定为public访问控制修饰符。

  4. 接口里的常量属性是接口相关的,系统会自动指定其为public static final,并在定义时指定初值。接口里的方法默认使用public abstract,接口里的内部类和枚举类默认采用public static

  5. 接口可以多重继承,多个父接口采用逗号隔开。

  6. 接口不能用于创建实例,但接口可以用于声明引用类型的变量。一个类可以实现多个接口。实现类必须实现全部抽象方法,否则该类须保留该抽象方法并声明为抽象类。

 

 

九、 内部类

  1. 在一个类的内部再定义的类叫做内部类。可以定义在一个类中的任何位置,包括方法体中(局部内部类)。内部类提供了更好的封装,可以把其细节隐藏在外部内之内而不允许包中的其他类访问。

  2. 内部类的成员可以直接访问外部类的私有成员,而外部类成员不允许访问内部类的成员。

  3. 外部类使用内部类的细节时,需要实例化内部类的对象,然后使用其中的属性细节。但是对于内部类,可以直接使用外部类的成员属性,调用其方法。因为在非静态类内部类中,保存了一个它所寄存的外部类对象的引用。

  4. 变量的查找顺序为:内部类方法体、内部类中,外部类中。若重名,则this表示内部类对象,外部类名.this表示外部类。

  5. 静态内部类(static)将内部类相关于外部类。静态内部类中定义的实例方法不能访问外部类中实例属性。

  6. 允许在接口中定义内部类,且其中定义的内部类只能是public访问权限的静态内部类。

  7. 在外部类以外的地方访问内部类,则内部类不能使用private访问权限。声明内部类对象需要写明类全名:外部类名.内部类名 内部类对象名。如果有包名,还需要写明包名。在外部类以外创建实例时,必须先创建其外部类的对象。语法格式如下:OuterInstance.new InnerConstructor()

  8. 对于继承了非静态内部类的子类,需要在其构造函数中显式调用父类的构造函数,并传入其父类寄存于外部类的对象引用。

  9. 静态内部类对象在初始化时,使用外部类直接调用内部类的构造方法。

  10. 定义在方法体中的类称为局部内部类,仅在方法中有效。它既不能在外部类以外的地方使用,也不能使用static修饰。对于其子类的定义,在定义在方法体中。

  11. 创建匿名内部类时会立即创建一个该类的实例,然后这个类的定义会立即消失,不能重复使用,必须实现一个接口或者一个父类。它不能显式创建构造器,但可以创建初始化块。

原创粉丝点击