黑马程序员_面向对象总结

CODEWORLD 2014-07-15

-------android培训、java培训、期待与您交流!----------

三大特征

封装(encapsulation)

继承(inheritance)

多肽(polymorphism)

object-orientedprogramming面向对象程序设计

创建对象的格式:

类名对象名=new类名();

调用成员变量与成员方法的格式:

对象名.成员变量

对象名.成员方法名()成员变量是有初始化值的

成员变量和局部变量的区别:

代码位置:

成员变量:在类中方法外

局部变量:在方法内

内存位置:

成员变量:堆内存中

局部变量:栈内存中

是否有默认值:

成员变量:有默认值

局部变量:没有默认值

使用范围:

成员变量:在整个类中都可以访问

局部变量:只能在该方法中访问

创建时间:

成员变量:随着对象的创建而存在,随着对象的释放而消失生命周期长

局部变量:随着方法的调用而存在,随着方法使用完毕而消失

变量的使用原则:就近原则

如果在局部找到了,使用局部变量

如果在类中的成员位置找到了,使用成员变量

如果在类中也没有找到,报错

封装(Encapsulation)

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

private关键字:

是一个权限修饰符。

用于修饰成员(成员变量和成员函数)

被私有化的成员只在本类中有效

将成员变量私有化,对外提供对应的set,get方法对其进行访问。

提高对数据访问的安全性

构造函数

特点:

函数名与类名相同

不用定义返回值类型

没有具体的返回值。

作用:

给对象进行初始化

格式:

修饰符类名(参数列表){}

注意事项:

A:多个构造函数是以重载的形式存在的。

B:如果当前类中没有写构造函数,那么,在程序执行的时候,JVM会自动为当前类添加空参构造函数

如果当前类中写了构造函数,那么,在程序执行的时候,JVM不会为当前类添加空参数构造函数

C:当创建对象的时候,会调用构造函数,给创建出来的对象进行成员初始化的

D:(推荐做法)

定义一个类的时候,为了防止出现构造函数调用的问题,

每定义一个类,就手动的将空参数的构造函数实现

this关键字

(业余版)

代表的是当前对象的引用

(专业版)

特点:this代表其所在函数所属对象的引用。

换言之:this代本类对象的引用

this关键字的使用:

1、当局部变量与成员变量重名的时候,可以使用this关键字来区分

2、在构造函数中使用

格式:this.成员变量

注意:针对成员的修改只对当前对象有效

static关键字的由来

|多个对象共享同一个属性,使用静态

|被静态修饰的方法,直接类名调用,方便,不用创建对象

static关键字的由来

static关键字:

用于修饰成员(成员变量和成员函数)

被修饰后的成员具备以下特点:

随着类的加载而加载

优先于对象存在

被所有对象所共享

可以直接被类名调用

使用注意

静态方法只能访问静态成员

静态方法中不可以写this,super关键字

主函数是静态的

通过观察结果发现:

非静态的成员变量修改,只对当前对象有效;

而静态的成员变量修改,对所有的对象有效;

所以,可以将所有对象共享的属性定义为静态的。

在访问的时候:

普通方法调用:

可以调用普通变量,还可以调用静态变量

可以调用普通方法,也可以调用静态变量

静态方法调用:

只能调用静态变量

只能调用静态方法

请记住:静态只能访问静态

静态成员与普通成员的区别

位置上的区别

静态成员:方法区

普通成员:堆内存

创建时间与销毁消失

静态成员:随着类的加载而存在,随着类的消失而消失

普通成员:虽则对象的创建而存在,随着对象的消失而消失

调用上的区别

静态成员:对象.成员类名.成员

普通成员:对象.成员

理解上的区别

静态成员:多个对象共享同一个属性

普通成员:每一个对象单独所拥有的

静态代码块

静态代码块--构造代码块--构造函数

运行的特点:只运行一次

格式:static{....}

API(帮助文档)ApplicationProgrammingInterface

继承的概述

概念:在一个已有类的基础上,作为修改,得到一个新的类

继承的特点(子类可以直接访问父类中的非私有的属性和行为)

继承的特点(Java只支持单继承,不支持多继承)

特点:

子类可以直接访问父类中非私有的属性与方法

java中只支持单继承,不支持多继承

java中支持多层(重)继承

成员的特点(成员变量)

变量的就近使用原则

成员变量与局部变量重名,使用this关键字

子父类成员重名,使用super关键字

this:当前对象的引用

super:父类的引用

成员的特点(成员方法)

方法的重写

概念:子类将父类的方法重新实现

注意事项:

子类方法的权限要大于等于父类方法权限

静态方法只能覆盖静态方法

子类不能覆盖父类私有方法

成员的特点:

成员方法:

函数覆盖(函数重写、方法重写):

子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。

父类中的私有方法不可以被覆盖。

