面向对象知识梳理

一、面向对象

(一)、初步了解:

1、两者都是程序设计的一种风格(思想)。

2、除了面向对象,还有面向过程、指令式编程和函数式编程 。但在所有编程范式中,我们接触最多的还是面向过程和面向对象两种。

3、面向过程思想最先出现,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,出现了面向对象思想并成为目前主流的方式。

(二)、概念介绍:

1、面向过程:(procedure -Oriented Programming),简称POP

(1)、是以函数(一个一个功能)为结构,进行代码组织

(2)、解决问题时关注的焦点是过程,分析解决问题所需步骤一步一步解决

(4)、因此适合解决简单问题 ,相对于面向对象相语言,扩展能力差、后期维护难度较大。

(3)、代表语言:c语言

2、面向对象:( Object Oriented Programming),简称OOP

(1)、以类为组织单位。每种事物都具备自己的属性和行为(功能 )

(2)、解决问题时关注的焦点是类:分析各个类的属性和功能,抽取所需属性和功能,补充新的属性和功能形成新的类解决问题

(3)、因此可以解决复杂问题,代码扩展性强、可维护性高

(4)、代表语言:C++、C#、Java、Python、Ruby和PHP等

(三)、举例对比:

例题:实现把大象装进冰箱

1、用面向过程思想:

(1)、分析过程:打开冰箱==>把大象装进冰箱==>关上冰箱

(2)、逐步实现过程

2、用面向对象思想:

(1)、分析类:①:人 ②:大象 ③:冰箱

(2)、分析每个类的属性和功能,解决问题

(四)、补充说明

1、面向过程和面向对象虽然是两种不同的编程范式,但彼此并不相对独立,他们相辅相成的

2、面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。

二、类和对象(面向对象的核心概念)

(一)、基本理解:

1、类:具有相同特征的事物的抽象描述(定义/概念/模板)

2、对象:该类事物具体存在的一个个个体(万事万物皆为对象)

3、举例:

类 ==> 抽象概念的人

对象 ==> 实实在在的某个人

4、类的结构

(1)、变量:事物属性的描述(名词)

(2)、方法:事物的行为,即可以做的事情(动词)

(3)、构造方法:初始化对象

(4)、块:一段没有名称的代码块

(5)、内部类: 即在类体中声明的类(嵌套)

(二)、定义类

1、总结定义类:

类的声明格式:

[访问权限修饰符] [修饰符] class 类名{

}

2、发现类的共有属性(成员变量)

举例:

public class Car{

//成员变量定义

String name; //名称

String color; // 颜色

float price;//价格

}

3、发现类的共有行为(成员方法)

方法声明格式:

[访问权限修饰符] [修饰符] void start( ){

System.out.println("汽车启动");

[return 返回值;]

}

三、变量

(一)、分类

1、按类型分:

基本数据类型

引用数据类型

2、按位置分:

成员变量(在类中定义)

(1)、成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。

(2)、java中的变量在使用之前都想必须初始化,但对于成员变量,系统会默认进行初始化(String初始化为null)。

(3)、在成员变量可以在成员方法、构造方法/代码块中使用

(4)、成员变量的作用范围为整个类体

局部变量(在方法中定义)

(1)、局部变量不会初始化

(2)、方法参数也是局部变量

四、构造方法

1、每个类都有构造方法,如果没有显式地为类定义构造方法,Java将会为该类提供一个默认构造方法 (用来为新创建的对象中的成员变量进行初始化)

2、默认提供的构造方法 方法名 与 类名 相同,且没有返回值,不需要使用void修饰

3、只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效 (此时需要自己对成员变量进行初始化)(可以使用方法的重载)

4、一个类可以有多个构造方法

五、方法的重载

1、在一个类中,有多个方法名相同但参数个数不同的方法

2、为使系统区分这些方法,这些方法的参数必须不同(类型、个数、顺序)

(Java属于强类型语言)

3、方法重载跟方法的返回值类型没有任何关系

六、对象与引用

1、Java 语言中除基本类型之外的变量类型都称之为引用类型

2、Java中的对象是通过引用对其操作

3、Java中进行方法调用中传递参数时,参数传递有两种

