Java——面向对象

目录

前言

一、什么是面向对象?

面向过程 & 面向对象

面向对象

二、回顾方法的定义和调用

方法的定义

方法的调用

三、类与对象的创建

类和对象的关系

创建与初始化对象

四、构造器详解

五、创建对象内存分析

类与对象小结

六、封装详解

访问控制权限

封装的意义

七、什么是继承?

Object类

八、Super详解

super用法

子类实例化过程

Super注意点

VS this

九、方法重写

静态方法

非静态方法

总结

十、什么是多态

十一、Instanceof关键字和类型转换

instanceof关键字

类型转换

对象向上转型

对象向下转型

 十二、static关键字详解

static关键字

代码块

十三、抽象类

十四、接口

接口的定义与实现

接口的作用

十五、N种内部类

总结


前言

随着对java学习的深入,接下来要学习的内容是基于java编程语言的面向对象知识。主要介绍了什么是面向对象、类和对象的创建、构造器详解、创建对象内存分析、封装、继承、多态、代码块、抽象类、接口、内部类等内容。


一、什么是面向对象?

面向过程 & 面向对象

面向过程思想

●步骤清晰简单,第一步做什么,第二步做什么....

●面对过程适合处理一些较为简单的问题

面向对象思想

●物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。

●面向对象适合处理复杂的问题,适合处理需要多人协作的问题

对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去解决。

面向对象

面向对象编程(OOP)

面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据

抽象

三大特性:封装、继承、多态

认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象

代码运行角度考虑,是先有类后有对象。类是对象的模板


二、回顾方法的定义和调用

方法的定义

修饰符 返回类型

 break:跳出switch,结束循环和return的区别

方法名:注意规范就ok  见名知意

参数列表:(参数类型 参数名)...

方法的调用

静态方法 非静态方法

 

形参和实参(需要注意的是实际参数和形式参数的类型要对应)

 值传递和引用传递

  

this关键字(在类里面this关键字就是指向目前对象的指针)

 ​​​​​​


三、类与对象的创建

类和对象的关系

类是一种抽象的数据类型,它是对某一事物整体描述/定义,但是并不能代表某一个具体的事物。

   ●Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的书屋应该具备的特点和行为

对象是抽象概念的具体事例

   ●张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。

   ●能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。

创建与初始化对象

使用new关键字创建对象

使用new关键字创建的时候,除了分配内存空间之外,还会给 创建好的对象 进行默认的初始化以及对类中构造器的调用。

类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点:

1、必须和类的名字相同

2、必须没有返回类型,也不能写void

构造器必须要掌握


四、构造器详解

 打开Student的class文件会发现比我们所写的代码多了一个Student()方法,这就是构造器,编译器会默认生成一个无参构造方法

无参构造与有参构造的简单介绍 

 


五、创建对象内存分析

类与对象小结

1、类与对象  类是一个模板:抽象,对象是一个具体的实例

2、方法   定义、调用

3、对应的引用  引用类型: 基本类型(8)  对象是通过引用来操作的:栈---->堆

4、属性:字段Field 成员变量  默认初始化 数字:0  0.0   char:u0000  boolean:false  引用:null     修饰符 属性类型 属性名=属性值

5、对象的创建和使用

必须使用new 关键字创造对象,构造器 Person kuangshen=new Person();

对象的属性  kuangshen.name

对象的方法  kuangshen.sleep()

6、类:

静态的属性  属性

动态的行为  方法


六、封装详解

该露的露,该藏的藏  

程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用

封装(数据的隐藏)

通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏

记住这句话:属性私有,get/set

访问控制权限

Java中,针对类、成员方法和属性,Java提供了4种访问控制权限,分别是privatedefaultprotectedpublic。下面通过一张图将这4种访问控制权限按级别由小到大依次列出,如下图所示。

1privateprivate属于私有访问权限,用于修饰类的属性和方法,也可以修饰内部类。类的成员一旦使用了private关键字修饰,则该成员只能在本类中进行访问。

2defaultdefault属于默认访问权限如果一个类中的属性或方法没有任何的访问权限声明,则该属性或方法就是默认的访问权限,默认的访问权限可以被本包中的其他类访问,但是不能被其他包的类访问。

3protectedprotected属于受保护的访问权限。如果一个类中的成员使用了protected访问权限,则只能被本包及不同包的子类访问。

4publicpublic属于公共访问权限。如果一个类中的成员使用了public访问权限,则该成员可以在所有类中被访问,不管是否在同一包中。

 访问控制权限的访问范围

访问范围

private

default

protected

public

同一类中

同一包中的类

不同包的子类

全局范围

 当属性为私有属性时,无法直接通过对象调用,而是只能通过方法(“接口”)调用,而属性为公有属性时则可以通过对象调用。

提供一些可以操作私有属性的方法 

 

 封装的意义

1、提高程序的安全性,保护数据

2、隐藏代码的实现细节

3、统一接口

4、系统可维护增加了


七、什么是继承?

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

