面向对象

           面向对象

           

对象和类的概念

n 对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和”方法(method)”来分别对应事物所具有的静态属性和动态属性。

n 类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所因具有的静态和动态属性。

n 类可以看成一类对象的模板,对象可以看成该类的一个具体实例。

对象的两要素

n 属性 

n 用于描述对象静态特性(结构特性)的一个数据项。如描述一个人可用姓名、年龄、身份证号等属性。 

n 方法

n 用于描述对象动态特性(行为特性)的一个操作系列。如每个人都具有工作、学习等行为特性。

格式:引用类名 对象名=new 构造函数名(参数);

n 例:class DuiXiang{}

n 则建立对象为:DuiXiang mingZi=new DuiXiang();

n 如果要实现功能,则格式为:

n mingZi.变量或函数名(); 

面向对象编程特征

n 封装

n 继承

n 多态

封装

n 封装是允许有选择地隐藏类中的属性和方法

继 承

n 继承(重用)现有类生成新类

继承关系

n 父类(超类)是有其他类继承其行为的类

n 继承其他类的类称为子类

多态概念

n 多态是具有表现多种形态的能力的特征

n 多态与继承并不是孤立的,他们之间存在着紧密的联系,多态是建立在继承的基础之上的

n 不同的子类继承自同一个父类,父类的同一个方法以不同的方式实现

Java与面向对象

n 对象是Java程序的核心,在Java程序中“万事万物皆对象”。

n 对象可以看成是静态属性(成员变量)和动态属性(方法)的封装体。

n 类是用来创建同一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法。

n J2SDK提供了很多类供编程人员使用,编程人员也可以定义自己的类。

成员变量

n 成员变量可以使Java语言中任何一种数据类型(包括基本类型和引用类型).

n 在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认值对其初始化.

n 成员变量的作用范围为整个类体.

Java面向对象基本概念 ---引用

n Java语言中除基本类型之外的变量类型都称之为引用类型。

n Java中的对象是通过引用对其操作的。例如:

//声明了一个String类型的引用变量,但并没有使它指向一个对象

String s;

//使用new语句创建一个String类型的对象并用s指向它以后可以通过s完成对其的操作。

s = new String(“Hello world”);

n 如何在内存中区分类和对象?

u 类是静态的概念,代码区

u 对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量)而方法只有一份,执行的时候才占用内存

对象的创建和使用

n 必须使用new关键字创建对象

n 使用 对象.成员变量 来引用对象的成员变量

n 使用 对象.方法(参数列表)来调用对象的方法

n 同一类的每个对象有不同的成员变量存储空间

n 同一类的每个对象共享该类的方法

构造方法

n 使用new + 构造方法 创建一个新对象

n 构造方法是定义在Java类中的一个用来初始化对象的函数。

n 构造方法与类同名且没有返回值.

构造函数

创建对象时,使用构造函数初始化对象的成员变量。

当没有指定构造函数时,编译器为类自动添加形如:类名( ){ }的构造函数。

约定俗成的命名规则

n 类名的首字母大写

n 变量名和方法名首字母大写

n 运用驼峰标识

方法的重载

n 方法的重载是指一个类中可以定义相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。

构造方法的重载

n 与普通方法一样,构造方法也可以重载

this关键字

n 在类的方法定义中使用的this关键字代表使用该方法的对象的引用。

n 当前使用方法的对象是this。

n 有时使用this可以处理方法中成员变量和参数重名的情况。

n this可以看作是一个变量,它的值是当前对象的引用

n 使用格式:

n         this.成员变量名;

n         this.成员方法名

n         this();

static 关键字

n 三种修饰:修饰类的变量、方法和构造代码块。静态方法只能直接引用和访问静态变量和方法

n 声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。静态方法不能被子类的静态方法覆盖。

n 特有属性随着对象存储于堆内存中,而static修饰后的属性,存在于方法区.

n 可以通过对象引用或类名(不需要事例化)访问静态成员。

什么时候使用静态修饰符?

n 当对象中出现共享数据时,使用静态修饰。

n 但对象内的特有数据要定义成非静态存在于堆内存中。

n 而对于方法时:

n 当功能内部没有访问到非静态数据时,(即对象的特有数据)

n 那么可以使用静态修饰。

n 静态代码块:

n 用于给类做初始化的。不管有没有对象都执行,只要调用了类里面成员或方法,就会执行,而且优先于主函数,优先执行级别最高。

n 例:

n class JingTai

