面向对象基础

类和对象

类Class

具有相同的属性和行为的对象的集合,称为"一类"。类也可以称为模板。属性:描述对象的特征,在程序中,通过定义变量的形式表现属性。

行为:描述对象的动作,在程序中,通过定义方法的形式表现行为。

在程序中,通过定义一个class去定义一个类。在类中定义变量描述属性,定义方法描述行为。

定义类

[修饰符] class类名

        属性(变量)

        行为(方法)

}

创建对象

类名 对象名=new 构造方法(参数);

创建好的对象,使用.点操作符访问类中的非私有属性和方法

成员变量和局部变量

成员变量

定义在类中的变量,称为成员变量,拥有默认值。

类型默认值
整型0
浮点型0.0
布尔型false
字符型空字符
引用类型null

构造方法

概念

是一个特殊的方法,没有返回值,方法名和类名一致。每个类在定义时,都有一个默认隐藏的无参数的构造方法,在创建对象时自动调用,通常用于初始化成员变量。

特点

  • 没有返回值(没有返回值,并不是void),方法名和类名必须相同

  • 每个类默认有一个无参数的构造方法,方法体中没有内容

  • 构造方法不能通过.操作符调用,在创建对象时自动调用,所以通常用于初始化成员变量

  • 如果自己写了有参的构造方法,默认无参的构造方法就会失效,如果想要使用无参的构造方法,需要再写出来才能使用

  • 构造方法可以限制创建对象时的参数

  • 可以同时存在多个不同参数的构造方法,这称为构造方法的重载

面向对象的三大特性(封装、继承、多态)

封装

使用private关键字对属性进行修饰,可以防止除自身类之外的地方对该属性进行访问。

这样可以保护关键属性,隐藏类内部的实现细节,再对外提供一组公开的get/set方法用于对该属性的赋值和读取。

使用IDEA自动生成getter/setter方法

在类中,右键generator或快捷键alt+insert,选择getter and setter,选择要封装的属性

继承

类A可以通过extends关键字继承类B。

语法:class A extends B

类A称为子类、派生类、衍生类、subClass

类B称为父类、基类、超类、superClass

继承后,子类可以访问父类中非私有的属性和方法。

继承的特点

  • 如果多个类之中有相同或类似的代码,可以将这些代码提出来定义在一个公共的类中,这个类就是父类。再让那些类去继承这个父类,这样就能减少子类的重复代码。

  • 子类对象可以直接访问父类中非私有的属性和方法。

  • 子类可以对父类中的方法进行拓展或覆盖,这称为方法重写,重写后,子类对象再调用该方法时,执行的是重写后的内容。

  • java中是单继承,一个子类只能有一个父类,一个父类可以有多个子类。

  • java中可以多重继承,类A可以继承类B,类B也可以继承类C,这时类A可以访问类B和类C中非私有的成员。

  • 任何类都是Object类的子类。

  • 在创建子类对象时,先执行父类中相应的构造方法。

多态

多态是面向对象语言的一种特性,通常在代码中用于:需要使用一个父类对象时,实际传递的是一个子类对象,这时可以将子类对象当做父类对象使用。这种特性称为多态。

在不使用多态特性的情况下,假如要调用计算图形面积的方法,参数为圆时,输出圆的面积,参数为正方形时,输出正方形的面积。。。如果有新的图形出现,就要再重载这个计算面积的方法。

如果使用多态,就可以不用重载那些方法,只需要定义一个参数为所有图形的父类,调用该父类对象的计算方法。具体计算方法交给子类重写。这样就免去了重载的过程,只定义一个参数为父类对象的方法,实际传递子类对象,调用方法时执行的是子类重写后的内容。

方法重写override

当子类继承父类后,可以对父类中非私有的方法进行拓展。

这个行为称为方法重写。

重写用于子类拓展父类的某个方法。

重写要求

  • 方法名、参数列表、返回值必须和父类一致

  • 访问权限不能比父类更严格(访问修饰符的范围要么相同要么更大)

  • 不能抛出比父类更大的异常

重载要求

  • 方法名相同

  • 参数列表(参数类型和数量)不同

this和super

这两个关键字,都可以当做对象或构造方法使用。

this当做对象使用

用法:this.属性或this.方法。

这时的this,表示当前类的对象。只能在方法中使用。

通常用于在方法中区分成员变量和参数。如封装时的set方法就用到了this区分

this当做构造方法使用

用法:this([实际参数]);

此时的this()表示,当前类的一个构造对应的构造方法。

必须要写在另一个构造方法的第一行才能使用

super当做对象使用

用法同this,但super表示父类的对象。

可以通过super访问父类对象中的非私有属性和方法。

super当做构造方法使用

用法同this(),表示调用父类中的某个构造方法。

只能用在构造方法中的第一行。

重写toString()方法

在某个类的空白区域,右键generator或alt+insert,选择toString(),勾选要返回的属性信息

final

是一个关键字:单词意思为“最终",通常用户修饰类、方法和属性。

抽象abstract

修饰方法

用法:访问修饰符 abstract 返回值 方法名(参数列表);

如果某个父类中的方法在定义时无法决定要做什么,而是由其子类负责实现时,该方法可以定义为抽象方法。

注意这里的方法不能有方法体(大括号)。

这时该抽象方法所在的类,也必须用abstract修饰,让其成为一个抽象类。

不同点

接口中没有构造方法,抽象类中有构造方法。

接口中的抽象方法默认被public abstract修饰,可以不写,抽象类中的抽象方法需要写出abstract关键字。

接口中可以存在default方法,抽象类中不能存在default方法。

接口中的属性都是被public static final修饰的静态常量,抽象类中的属性可以自定义。

一个类可以实现多个接口,但只能继承一个类。

接口interface

在java中,数据类型分为原始类型和引用类型。

引用类型分为:数组、类和接口。所以接口是一种数据类型,类似于类。类使用class定义,接口使用interface定义。

如果一个抽象类中的所有方法都是抽象方法,那么就可以将这个抽象类定义为接口。

接口的特点

  • 接口不能实例化

  • 接口中的抽象方法默认使用public abstract修饰,属性默认使用public static final修饰

  • 接口中没有构造方法和普通方法

  • jdk1.8后,接口中允许定义"default修饰的默认方法"和"static修饰的静态方法"

  • 接口的实现类,必须重写接口中的抽象方法

static

对象创建时的内存变化

Person p = new Person();

每次new一个对象,都会在堆中开辟一块空间,将new出来的对象使用变量保存时,会在栈中定义一个

变量保存该对象的地址。

如果多个对象中拥有相同的属性或方法时,可以将该属性或方法使用static关键字定义为"静态的",这样

就能让该属性或方法在类加载的时候就加载到内存中,从而无需在创建对象时单独保存。

static的使用

static可以修饰属性、方法、代码块({}),被static修饰的内容,称为静态成员。

静态成员在类加载时就保存到内存中,所以可以脱离对象存在。在访问时,直接通过类名访问即可。

Java中的Math类中大量使用了static修饰属性和方法,所以直接使用Math进行调用。

static关键字的特点

  • 被static修饰的属性、方法或代码块称为静态成员,随着类加载而加载到内存中,只加载一次

  • 静态成员无需对象参与,通过类名即可访问,也可以使用对象访问。

  • 静态方法中不能使用非静态成员,可以在静态方法中定义局部变量。

  • 静态代码块随着类加载而执行一次,优先于构造方法执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值