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或缺省来进行权限修饰。
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类的主要方法如下:
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出来的东西,即数组的实体、对象的实体,含成员变量;
- 方法区:存放包、类、方法的名称及定义,常量池(如字符串常量池);
- 静态域:存放静态变量。
- J2SE-4 面向对象编程之三大特征
- 面向对象编程的三大特征
- 面向对象编程的三大特征
- 面向对象编程三大特征
- js面向对象编程-三大特征
- 面向对象三大特征之封装
- 面向对象三大特征之封装
- 面向对象三大特征之继承
- 面向对象三大特征之继承
- J2SE之面向对象编程
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- Activiti流程定义删除
- 深入浅出Mybatis-分页
- C++第二次试验报告
- jqgrid setGridParam方法设置postData参数值累加问题
- C++第二次实验项目1、7(所得税和完数)
- J2SE-4 面向对象编程之三大特征
- 嵌入式linux菜鸟成长记(七)
- select标签添加multiple属性后,页面呈现的样式发生改变,如何修改
- C++第二次实验-选择结构设计-项目4(分段函数求值)
- Windows系统下如何在cmd命令窗口中切换不同版本Python
- JAVA操作Mencached实例
- 7种形式的Android Dialog使用举例
- TortoiseGit安装和使用的图文教程
- 我的程序员之路(英语的学习)