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

本文介绍了Java面向对象编程的三大特性:封装性、继承性和多态性。详细解释了如何使用private修饰符和setter/getter方法实现封装,展示了继承的语法和方法重写规则,以及多态性的应用和实例。

  面向对象的三大主线:

  • 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或缺省来进行权限修饰。

权限修饰符类内部同一个包下子类任何位置
privateYES
(缺省)YESYES
protectedYESYESYES
publicYESYESYESYES
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出来的东西,即数组的实体、对象的实体,含成员变量;
  • 方法区:存放包、类、方法的名称及定义,常量池(如字符串常量池);
  • 静态域:存放静态变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值