Java学习——面向对象特性

面向对象特性

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

封装

1、概念

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

2、好处

a.只能通过规定的方法访问数据。

b.隐藏类的实现细节,方便修改和实现。

3、封装的实现步骤

1.修改属性的可见性:设为private
2.创建getter/setter方法:用于属性的读写
3.在getter/setter方法中加入属性控制语句:对属性值的合法性进行判断

继承

1、概念

继承强调类与类之间的一种关系,是一种“is a”的关系

例如:狗是一种动物——狗继承了动物

其中: 动物是父类(基类)

1
狗是子类(派生类)

注意: Java中继承关系是单继承的,即一个类只有一个父类

2、好处

①子类拥有父类的所有属性和方法;(private修饰的无效!)

②实现代码的复用。

3、语法规则

1
2
3
4
5
6
class  子类  extends 父类
例如:class Dog extends Animal{

......

}

4、Java中的继承初始化顺序

创建子类对象时,会执行以下步骤:

  1. 创建父类对象——父类属性初始化——父类构造方法执行
  2. 子类属性初始化——子类构造方法执行

重载和重写的区别

1、定义的不同

重载:方法名称相同,参数的类型或个数不同。
重写:方法名称,参数的类型,返回值类型全部相同。

2、权限的不同

重载:对权限没有要求
重写:被重写的方法不能拥有比父类更严格的权限。

3、范围不同

重载:发生在一个类中
重写:发生在继承中

4、final关键字

使用final关键字做标识有“最终的”含义

final可以修饰类、方法、属性和变量

final修饰类,则该类不允许被继承

final修饰方法,则该方法不允许被覆盖(重写)

final修饰属性

1
则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)

final修饰变量,则该变量的值只能赋一次值,即变为常量

5、super关键字

a、应用范围

访问父类属性:例如:super.age

访问父类的方法:例如:super.eat( )

b、super与构造方法的关系

子类的构造过程中必须调用父类的构造方法

1、如果子类的构造方法中显示(写了super( )代码)调用父类的构造方法,则super()代码必须放在子类构造方法中的第一行;

2、如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法;

3、如果子类的构造方法中既没有显示调用父类的构造方法,而父类也没有无参的构造方法,则编译出错!

6、Object类

object类时所有类的父类,如果一个类没有继承其他类,那么默认继承object类,Object类中的方法,适用于所有子类。

toString()方法

在Object类中,定义toString( )方法时返回对象的哈希code码(对象的地址字符串)

可以通过重写toString( )方法来输出对象的属性

//可直接在菜单栏的Source中使用Generate toString()工具自动重写toString()方法

equals()方法

比较的是对象的引用是否指向同一块内存地址

如果要比较两个对象的属性值等是否相等,则需要重写equals方法。

多态

在Java中,多态的前提是继承。

引用多态

1.父类的引用可以指向本类的对象

2.父类的引用可以指向一个子类对象

注:子类的引用不能指向父类对象

方法多态

1.创建本类对象时,调用的方法为本类方法

2.创建子类对象时,调用的方法为子类重写的方法或者继承的方法

注:创建的父类对象,不能调用子类独有的方法。

Java中的引用类型转换

1、自动转换类型,是小类型到大类型的转换。

2、强制转换类型,是大类型到小类型。

3、instanceof运算符,来解决引用对象的类型,避免引用类型转换的安全性问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
例:子类  对象名 = new 子类();

父类 对象名 = 子类的对象名;//自动类型转换(从小到大)

例:父类 对象名 = new 父类();

子类 对象名 = (子类)父类对象名;//强制转换(从大到小)

instanceof是用来检测能否成功强制转换引用类型,一般和if一起使用:

例:父类 对象名 = new 父类();

if(父类的对象名 instanceof 子类){

子类 对象名 = (子类)父类的对象名;

}else{

System.out.println("强制转换引用类型失败");

}

abstract抽象类

1、语法定义:抽象类前使用abstract关键字修饰,则该类为抽象类

2、应用场景:

​ a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。

1
b、从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。

3、作用:限制规定子类必须实现某些方法,但不关注实现细节

4、使用规则

1
2
3
4
5
6
7
a、abstract定义抽象类

b、abstract定义抽象方法,只有声明,不需要实现

c、包含抽象方法的类是抽象类

d、抽象类中可以包含普通的方法,也可以没有抽象方法

注:抽象方法没有方法体,以分号结束

Java中的接口

1,概念:类(是单继承)是一种具体实现体,而接口(多继承)是一种规范!

使用interface关键字。

2,语法:

1
2
3
4
5
6
7
【修饰符】 abstract interface  接口名【extends 父接口1,父接口2......】{

零个到多个常量定义......

零个到多个抽象方法的定义.....


​ 注意:接口就是用来被继承、被实现的,修饰符一般建议使用public!而不能使用private和protected修饰接口!!

3,接口定义:

​ ①方法:接口中的方法只能是抽象方法,总是使用public abstract,即使定义时不添加public abstract修饰符,系统会自动帮我们加上;

1
②常量:接口中的属性是常量,即使定义时不添加public static final修饰符,系统会自动帮我们加上。

4,使用接口:一个类可以实现一个或多个接口,实现接口使用implements关键字。

语法:

1
2
3
4
5
【修饰符】 calss 类名 extends 父类 implements 接口1,接口2...{

类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。


5,匿名内部类接口语法格式:

1
2
3
4
5
6
7
8
9
   Interface i=new Interface(){

public void method(){

System.out.println("匿名内部类实现接口的方式");

}

};