在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。

super.方法名访问父类中的同名方法

注意事项:

覆盖时,子类方法权限一定要大于等于父类方法权限

静态方法只能覆盖静态方法。

请解释下什么是方法重写、什么是方法重载?

方法重载(Overload):在一个类中,方法名相同,参数列表不同

方法重写(Override):(民间)子类将父类中的方法从新实现。

(官方)子类继承父类,子类与父类有同名的方法,子类将父类的方法重新实现。

main方法解析

public:为了main方法设为最大访问权限

static:不能创建对象,直接类名调用

void:main方法是JVM调用的,如果main方法有返回结果,

那么这个结果返回给JVM,我们无法拿到的,所以main设置void类型

main:JVM只认得main方法,其他的不认识

String[]:字符串数组

args:字符串数组的名字

作用:静态代码块用来加载驱动的,

因为驱动只需要加载一次

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,

那么多个类无需再定义这些属性和行为,只要继承那个类即可。

多个类可以称为子类,单独这个类称为父类或者超类。

子类可以直接访问父类中的非私有的属性和行为。

通过extends关键字让类与类之间产生继承关系。

classSubDemoextendsDemo{}

好处:

继承的出现提高了代码的复用性。

继承的出现让类与类之间产生了关系,提供了多态的前提。

math类的演示

(Math.E);

(Math.PI)

字段摘要

staticdoubleE

比任何其他值都更接近e(即自然对数的底数)的double值。

staticdoublePI

比任何其他值都更接近pi(即圆的周长与直径之比)的double值。

absolute绝对值

Math.abs(12.345);12.345

Math.abs(-12.345);12.345

ceil天花板大于等于参数的最小整数

Math.ceil(12.345);13.0

Math.ceil(-12.345);-12.0

floor地板小于等于参数的最大整数

Math.floor(12.345);12.0

Math.floor(-12.345);-13

max返回两个数中较大的一个

Math.max(Math.max(123.3,250.5),200.0);

pow/返回第一个参数的第二个参数次幂的值。

random()0.0<=num<1.0

round圆循环//四舍五入

sqrt开平方/返回正确舍入的double值的正平方根。

抽象类的特点:

A:抽象方法与抽象类必须使用abstract来修饰

B:包含抽象方法的类一定是抽象类

C:抽象类不可以创建对象

D:继承抽象类的子类,要么声明为抽象类,要么重写父类中所有的抽象方法

E:抽象方法只有方法声明,没有方法体,定义在抽象类中。

格式:修饰符abstract返回值类型函数名(参数列表);

Person

|Girl

|Boy

抽象类中的成员

成员变量:

普通变量

常量

抽象类中的成员

成员方法

普通方法

抽象方法

注意:抽象类中可以没有抽象方法

问:如果一个抽象类中没有抽象方法,那么,为什么要设置为抽象类呢?

答:防止创建当前类的对象

抽象类中的成员特点

构造函数:有

问:抽象类不能创建对象,那么,有构造函数有什么用吗?

答:子类创建对象的时候,调用父类构造函数,为父类中成员进行初始化

final关键字

final最终的意思

final可以修饰类,方法,变量。

final修饰的方法不可以被覆盖。

final修饰的变量是一个常量。只能被赋值一次。

final修饰的类不可以被继承。

内部类只能访问被final修饰的局部变量。

定义:某一类事物的多种存在形态

Person

|Girl

|Boy

前提条件:

需要存在继承或者实现关系

要有覆盖操作

父类引用指向子类对象

多态中的成员特点

成员变量:

编译的时候:看的是左边的父类

运行的时候:看的是左边的父类

多态中的成员特点

成员方法:

编译:看左边的父类

运行:看右边的子类

多态中成员的特点

静态成员方法:

编译:看左边的父类

运行:看左边的父类

总结:除了成员方法运行看右边子类以外,都看左边父类

好处和作用:

多态的存在提高了程序的扩展性和后期可维护性

好处:多态的存在提高了程序的扩展性

后期可维护性(父类Person完成的)

弊端:不能使用子类特有方法

Person

|Girl

|Boy

|Other

抽象类相关问题

1、抽象类中是否有构造函数?

作用:子类创建对象时,调用父类构造函数,可以为父类的成员初始化

2、抽象类中可不可以没有抽象方法?如果没有,为什么要定义成抽象类?

可以

防止创建本类对象

3、抽象关键字abstract不可以和哪些关键字共存?

final:最终的意思,修饰的方法不能被重写

abstract:修饰的方法,必须要重写,冲突

private:私有的意思,修饰的方法,子类不能重写

abstract:修饰的方法,必须要重写,冲突

static:静态的意思,修饰的方法,类名直接调用

那么,如果该方法可以设置为抽象

类名.方法名调用,没有意义

