类和对象
类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修饰的属性、方法或代码块称为静态成员,随着类加载而加载到内存中,只加载一次
-
静态成员无需对象参与,通过类名即可访问,也可以使用对象访问。
-
静态方法中不能使用非静态成员,可以在静态方法中定义局部变量。
-
静态代码块随着类加载而执行一次,优先于构造方法执行。