extends的意思是“扩展”。子类是父类的拓展

JAVA中类只有单继承,没有多继承

继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等

继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。

子类和父类之间,从意义上将应该具有“is a”的关系

 子类Student继承了父类Person的属性与方法(但无法继承父类的私有属性或者私有方法)

 Ctrl+H

Object类

在创建了一个Person对象后,除了本身规定的方法以外,该对象 还有许多不是我们设置的属性

这是因为 在java中 所有的类都默认继承object类

这也是为什么,Ctrl+H所出现的树状图里面object是第一层

注:

Java中使用final关键字修饰的类不可以被继承,也就是不能派生子类 

 


八、Super详解

super用法

使用super关键字访问或调用父类的非私属性或非私有方法

super.属性

super.方法(参数1,参数2…)

使用super关键字调用父类中指定的构造方法 

super(参数1,参数2…)

子类实例化过程

1.产生对象并对成员变量默认初始化  

2.对构造方法中的形式参数赋值  

3.构造方法中是否有this语句调用  

4.super语句调用或隐式调用父类的构造方法  

5.去当前类中的成员变量显式初始化  

6.执行当前构造方法中的代码

 Super注意点

1、super调用父类的构造方法,必须在构造方法的第一个,并且只能出现一次。

2、super必须只能出现在子类的方法或者构造方法中

3、super和this不能同时调用构造方法

VS this

代表的对象不同:

this:本身调用者这个对象

super:代表父类对象的应用

前提:

this:没有继承也可以使用

super:只有在继承的条件下才可以使用

构造方法:

this():本类的构造

super():父类的构造

注:this和super不可以同时出现,因为使用this和super调用构造方法的代码都要求必须放在构造方法的首行


九、方法重写

在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名参数列表以及返回值类型

子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限。例如,父类中的方法是public权限,子类的方法就不能是private权限。如果子类在重写父类方法时定义的权限缩小,则在编译时将出现错误。

静态的方法和非静态的方法区别很大

静态方法

静态方法:方法调用只和左边定义的数据类型有关

非静态方法

非静态方法:方法调用只和右边创建的对象类型有关

注:

当一个类的方法被final关键字修饰后,该类的子类将不能重写该方法

 

 

总结

重写:需要有继承关系,子类重写父类方法

1、方法名必须相同

2、参数列表必须相同

3、修饰符:范围可以扩大但不能缩小

4、抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException-->Exception(大)

重写,子类的方法和父类必要一致,方法体不同


十、什么是多态

即同一方法可以根据发送对象的不同而采用多种不同的行为方式

一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

多态存在的条件

有继承关系    子类重写父类方法    父类引用指向子类对象 Father f1=new Son();

注意:多态的方法的多态,属性没有多态性

static 方法,属于类,它不属于实例

final 常量

private 方法

父类对象指向子类,那么只能够调用子类重写的父类的方法,而无法调用子类独有的方法 


十一、Instanceof关键字和类型转换

instanceof关键字

Java中可以使用instanceof关键字判断一个对象是否是某个类(或接口)的实例,语法格式如下所示。

对象  instanceof  类(或接口)

上述语法格式中,如果“对象”是指定的类的实例对象,则返回true,否则返回false

A(对象)instanceof B(类)

A和B比较之前会先判断A能不能转换成B类型,能则通过,不能则编译报错

person instanceof String之所以编译会报错,是因为person是Person类型,而String是final类型,两者不能转换。

而object instanceof Strinf中object是Object类型,String是Object的子类也继承了Object类型,所以能进行类型转换,编译通过。object这个对象不是String的本类或者子类,所以是false

编译通过后会把A和B比较,如果A是B本类或者子类的对象,结果就是true,反之就是false

类型转换

对象向上转型

对象向上转型,父类对象可以调用子类重写父类的方法,这样当需要新添功能时,只需要新增一个子类,在子类中对父类的功能进行扩展,而不用更改父类的代码,保证了程序的安全性。对于向上转型,程序会自动完成,对象向上转型格式如下所示。

对象向上转型:父类类型 父类对象 = 子类实例;

对象向下转型

除了向上转型,对象还可以向下转型。向下转型一般是为了重新获得因为向上转型而丢失的子类特性。对象在进行的向下转型前,必须先进行向上转型,否则将出现对象转换异常。    

向下转型时,必须指明要转型的子类类型。对象向下转型格式如下所示。

对象向下转型:

父类类型 父类对象 = 子类实例;

子类类型 子类对象 = (子类)父类对象;

 在向下转型时,不能直接将父类实例强制转换为子类实例,否则程序会报错

Student student = (Student)new Person();//编译错误


 十二、static关键字详解

static关键字

如果在Java程序中使用static修饰属性,则该属性称为静态属性(也称全局属性),静态属性可以使用类名直接访问,访问格式如下。

类名.属性名

static关键字只能修饰成员变量,不能修饰局部变量,否则编译器会报错。