(1)、值传递:(形参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应 的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同 的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

(2)、引用传递:引用传递:(形参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参 数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的 操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法 执行中形式参数的改变将会影响实际参数

七、关键字

(一)、this关键字

1、引用成员变量:

this关键字表示当前正在执行的对象

在编程时,为了区分成员变量和局部变量,在编码时,可以使用this关键进行指示,使用this调用的是成员变量或者成员方法

2、引用构造方法:

(二)、static(静态)关键字

1、修饰成员变量、成员方法、代码块、内部类

2、静态变量

eg:

public class Chinese {
    String name;
    static String country="中国";
}

(1)、静态变量与类一样,只在方法区创建一次,即只有一份

(2)、当所有类的某个属性值相同,就可以将这个属性值定义为静态变量,以便于更加合理的使用内存。

(3)、当类被加载时,静态成员就会加载(因此非静态成员不能在静态方法中使用)

(4)、静态的执行可以被类、对象访问,但非静态的执行只能通过对象访问

(5)、可以通过 . 类名 修改或调用静态变量

                        或 . 引用对象名

(6)、但因静态成员只在类中有一份,所以建议 直接使用类名进行访

(7)、不能用this

(8)、静态变量在加载时,由系统自动初始化赋值

2、静态方法

(1)、加载顺序:静态方法随类的加载而加载,先于对象存在,非静态的方法创建对象后才加载

(2)、静态方法在本类的任意方法、代码块、构造器中都可以直接被调用

(3)、静态方法在其他类中可以通过类名直接访问(也可以通过对象.静态方法的方式调用但是更推荐使用类名.静态方法的方式)

(4)、静态方法不能使用非静态成员

(5)、非静态成员方法,可以使用静态成员变量,因为静态变量先加载

(6)、static方法内部不能有this,也不能有super

3、在方法中不使用非静态的成员变量时,可以将方法设计为非静态方法,方便访问,节省内存

八、代码块:(定义在类中,类似于一个没有名字的方法,分为实例代码块和静态代码块 )

1、补充:类中可以定义:

成员变量 :非静态(属于对象):每个对象都有一份

静态(属于类):和类一样只有一份

成员方法:非静态:可以使用静态和非静态的成员变量

静态:只能使用静态的成员变量

构造方法:用来在创建对象后,为对象成员进行初始化

代码块:定义在类中,类似于一个没有名字的方法,分为实例代码块和静态代码块

2、因为代码块没有名字,只能在满足条件时由系统调用

3、实例代码块:在创建对象时,被自动调用执行(实例代码块先于构造方法)

4、静态代码块:在类被加载时,被自动调用执行(和类一样只会加载一次)

5、类什么时候被加载

()、通过类名访问类中的静态成员时

()、在一个类中使用main方法

()、创建对象也会加载类

6、如果由多个实例代码块或多个静态代码块,他们会按照先后顺序执行

加载顺序:静态代码块-->实例代码块-->类构造方法

九、访问权限修饰符:

1、从大到小

(1)、public:修饰公共权限,修饰类、属性、方法。(可以在任意类中访问 )

(2)、protected:修饰受保护的权限,修饰属性、方法。(可以在同包类访问,如果不是同包类,必须是该类的子类才可以访问)

(3)、(default):默认权限,修饰类、属性、方法。(只能在同包的类访问 )

(4)、private:私有权限,修饰属性、方法。( 只能在本类中访问 )

十、面向对象语言的三大特征

(一)、封装

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

(二)、继承

1、一个类只能继承一个类不能继承多个类,但可以多层继承

2、一个类可以被多个类继承

3、java中如果一个类没有使用extends关键字显示其父类,那么这个类默认继承Object类

4、类 java.lang.Object,是类层次结构的根类,即所类的父类。每个类都直接或间接继承Object类。 ,用Object类可以表示任何类

5、继承有优点:

(1)、减少代码冗余,提高代码复用性

(2)、提高代码扩展性

6、方法的重写:

(1)、当父类的方法功能实现不能满足子类需求时,可以对方法进行重写( override).

(2)、子类可以对从父类中继承来的方法进行改造,我在程序执行时,子类的方法将覆盖父类的方法。们称为方法的重写也称为方法的覆盖

注意:(1)、父类私有方法不能重写(2)、跨包的父类默认权限的方法也不能重写

(3)、@Override(注解标记(标签)):表示此类方法是由父类中重写而来,在编译期间,会进行语法检测

7、super关键字

(三)、多态

1、父类引用指向子类对象,从而产生多种形态
2、多态性的好处:提高代码的扩展性

3、注意:

(1)、变量不存在被子类覆写这一说法,只有方法存在覆写。

(2)、对于非静态成员方法多态情况下:编译时(写代码时)看左边,运行时看右边;对于静态成员方法:编译时、运行时都看左边

4、多态缺点:为了实现多态性,将子类类型向上转为父类类型一旦上升为父类类型,那么就调用不到子类中特有的方法

解决办法:向下转型,为了使用子类中的特有方法,若直接转转不了,使用强制类型转换(注意转换有前提条件)

public class Test2 {
    public static void main(String[] args) {
        //第三部分:强制转化
        Animal dog=new Dog();//Animal 的引用指向Dog的对象
        //父类中中存在的方法
        dog.sleep();
        Animal.show();
        //子类中的方法需要强制转化
        Dog dog1=(Dog)dog;
        ((Dog) dog).lookHome();
        dog1.lookHome();
    }
}

十一、final关键字

1、final 用于修饰类,方法,参数,和属性(成员变量)

所修饰的类:不能被定义为抽象类或是接口,不可被继承

所修饰的方法:子类里不可以重写

所修饰的参数:参数值在方法中不可被修改

十二、抽象类

不能创建对象,其他功能都能被子类正常继承。

当一个具体的类继承抽象类后,要么重写抽象方法,要么将此子类声明为抽象类

十三、接口(Inteface)

1、接口是隐式抽象的,主要用来定义功能.
2、接口中可以定义静态常量,抽象方法,静态方法,默认方法.
3、一个接口能继承其它多个接口.
4、接口不能实例化对象.
5、接口是要被类实现,一个接口可以被多个实现
6、当类实现接口的时候,类要实现接口中所有的抽象方法,否则,该类必须 声明为抽象的类.
7、接口与实现类之间存在多态性

​​​​​​​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值