J2SE-4 面向对象编程之三大特征

来源:互联网 发布:linux oracle 进程数 编辑:程序博客网 时间:2024/04/29 07:32

  面向对象的三大主线:

  • Java类及类的成员:属性、方法、构造器、代码块和内部类;
  • 面向对象的三大特征:封装性(Encapsulation)、继承性(Inheritance)、多态性(Polymorphism);
  • 其他关键字:this、super、package、import、static、final、abstract、interface等。

1. 面向对象特征一:封装性

1.1 信息的封装与隐藏

  Java中通过将属性声明为私有的,并提供公共的方法(setter()和getter())实现对该属性的操作,以实现如下目的:

  • 便于修改,增强代码的可维护性;
  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的公共方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

  信息的封装和隐藏示例如下:

public class Animal {    private int legs;// 将属性legs定义为private,只能被Animal类内部访问    public void setLegs(int i) { // 定义setter()方法        if (i != 0 && i != 2 && i != 4) {            System.out.println("Wrong number of legs!");            return;        }        legs = i;    }    public int getLegs() {  // 定义getter()方法        return legs;    }}

1.2 访问权限修饰符

  Java权限修饰符有public、private、缺省和protected四种,用来修饰类的成员,以限定对象对该类成员的访问权限;然而,对于类本身只可以用public或缺省来进行权限修饰。

权限修饰符 类内部 同一个包下 子类 任何位置 private YES (缺省) YES YES protected YES YES YES public YES YES YES YES

1.3 封装性的体现之JavaBean

  JavaBean是一种Java语言写成的可重用组件。所谓的JavaBean是指符合如下标准的Java类:

  • 类是公共的;
  • 有一个公共的无参构造器;
  • 有属性,且有对应的getter()和setter()方法。

  用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。


2. 面向对象特征二:继承性

  为什么要有继承性?

  • 继承的出现提高了代码的复用性;
  • 继承的出现使类与类之间产生了关系,提供了多态的前提;
  • 不要仅为了获取其他类中某个功能而去继承。

  其基本的声明格式如下:

[访问权限修饰符] class 子类名 extends 父类名 {    类体;}

  基本说明:

  • 子类可使用父类中定义的属性和方法,也可创建独有的属性和方法;
  • 因为封装性的设计,子类不能直接访问父类中私有的成员变量和方法;
  • 关键字extends表明,子类是对父类功能的扩展,明确子类不是父类的子集;
  • Java中类的继承性只支持单继承,而不允许多重继承;即一个子类只能有一个父类,而一个父类可以派生出多个子类。

  方法的重写:子类继承父类以后,若父类的方法对子类不适用,那么可以对父类的方法进行重写。重写的规则如下:

  • 重写方法必须和被重写方法具有相同的返回值类型、方法名和参数列表;
  • 重写方法不能使用比被重写方法更严格的权限修饰符;
  • 重写和被重写的方法须同时为static的,或同时为非static的;
  • 重写方法抛出的异常不能大于父类被重写方法抛出的异常;
  • 注意:如果父类中一方法定义成private访问权限,而在子类中将此方法声明为default访问权限,则不属于方法的重写。

  关于继承性和方法重写的示例如下:

// 父类public class Person {    public String name;    public int age;    public String getInfo() {        return "Name: " + name + "\n" + "age: " + age;    }}// 子类public class Student extends Person {    public String school; // 具有name、age和school三个属性    public String getInfo() { // 方法的重写        return "Name: " + name + "\nage: " + age + "\nschool: " + school;    }    public static void main(String args[]) {        Student s1 = new Student();        s1.name = "Bob";        s1.age = 20;        s1.school = "school2";        System.out.println(s1.getInfo()); // Name:Bob age:20 school:school2    }}

3. 面向对象特征三:多态性

  Java引用变量的类型:

  • 编译时类型:由声明该变量时使用的类型来决定;
  • 运行时类型:由实际赋给该变量的对象的类型来决定;
  • 注意:若编译时类型和运行时类型不一致,即出现多态性(Polymorphism)

  多态性概述:

