面向对象(二)

面向对象(二)

Java计算机高级语言

一.类的封装

封装是面向对象编程的核心思想。封装的载体是类,且对象的属性和行为被封装在这个类中。

例:顾客到餐馆吃饭,点了一盘鱼香肉丝,感觉味道很好吃,顾客就想直到厨师的名字,方便接下来的菜品都让这个厨师负责。按照生活日常场景来说,顾客接触的是服务员,服务员接触厨师,而厨师被封装在餐厅里,顾客无法直接接触厨师。代码如下:

面向对象(二)

创建实体类

面向对象(二)

封装的意义

顾客只能指定接触服务员,无法与封装的厨师进行互动,保证了封装的特性。

二.类的继承

继承的基本思想是基于某个父类的扩展,并指定一个新的子类,子类可以继承父类原有的属性及方法,也可以增加原来父类所不具备的属性和方法,或者直接在父类原有方法上重写。

1.extends关键字

在Java中,让一个类继承另一个类需要使用extends关键字,语法如下:

child extends parents

子类child继承父类parents的时候,也得到了parents中的属性及方法。

注:Java中仅支持单继承,及一个类只能有一个父类

child extends parents1,parents2{//错误的继承

}

创建一个电脑类Computer,电脑类具有屏幕属性screen和开机方法starup()。现Computer类有一个子类Pad(平板电脑)类 ,在父类的基础上,又多出一个battery(电池)属性,代码如如下:

面向对象(二)

父类电脑

面向对象(二)

子类pad

从代码可以看出,子类pad没出现定义屏幕属性和开机方法,但仍可以访问父类的属性和方法,就是从父类继承过来的,保证了继承的特性。

2.方法重写

父类的方法都会继承给子类,但是如果父类的某个方法不适用于子类时,子类就可以重写这个方法。

1.重写的实现

继承并不只是扩展父类的功能,它还可以重写父类的成员方法。重写就是在子类中将父类的方法名保留,但重新编写方法内部的功能。

在继承中还有一种特殊重写方式,子类与父类的成员方法返回值,方法名称,参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊的重写方式被称为重构。

注:当重写父类方法时,修改方法的修饰权限只能从小到大的范围改变,例如:

public void doit()
private void doit()
//这种重写方式为错误的

编写一个程序,平板电脑类是普通电脑类的子类,当使用普通电脑时,普通电脑会提示你“欢迎使用”,而使用平板电脑则会提示“欢迎进入ipad”,代码如下:

面向对象(二)

方法重写

2.super关键字

如果子类重写了父类的方法,也就再也无法调用到父类的方法了吗?如果想在子类的方法中实现父类的原有方法怎么办?为了解决这种需求,Java提供了关键字super,super关键字代表父类对象,使用方式如下:

super.property//调用父类属性
super.method()//调用父类方法

3.所有类的父类--Object

在一开始学习类class关键字的时候,就已经使用到了继承原理,因为在Java中,所有的类都是直接或间接继承了java.lang.Object类,这个类比较特殊,他是所有类的父类,是Java中的最高层。当创建一个类时,除非指定继承了某个类,否则都是默认继承Object,例如Sring类,Interger类等,因为所有类都是Object的子类,所以在创建类时,省略了exends语句。

class Anything{
}
class Anything exends Object{
}

Object类中主要包括了clone(),finalize(),equals(),toString(),等方法,其中常用的就是equals()跟toString()。由于继承原理,任何类都可以重写Object类中的方法。

注:final类型的方法不能被重写

getClass():方法返回某个对象的class实例,然后可以通过class调用getName()方法获取类名。

toString():方法会返回某个对象的字符串表示形式,当打印某个对象时,自动调用重写后的toString()方法,console界面就会显示当前对象的字符串形式。

equals():比较两个对象的引用地址是否相等。

三.类的多态

在Java中,多态的含义为:一种定义,多种实现。

1.方法重载

构造方法的名称由类名决定,如果以不同的形式创建某个类的对象,那么就需要使用不同形参的构造方法来完成。为了让这些方法名相同但形参不同的构造方法同时存在,必须用到方法重载,虽然方法重载起源于构造方法,但是其他方法也可以使用。

方法重载就是在同一个类中允许存在相同的方法名,但是参数个数或者参数类型不同。

创建OverLoadTest类,类中编写add()方法的多个重载楔形,然后在主方法种分别输出这些方法的返回值,代码如下:

面向对象(二)

方法重载

2.向上转型

Java中,对象类型的转换包括向上和向下,例如,平行四边形是一种特殊的四边形,也就说平行四边形是四边形的一种,那么就可以将平行四边形看作四边形的对象。

创建Quadrangle类,在创建Parallelongram子类继承Quadrangle类,在主方法中调用draw()方法,代码如下:

面向对象(二)

向上转型

代码可以看到,子类对象赋值给了父类类型的对象,这种技术被称为“向上转型”

向上转型是安全的,即平行四边形是四边形,但不能说四边形是平行四边形。

3.向下转型

修改代码,在Parallelongram子类的主方法中将父类Quadrangle的对象赋值给子类对象的引用变量,这样程序会产生错误,代码如下;

面向对象(二)

在做向下转型操作时,需要告知编译器,使它认定这个四边形就是平行四边形的对象,将父类强制转化为某个子类对象的方式被称为显式类型转换。代码如下:

面向对象(二)

显式类型转换

4.instanceof 关键字