n {static int age;

n  static String name;

n  static//静态代码块初始化类的,所以最先运行。

n  {

n  System.out.println("name="+name);     }

//下面是构造代码块,第二个运行

n  {

n  System.out.println("age="+age); }

n  public static void jing(int x)//被对象调用,第三个运行。

n  {

n  x =age+1;//因为age是静态的,所以能调用

n  System.out.println("x="+x);

n  }}

n class FaDa

n {

n  public static void main(String[] args)

n  {

n  JingTai p =new JingTai();

n  p.jing(2);

n  } }

package  import语句

n 为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间。

n package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包(若缺省该语句,则指定为无名包)。

n 它的格式为:

n package pkg1[.pkg2.[pkg3…]];

n Java编译器把包对应于文件系统的目录管理,package语句中,用‘ . ’来指明包(目录)的层次,例如使用语句

n package com.sxt;

n 则该文件中所有的类位于 .\com\sxt 目录下

n 如果将一个类打包,则使用该类时,必须使用该类的全名(com.sxt.MyClass),Java编译器才会在找到该类。

n 也可以使用import在文件的开头引入要使用的类:

import com.sxt.MyClass;

import java.util.*;//引入java.util包中所有的类

……

MyClass myClass = new MyClass();//就可以直接使用类名

……

n 可以不需要用import语句直接使用java.lang包中的类

package import 总结

n 如果想将一个类放入包中,在这个类源文件第一句话写package

n 必须保证该类的class文件位于正确目录下

n 该类的源码可能会产生影响

n 删除或转移到另外的目录

n 另外的类想访问的话

n 写全名

n 引入

n *

n 具体类名

n 访问位于同一个包中的类不需要引入

n 必须class文件的最上层包的父目录为与classpath下。

文档注释:

n 文档注释有编译工具进行,具体一个要注意的地方是:类名前必须要有public修饰。要编译的方法名必须有public 修饰

n javadoc注释标签语法
@author 对类的说明标明开发该类模块的作者
@version 对类的说明标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明对方法中某参数的说明
@return 对方法的说明 对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明

J2SDK中主要的包介绍

n Java.lang---包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。

n Java.awt---包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面.

n Java.net---包含执行与网络相关的操作的类.

n Java.io---包含能提供多种输入/输出功能的类.

n Java.util---包含一些实用工具类,如定义系统特性,使用与日期日历相关的函数.

类的继承与权限控制

n 继承就是将两个类的共性描述提取出来,单独进行描述,从而简化代码,提高复用性。

n 格式:class 子类名 extends 父类名

n 关健字为extends :继承

n 判断两个类是否有所属关系,那么我们就继承一下,看父类所具有的内容属性,子类是否全都需要具备。如果是,那么他们所属关系成立,就是继承。

n 注意:千万不要为了获取其他类的功能,简化代码而继承。

n 必须是类与类之间有所属关系才可以继承。所属关系 is a

n Java中使用extends关键字实现类的继承机制,其语法规则为:

n <modifier>class<name>[extends <superclass>]{…}

n 通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)。

n Java语言中:java只支持单继承,不支持多继承。

n java支持多层继承。也就是一个继承体系

访问控制

n Java权限修饰符public protected private置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。

n 对于class的权限修饰只可以用public和default。

n public类可以在任意地方被访问。

n default类只可以被同一包内部的类访问

方法的重写

n 在子类中可以根据需要对从基类中继承来的方法进行重写。

n 重写方法必须和被重写方法具有相同方法名称、参数列表和返回值类型。

n 重写方法不能使用比被重写方法更严格的访问权限。

注意:

重载:只看同名函数的参数列表。

重写:子父类方法要一模一样。

super 关键字

在Java类中使用super来引用基类的成分

• 表示当前活动对象的直接父类对象。

• 使用格式:

•         super.成员变量名;

•         super.成员方法名;

•         super([参数])

• 注意:静态方法中不能使用this和super。

Object 

n Object类是所有Java类的根基类

n 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类

toString 方法

n Object类中定义有public String toString()方法,其返回值是String类型,描述当前对象的有关信息。

n 在进行String与其它类型数据的连接操作时(如:System.out.println(“info”+person)),将自动调用该对象的toString()方法。

n 可以根据需要在用户自定义类型中重写toString()方法。

equals方法

n Object类中定义有:

n public boolean equals(Object obj)方法

n 提供定义对象是否“相等”的逻辑

n Object的equals方法定义为:x.equals(y)当x和y是同一个对象的应用时返回true否则返回false

