黑马程序员Java笔记——面向对象的亲密接触

来源:互联网 发布:萝莉酱llj222备用域名 编辑:程序博客网 时间:2024/05/22 05:20

----------- android培训java培训、java学习型技术博客、期待与您交流! ---------

面向对象的特征

(一)引述:面向对象是相对面向过程而言的,两者的主要区别是:

1)面向过程重在设计方法,并且数据和操作是分离的。

2)面向对象重在对象和对象的操作,将数据和方法都组合到对象中)

采用面向对象的好处:提高程序的复用性,并且使得程序更加易于开发和维护,为程序提供更高的灵活性和更多的模块化。

面向对象的三大特征是:封装、继承、多态。

(二)简述:

1)封装:把实现的细节,对用户隐藏起来。使用者不需要具体细节是如何实现的。

类的封装,方法的封装都是如此:我吃了一个鸡蛋,感觉不错。但是,我不用知道这个蛋是怎么来的。

类的抽象:Java提供了多层抽象,如方法的抽象,类的抽象……。类的抽象将类的实现和使用分离。

提示:类的抽象、方法的抽象;与抽象类、抽象方法是两种不同的概念。

具体区别:

在类的抽象、方法的抽象中: 抽象和封装是同一个问题的两个方面,是将类和方法的 如何使用 与 如何实现 相分离。 

在抽象类、抽象方法中: 抽象是一个形而上的,一种共性的,在Java中把只有方法头没有方法体的方法叫做抽象方法;含义抽象方法的类叫做抽象类

实际生活体现面向对象的封装性的例子:计算机。

我们买计算机,目的是使用计算机的功能。计算机为了自身的安全,和我们操作的方便。被封装在铁盒里,我们并不需要明白计算机的内部运行原理,我们就可以使用计算机工作。

2)继承:使用类来对同一类型的对象进行建模,不同的类也会有一些共同的特征和动作。继承就是把这些共同特征和动作定义成一个通用类,随后扩展成更多特定功能的类。

父类、子类:在Java术语中,如果类C1扩展自另一个类C2那么,将C1称为次类,将C2称为超类。超类也称父类、基类;次类也称子类、或者扩展类、派生类。

子类可以从父类那里继承可访问的数据域和方法,也可以添加新的数据域和新的方法。

也就是说,子类不是父类功能的一部分,子类是父类的不错和扩展。越是子类,功能越是强大。

父类,当然你也可以叫爹类,从爹这个字的结构就可以看出:一个父类下面可以有N多子类。但是Java规定,子类只能有一个父类。也就是说Java不支持多继承。但是支持多重继承。

多继承与多重继承:

多继承:一个子类可以有多个父类。比如一个人的爸爸既是X刚,又是XX江。这个极品就不要想了,你丫是要逆天啊,这么变态的渣,Java是不支持的。

多重继承:一个子类可以继承一个父类,一个父类可以再继承一个父类(爷爷类)。又比如:高丽金家,从 金将军 到 金同志 再到现在的 金胖子,个个都朝鲜人民心中的伟大领袖。这个事儿朝鲜人民哭着喊着都答应了,所以Java也就同意了。在Java中也有一个类、它的地位如同像金将军一般。Object类,它是神一样的存在,是所有的父类

继承(扩展)的语法:

public class subclassName extends superclassName

权限修饰符 子类名 extends 父类名

关键字extends 告诉编译器,子类扩展自父类,这样子类就继承了父类中的数据域、和方法。

注意:

1)一般情况下,子类从父类继承的数据域和方法,不包括被声明为私有的private的数据域和方法,但是父类中定义了公共的访问器和修改器,可以使用这些公共的修改器或者修改器来修改或者访问私有数据和方法。

2)父类的权限修饰符为protected,使用protected表明:父类中的被保护的数据域和方法可以在它的子类中被访问。

关键词super 用来调用父类的构造方法或者方法。

子类调用父类的构造方法:(语法)super( ); 或者 superparameters);

语句super()调用了它的父类的无参构造方法。

语句superparameters)调用与参数匹配的父类的构造方法。

注意:

(1)要调用父类构造方法必须使用super语句,并且这个调用必须是构造方法的第一条语句。

(2)构造方法不想属性和方法,父类的构造方法是不被子类所继承的。他们只能在子类的构造方法中的第一句被调用

3)构造方法链:构造方法可以调用重载的构造方法或者父类的构造方法,如果它们没有被显式的调用,编译器就会自动将super()作为构造方法的第一条语句。在任何情况下,构造一个类的实例时,将会调用沿着继承链的所有父类的构造方法,这就是构造方法链

提示:如果要将一个类设计为扩展的,最好提供一个无参构造方法,以避免程序设计错误

子类调用父类方法的语法:super.方法名参数 )

覆盖方法:子类从父类中继承方法,有时需要修改父类中定义的方法的实现,这就叫做方法覆盖也叫方法覆写。

注意:

(1)仅当父类中的实例方法可以访问时,在子类才可以被覆写。因为,私有方法在它的类本身之外是不能访问的。如果子类中定义了与父类中同名的私有方法,这两个方法是没有关系的。

(2)与实例方法一样,静态方法也可以继承,但是静态方法不能被覆盖。如果父类中的静态方法在子类中被重新定义,那么父类中的静态方法将被隐藏。

可以使用 父类名 静态方法名 ;来访问父类中的静态方法

方法重载与方法覆盖的区别:

(1)方法重载:多个方法同名但是参数列表不同。

(2)方法覆盖:多发生在继承体系中,子类为父类中的方法提供一个全新的实现。     其中,子类方法必须使用与父类同样的方法签名和相同的返回值类型。