如果想要使用类中的成员方法,就需要先将这个类实例化。而在实际开发时,开发人员有时希望在不创建对象的情况下,通过类名就可以直接调用某个方法,这时就需要使用静态方法,要实现静态方法只需要在成员方法前加上static关键字

同静态变量一样,静态方法也可以通过类名和对象访问,具体如下所示。

类名.方法

实例对象名.方法

 

注意:静态方法只能访问静态成员,因为非静态成员需要先创建对象才能访问,即随着对象的创建,非静态成员才会分配内存。而静态方法在被调用时可以不创建任何对象。

代码块

代码块,简单来讲,就是用{}括号括起来的一段代码。

普通代码块就是直接在方法或是语句中定义的代码块。

匿名代码块是在类中 { 代码段 } 格式写的一段代码,在使用关键字new创建一个类时被执行,一般用于初始化赋值操作。每次new创建新的对象都会执行一次匿名代码块

静态代码块是写在类中,使用 static{ 代码段 } 格式定义的一段代码块,由于类只加载一次,所以静态代码块只执行一次。通常使用静态代码块对类的成员变量进行初始化

在程序中,代码块与类的构造方法执行先后顺序如下:

静态代码块>匿名代码块>类的构造方法

 


十三、抽象类

定义一个类时,常常需要定义一些成员方法用于描述类的行为特征,但有时这些方法的实现方式无法确定的。对此,Java提供了抽象方法来满足这种需求。抽象方法是使用abstract关键字修饰的成员方法,抽象方法在定义时不需要实现方法体抽象方法的语法格式如下。

abstract 返回值类型 方法名称(参数列表);

abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。声明抽象类和抽象方法时都要使用abstract关键字修饰

抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。

抽象类不能使用new关键字来创建对象,它是用来让子类继承的

抽象方法只有方法的声明没有方法的实现,它是用来让子类实现的。

子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类

当一个类包含了抽象方法,该类就是抽象类。抽象类和抽象方法一样,必须使用abstract关键字进行修饰。抽象类的语法格式如下。

abstract class 抽象类名称{

    属性;

    访问权限 返回值类型 方法名称(参数){                    //普通方法

        return [返回值];

    }

    访问权限 abstract 返回值类型 抽象方法名称(参数);//抽象方法,无方法体

}

 


十四、接口

接口是一种用来定义程序的协议,它用于描述类或结构的一组相关行为。接口是由抽象类衍生出来的一个概念,并由此产生了一种编程方式,可以称这种编程方式为面向接口编程面向接口编程就是将程序的业务逻辑进行分离,以接口的形式去对接不同的业务模块。接口中不实现任何业务逻辑,业务逻辑由接口的实现类来完成。当业务需求变更时,只需要修改实现类中的业务逻辑,而不需要修改接口中的内容,以减少需求变更对系统产生的影响。

普通类:只有具体的实现

抽象类:具体实现和规范(抽象方法)都有

接口:只有规范!自己无法写方法

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须能...”的思想。

接口的本质是契约,就像法律一样,制定好后大家都遵守。

OOP的精髓是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论涉及模式都只针对具备了抽象能力的语言,就是因为设计模式所研究的实际上就是如何合理的去抽象。

声明类的关键词是class,声明接口的关键字是interface

接口的定义与实现

接口使用interface关键字声明,语法格式如下

[public] interface 接口名 [extends 接口1,接口2...] {

  [public] [static] [final] 数据类型 常量名 = 常量;

  [public] [abstract] 返回值的数据类型 方法名(参数列表);

  [public] static 返回值的数据类型 方法名(参数列表){}

  [public] default 返回值的数据类型 方法名(参数列表){}

}

在很多的Java程序中,经常看到编写接口中的方法时省略了public ,有很多读者认为它的访问权限是default,这实际上是错误的。不管写不写访问权限,接口中方法的访问权限永远是public。 

需要注意的是,一个类可以同时实现多个接口,实现多个接口时,多个接口名需要使用英文逗号(,)分隔。 

定义接口的实现类,语法格式如下。

修饰符 class 类名 implements 接口1,接口2,...{

    ...

}

如果在开发中一个子类既要实现接口又要继承抽象类,则可以按照以下语法格式定义子类

 修饰符class 类名 extends 父类名 implements 接口1,接口2,... {

    ...

}

在Java中,接口是不允许继承抽象类的,但是允许接口继承接口,并且一个接口可以同时继承多个接口。 

接口的作用

1、约束

2、定义一些方法,让不同的人实现

3、public abstract

4、public static final

5、接口不能被实例化,接口中没有构造方法

6、implements可以实现多个接口

7、必须要重写接口中的方法


十五、N种内部类

内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。

一个java类中可以有多个class类,但是只能有一个public class类

局部内部类


总结

以上就是本文要介绍的内容,主要介绍了什么是面向对象、类和对象的创建、构造器详解、创建对象内存分析、封装、继承、多态、代码块、抽象类、接口、内部类等内容。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茄味琪琪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值