  • 多态性的表现:方法的重载(overload)和重写(overwrite)、子类对象的多态性;
  • 多态性的前提:要有类的继承,且要有子类方法对父类方法的重写;
  • 多态性的格式:如Person p1 = new Man(); ,即父类的引用指向子类的对象实体。

  多态性原则:

  • 对于多态性而言,编译时“看左边”,即将此引用变量理解为父类的类型,子类中独有的结构(属性和方法)不能调用;
  • 运行时“看右边”,即调用方法时,实际执行的是子类重写父类的方法(虚拟方法的调用);
  • 特别注意:此时不能再访问子类中特有的属性和方法;若子类中定义了和父类相同的属性,其也不具有多态性,即通过父类类型的引用变量访问时仍访问的父类的属性。

  多态性应用实例:方法声明的形参为父类类型时,可以使用子类对象作为实参传入该方法。

  对象类型转换:对Java对象的强制类型转换称为造型,具体说明如下:

  • 向上转型:从子类到父类的类型转换可以自动进行;
  • 向下转型:从父类到子类的类型转换必须通过造型(强制类型转换)来实现;
  • 无继承关系的引用类型间的转换是非法的,可在造型前使用instanceof操作符判断对象的类型。

4. Java根父类:Object类

  Object类是所有Java类的根父类,其仅有一个空参的构造器;如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类。Object类的主要方法如下:

方法名称 类型 描述 public Object() 构造 构造方法 public boolean equals(Object obj) 普通 对象比较 public int hashCode() 普通 获取Hash码 public String toString() 普通 对象打印时调用

4.1 equals()方法

  ==运算符:

  • 对基本数据类型的数据运算时,比较基本数据类型变量的值是否相等;
  • 对引用数据类型的数据运算时,比较引用类型变量的地址值是否相等;
  • 注意:比较时要求符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译会出错。

  equals(Object obj)方法:

  • 只能比较引用类型的变量,其作用与==运算符相同,比较引用类型变量的地址值是否相等;
  • 注意:像String类、包装类、File类、Date类等重写了Object类的equals()方法,故其主要比较两个对象的类型和内容是否相同,而不考虑引用的是否是同一对象;
  • 实例:重写equals()方法,判断两个对象实体的属性是否相等。

4.2 toString()方法

  • 在进行String与其它类型数据的连接操作时,自动调用其toString()方法;
  • 基本类型数据转换为String类型时,调用了对应包装类的toString()方法;
  • 当打印对象的引用时,默认调用该对象的toString()方法,以返回该对象的类名和对象实体在堆空间的地址;
  • 若该对象所属的类未重写Object类的toString()方法时,调用的是Object的toString()方法;否则,调用的是该对象所属类重写的toString()方法;
  • 重写toString()方法时,往往需要将对象实体的各个属性值进行返回;
  • 注意:像String类、Date类、File类、包装类等均已实现了对Object类中toString()方法的重写。

5. 包装类

  基本数据类型不能使用Java类库中提供的大量方法,因此在设计上建立包装类,相当于使基本数据类型有了类的特点。
  其中,对应于基本数据类型的包装类有:Boolean、Byte、Short、Integer、Long、Character、Float和Double。

5.1 基本数据类型、包装类和String类之间的相互转换

  这里写图片描述

  • 基本数据类型->包装类:通过自动装箱(JDK5.0之后)来实现,如Integer i1 = 50;
  • 包装类->基本数据类型:通过自动拆箱(JDK5.0之后)来实现,如int i = i1;;对于Boolean包装类而言,当形参是“true”返回true,否则返回false;
  • 基本数据类型、包装类->String类:调用String类重载的valueof()静态方法来实现,如String str2 = String.valueOf(10);
  • String类->基本数据类型、包装类:调用相应包装类的parseXxx(String)静态方法来实现。

5.2 String类的内存解析

  这里写图片描述

  附:内存的基本结构:

  • 栈空间(stack):存放局部变量、对象的引用名、数组的引用名;
  • 堆空间(heap):new出来的东西,即数组的实体、对象的实体,含成员变量;
  • 方法区:存放包、类、方法的名称及定义,常量池(如字符串常量池);
  • 静态域:存放静态变量。
0 0