3)多态:类是一种类型变量,其中子类定义的类型就叫做子类型;父类定义的类型就叫做父类型。继承关系使得一个子类继承了父类的特征,并且 附加了一些新特征。实质上:每个子类都是父类的特殊化,每个子类的实例都是父类的实例。但是翻过来却不成立。

因此,总可以把子类的实例传给需要父类类型的参数。

关于多态的例子:

前不久看TVB的《仁心解码》,给我普及了好多关于精神病的知识。结合一下多态可以这么理解:其实,每一个子类都是一个潜在的“人格分裂症患”者。每个子类都很深的“伊拉克特拉情结”也叫“恋父情结”。因为子类具有父类的功能,所以子类体内有 子类类型 和 父类类型 (甚至还有 父类的父类类型)等多种状态。在需要父类类型的地方,子类都会以变态的形式出现

还有一个关于理解多态的表述:

子类,简单两字,它的却承载意涵……正是子类的多态性,让它们完美诠释程序中每一个对象,以平凡之躯开创非凡成就。这就是多态,子类不止一面;多态你值得拥有。

——广告版

(完整版的改写暂时没想好,虽然比喻不太恰当,先这么着吧,有更好的再改)

声明类型:一个变量必须被声明为某种类型,变量的这种类型被称之为声明类型。

实际类型:因为实例可以使用声明类型或者子类型的构造方法来创建,变量引用类型的实际类型称作实际类型。

动态绑定:引用变量的声明类型决定了编译时匹配哪个方法,编译器会在编译时,根据参数类型、参数顺序找到匹配的方法。一个方法可能在几个子类中都被实现了,JVM在运行过程中,动态的绑定方法的实现,这是由变量的实际类决定的。

instanceof运算符:验证一个类是否是另一个类的子类

对象类型转换:在基本数据类型中,可以同一个运算符把一种基本类型变量另一种基本类型。转换也可以用来把一种类型对象转换为继承结构体系中的另一种类类型的对象。

子类实例可以转换为父类的变量,称之为向上转型,这一种隐式转换。当把父类实例转换为子类的变量时,必须使用转换记号(子类名)进行显式转换。如果父类的对象不是子类的实例,编译器会报错。

注意:只有源对象是目标类的实例时,才可以进行类型转换,最好在转换之前使用instanceof关键字进行验证;

对象成员访问运算符( )优先于类型转换预算符。使用圆括号保证在点运算符之前完成类型转换

修饰符:

(1)private 修饰符完全隐藏类的成员,不能从类外直接访问他们。

(2)默认修饰符,表示同一个包中的类可以访问类成员,不同包中的类不行。

(3)public 修饰符表示允许任意类访问类是成员。

(4)protected 修饰符表示任何包中的子类或者同一包中的类可以访问该类。

5final 修饰符表示终极,不能声明为父类。

意:修饰符privateprotected只能用于类成员;public既可以用于类成员也可以用于类

子类可以覆盖它父类的protected方法,并把它的可见性改为public,但是子类不能削减父类的可见性,即不能把父类中的public方法覆盖为其他修饰符

(三)继承的衍生:抽象类和接口

在继承的层次结构中,随着每一个新子类的出现,类会变的越来越明确和具体。如果一个子类追溯到父类,类就会变得更通用,更加不明确。类的设计应该会确保父类包含它的子类的共同特征。有时候一个父类会设计的非常抽象,以至于没有任何具体的实例,这样的类称之为抽象类。抽象类中一些方法不能实现称为抽象方法。

抽象关键字:abstract

抽象方法在方法头中使用关键字abstract修饰符表示为抽象方法。

抽象类在类头使用关键字abstract修饰符表示为抽象类。

抽象类与抽象方法的特征:

(1)抽象类不能用new操作符创建实例。

(2)包含抽象方法的类必须声明为抽象类。

(3)抽象类的构造方法定义为protected,因为它只能被子类使用。

(4)抽象方法只有定义没有实现,它的实现交由子类实现。

抽象类的注意点:

(1)抽象方法不能包含在非抽象类中,如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须声明为抽象的。

(2)抽象方法是非静态的。

(3)抽象类不能使用new操作符来调用,但是抽象类中可以定义构造方法。这个构造方法由它的子类的构造方法调用。

(4)包含抽象对象的类必须是抽象的。但是可以定义一个不包含抽象方法的抽象类。

(5)父类是具体的,子类也可以是抽象的。

(6)不能使用new操作符,从抽象类中创建实例,但是抽象类可以成为一种数据类型(如数组)。

接口:Java中定义了一种与类相似的结构,只包含常量 和 抽象方法。接口在很多方面是和抽象类相似的,但是它的目的是指明多个对象的共同行为。

定义接口的语法:

修饰符  interface 接口名{

常量声明;

方法签名;

}

Java中,接口被看做一种特殊的类。就像常规类一样,每个接口都被编译成独立的字节码文件。与抽象类相似,不能使用new操作符创建接口的实例。可以使用接口作为引用变量的数据类型或类型转换的结果等。

类和接口之间的关系是接口继承。接口继承与类继承本质相同的,所以都简称为继承

注意:接口中所以数据域都是public final static ,接口中方法都是 public abstract.所以Java允许省略它们。

访问接口中定义的常量常使用的语句是:接口名 常量名

带空体的接口称为标记接口,标记接口,既不包括常量,也不包括方法。它用来表明一个类拥有某些特别的属性

接口和抽象类:

变量

构造方法

方法

抽象类

无限制

子类通过构造方法链来构造方法;

抽象类不能使用new操作符来实例化

无限制

接口

所以的变量名必须是public static final

没有构造方法;

接口不能用new操作符实例化

所有方法必须是公共的抽象实例方法;

Java只允许类单继承,但是允许接口做多重扩展。

原创粉丝点击