abstract:修饰的方法,必须要重写

发现呢,抽象类中只有抽象方法,这种时候,在java中,提供一个新的技术来描述,叫接口

(接口是一个特殊的抽象类)

接口,它不是一个类,所以它没有的默认继承Object类

格式:

interface接口名{

...

}

接口有了,但是怎么和其他的类联系起来呢?

我们通过一个技术,实现来让接口与类产生关系关键字implements

让类与接口产生关系实现关系

接口的特点

A:定义接口使用interface,实现一个接口使用implements

B:成员特点:

构造函数:

接口中没有构造函数

成员方法:

只有抽象方法

默认的修饰符:publicabstract

成员变量:

只有final修饰的常量

默认的修饰符:publicstaticfinal

C:接口不能直接创建对象

D:一个类在继承一个类的同时,可以实现多个接口

类与类之间的关系:

继承关系,java中只支持单继承,不支持多继承,但是支持多层(重)继承

类与接口之间的关系:

实现关系,java中支持单实现,也支持多实现

接口与接口之间的关系:

继承关系,java中接口来说,支持单继承,也支持多继承

面试题:

问:java中支持多继承吗?

答:分情况,在一般情况下,java中只支持单继承,但是,接口是一

接口与抽象类的区别?

共性:都是不断抽取出来的抽象的概念

区别:

1、关键字:

接口:interface

抽象类:abstract

2、接口:实现关系,可以多实现

抽象类:继承关系,只能单继承

3、成员的区别

接口:

构造函数:

没有

成员方法:

只有抽象方法

成员变量:

常量

抽象类:

构造函数:

有,子类创建对象的时候,调用父类中构造函数,用来给父类中成员初始化的

成员方法

普通方法

抽象方法

成员变量

普通变量

常量

什么时候使用抽象类?什么时候使用接口?

接口:部分子类必须要做的操作,定义在接口中

抽象类:所有子类都必须要做的操作,定义在抽象类中

内部类:类A中有一个类B,类B就叫做内部类

classA{

classB{

}

}

访问特点:

内部类可以直接访问外部类中的成员,包括私有成员。

而外部类要访问内部类中的成员必须要建立内部类的对象。

内部类:在一个类中,定义另外一个类

根据位置的不同:

成员位置:成员内部类

局部位置:局部内部类

外部类

创建内部类对象的格式:

外部类名.内部类名对象名=new外部类名().new内部类名();

方式一:

方式二:(推荐)

Outerou=newOuter();

ou.method();

成员内部类使用的修饰符

private:提高数据安全性

static:方便调用

发现使用static修饰内部类之后,原先的创建对象方式不能用了。

新的格式:

外部类名.内部类名对象名=new外部类名.内部类名();

局部内部类

发现内部类访问外部类的局部位置的变量时,局部位置的变量需要final修饰。

为什么要final修饰呢?

当method方法执行完毕后,变量num就在内存中释放了,

而创建出来的内部类对象,在这个时候成为了垃圾,但是这个垃圾,不会立刻释放出内存

会等到系统空闲的时候,由JVM的自动垃圾回收机制将这个垃圾清理出内存。

那么,在没有清理出内存的这段时间,这个内部类对象会一直指向着num变量。

而num变量已经释放了,所以会报错。

为了,解决该错误,只能将num变量的生命周期延长到与类对象相同。

通过final关键字来修饰num变量,程序就可以使用了

内部类定义在成员位置上

可以被privatestatic成员修饰符修饰。

被static修饰的内部类只能访问外部类中的静态成员。

内部类定义在局部位置上

也可以直接访问外部类中的成员。

同时可以访问所在局部中的局部变量,但必须是被final修饰的。

不能被privatestatic修饰因为

1.

因为他本身就是在内部使用的,外部不能访问

2.

所以声明为static的变量实质上就是全局变量。所以static不能修饰局部变量。

静态修饰的内容被所有对象共享,局部变量的作用域只能是所在的函数,而且是在栈内存中存在,当出了作用域就会被释放,根本不能让所以对象共享,而且静态修饰的内容存在于方法区,在内存中和局部变量的存储空间也不一样,所以是不能修饰局部的

匿名内部类

就是内部类的简化写法。

简单理解:

就是建立一个带内容的外部类或者接口的子类匿名对象。

前提:

内部类可以继承或实现一个外部类或者接口

匿名内部类的位置:

如果在成员位置上应该是没法在堆内存中存储没有名字你怎么存储

而在局部位置直接用了。不用存储

局部位置

匿名内部类格式为:

new外部类名或者接口名(){

重写父类或者接口的抽象方法

也可以定义特有的方法

};

发现其实匿名内部类就是一个接口或者外部类的子类对象

学习多态的时候,可以讲父类引用指向子类对象

-------android培训、java培训、期待与您交流!----------

相关推荐