n J2SDK提供的一些类,如String、Date等,重写了Object的equals方法,调用这些类的equals方法,x.equals(y),当x和y所引用的对象是同一类对象其且属性内容相等时(并不一定是相同对象),返回true否则返回false

n 可以根据需要在用户自定义类型中重写equals方法.

对象转型(casting)

n 一个基类的引用类型变量可以“指向”其子类的对象.

n 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)

n 可以使用 引用变量 instanceof 类名 来判断该引用类型变量所”指向”的对象是否属于该类或该类的子类.

n 子类的对象可以当作基类的对象来使用称作向上转型,反之称作向下转型

动态绑定和多态

n 动态绑定是指“在执行期间(而非编译期)”判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

n 上面例子中,根据Lady对象的成员变量pet所引用的不同的实际类型而调用相应的enjoy方法。

抽象类

n 用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。

n 含有抽象方法的类必须被声明为抽象类i,抽象类必须被继承,抽象方法必须被重写。

n 抽象类不能被实例化。

n 抽象方法只须声明,而不需实现。

final关键字

n final的变量的值不能被改变

n final的成员变量

n final的局部变量(形参)

n final的方法不能被重写

n final的类不能被继承

接口

n 接口(interface)是抽象方法和常量值的定义集合

n 从本质上讲,接口是一种特殊的抽象类,这种抽象类中值包含常量和方法的定义,而没有变量和方法的实现。

接口的特性

n 多个无关的类可以实现同一个接口

n 一个类实现多个无关的接口。

n 接口中声明属性默认为public static final的;也只能是public static final的。

n 接口中只能定义抽象方法,而且这些方法默认为public的,也只能是public

n 接口可以继承其它接口,并添加新的属性和抽象方法。

接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。

1,类可以实现多个接口,用关健字:implements 如:

class Test implements JieKou,JieKou2

2,类继承后,仍可以实现多个接口,如:

class Test extends Demo implements JieKou,JieKou2

3,接口在可以实现多继承,如:

interface Test extends A,B

例:

abstract class Student

{

abstract void study();学生都要学习,所以可以作为父类来给子类继承。}

interface Smoking

{

void smoke();//抽烟不是所有学生都会,所以,不可以继承,不然所有学生都抽烟了,所以定义为接口,让需要的类实现就行。

}

class ZhangSan extends Student implements Smoking

//继承后再实现,这样就实现了功能的扩展。

{

void study(){}

public void smoke(){}//记得要复写,因为父类是抽象的。

}

class Lisi extends Student 

{

void study()

{

System.out.prtintln("study")       }

}

No. 

区别点 

抽象类 

接口 

定义 

包含一个抽象方法的类 

抽象方法和全局常量的集合 

组成 

构造方法、抽象方法、普通方法、常量、变量 

常量、抽象方法 

使用 

子类继承抽象类(extends 

子类实现接口(implements 

关系 

抽象类可以实现多个接口 

接口不能继承抽象类,但允许继承多个接口 

常见设计模式 

模板设计 

工厂设计、代理设计 

对象 

都通过对象的多态性产生实例化对象 

局限 

抽象类有单继承的局限 

接口没有此局限 

实际 

作为一个模板 

是作为一个标准或是表示一种能力 

选择 

如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限 

10 

特殊 

一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类 

多态:

1,多态的体现

对象多态性分为两种:一种属于方法的重载与覆写,另外一种对象多态性

对象多态性,从概念上非常好理解,在类中有子类和父类之分,所以对象多态性就从此而来: 

  ·  向上转型:将子类实例变为父类实例 

    |-  格式:父类  父类对象  =  子类实例  ;  à  自动完成 

    |-  以基本数据类型操作为例:int i = 'c' ;    à  因为 c的容量比 int 小,所以可以自动完成 

  ·  向下转型:将父类实例变为子类实例   

    |-  格式:子类  子类对象  =  (子类)父类实例  ;  à  强制完成 

    |-  以基本数据类型操作为例:char c = (char)98 ;  à  因为整型的容量比 char 大,所以强制完成

2,多态的前提

n  必须是类与类之间有关系。要么继承,要么实现。

n  通常还有一个前提:存在覆盖。

3,多态的好处

n  多态的出现大大的提高程序的扩展性。

4,多态的弊端:

n  提高了扩展性,但是只能使用父类的引用访问父类中的成员。

n     如何要访问子类特有对象必须强制转换为子类对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值