当程序执行向下转型操作时,如果父类对象不是子类的实例,就会发生ClassCastException异常,所以在执行某个向下转型之前需要使用instanceof关键字判断父类对象是否为子类实例。instanceof还可以判断是否实现某个接口,语法格式如下:

myobject instanceof ExampleClass

myobject :某个对象引用

ExampleClass:父类

方法返回值为布尔类型。

四.抽象类与接口

1.抽象类与抽象方法

在Java中,抽象类不能产生对象实例化,定义抽象类时,用到关键字abstract,语法如下:

权限修饰符 abstract class 类名{
}

使用abstract关键字创建类就是抽象类,使用abstract关键字创建方法就是抽象方法

权限修饰符 abstract 方法返回值类型 方法名(参数列表);

抽象方法没用方法体,本身无实际意义,除非被重写,而承载抽象方法的抽象类必须被继承。实际上,抽象类除了被继承外,毫无意义。

2.接口的声明与实现

接口为抽象类的衍生,可以把它看作纯粹的抽象类,接口中的所有方法都没有方法体。Java中单继承,多实现,类只允许继承一个类,但可以实现无数接口,当一个类需要重写多方法时,就可以使用接口,接口使用interface关键字进行定义,语法如下:

修饰符 interface 接口名 {

}

//与类相同,可以直接在包中创建,new -> interface。

接口中的方法都是抽象方法,没用方法主体

类实现接口使用implements关键字,代码如下:

public class Parallelongram implements Inter{

}

注:在接口中定义任何变量都是static和final的,实现接口的子类不能对接口中的变量重新赋值。

平行四边形实现画图接口,重写接口的方法draw()。

面向对象(二)

实现接口

3.多重实现

Java中不允许多继承,但是可以多实现。

class 类名 implements 接口1,接口2,接口3。。。。

4.区分抽象类与接口

抽象类与接口都包含可以由子类继承实现的成员,但抽象类是对根源的抽象,而接口则是对动作的抽象,主要有以下几点区别:

  • 子类只能单继承抽象类,但可以多实现接口
  • 接口的方法都是抽象方法,抽象类可以存在实体方法
  • 抽象类中的成员变量可以是各种类型,接口中只能是静态常量
  • 抽象类中可以有静态方法和静态代码块等,接口不可以
  • 接口没有构造方法,抽象类可以有

五.访问控制

1.访问控制符

本章最开始介绍封装有两个方面的含义,该隐藏的隐藏,该访问的访问。这两个方面都需要使用访问修饰符来实现,Java访问修饰符包括public,protected,private和(缺省default)

面向对象(二)

访问修饰符范围

如果不使用public修饰符设置类的权限,这这个类默认缺省修饰。

使用访问控制符时,遵循以下几个原则:

  1. 大部分顶级类都是用public修饰
  2. 如果某个类主要用作其他类的父类,那么该类大部分方法被用于重写,而不是外界访问,多用protected修饰
  3. 类中的绝大部分属性用private修饰,除非一些静态static或类似全局变量的属性,考虑使用public
  4. 当定义的方法只是用于辅助实现该类的其他方法(即工具方法)时,应使用private修饰
  5. 希望允许其他类自由使用的方法应使用public修饰。

2.Java类包

Java中定义好每一个类,通过Java编译器进行编译之后,都会生成一个.class的后缀文件,当这个程序规模逐渐扩大时,就很容易发生类名冲突的现象JDK API提供了成千上万的功能类,又是如何实现的呢?

Java中提供了一种管理文件的机制--包。包不仅可以解决类名冲突问题,在大型项目开发时可以帮助开发人员区分类,管理很多程序组件,方便后期维护。

file -- new --package

3.final关键字

final的含义是“最后的,最终的”,被final修饰的类,方法,变量不能被改变。

当某个类被final修饰,类中的所有方法都隐式被final修饰,但final类中的成员变量既可以被定义为final形式,又可以被定义为非final形式。

final class 类名{}

final修饰的方法不能被重写

public final void test(){
}

final修饰变量,就不可以再改变变量的值,通常被final修饰的变量被称为常量

final double d = 3.1415926; 

六.内部类

如果在一个类中定义另一个类,那么就把在类中定义的那个类称之为内部类。

1.成员内部类

除成员变量,方法和构造器可以作为类的成员外,成员内部类也可以作为类的成员语法如下:

public class OuterClass {	//外部类
	private class InnerClass{		//内部类
		//
	}
}

创建内部类对象与创建普通类对象的方式相同,都用到关键字new,如果在外部类初始化一个内部类,那么内部类对象就会绑定在外部类对象上。

创建汽车Car类,Car类有属性brand和方法start()然后在Car类内部创建一个类Engine,Engine类有属性model和方法ignite(),最后打印“启动汽车,发动机点火”代码如下:

面向对象(二)

成员内部类

2.匿名内部类

匿名内部类的特点就是只是用一次,也就是说不能被重复使用。串讲匿名内部类的实例后,匿名内部类立即消失。匿名内部类的所有实现代码都需要在大括号之间进行编写,最常用的创建匿名内部类的方式是创建某个接口类型或抽象类的对象,如法如下:

new A(){

//匿名内部类类体

}

要遵循以下原则:

  • 没有构造方法
  • 不能定义静态成员
  • 不能被private,public,protected,static,final,abstract等修饰
  • 只可以创建一个匿名内部类

以上就是我们第四章Java面向对象的第二小节,感谢读者翻阅,辛苦小伙伴点个赞哦。

面向对象(二)

真男人感谢您的点赞


分享到:


相關文章: