4.1 类
面向对象四大基本特征:封装、继承、多态和抽象
每个对象都有两个特征:属性(成员变量)、行为(成员方法)
4.1.1 类
1)定义类
格式:【访问修饰符】 class 类名{
所含变量定义;
}
注:访问修饰符有4种:public、private、protected和默认的
2)属性
对象所拥有的静态特征即为属性
3)方法
对象执行操作的行为称为类的方法
4.1.2 使用类实例化对象
1)创建对象或方法
(1.)创建对象格式:
类名 对象名=new 类名( );
注:1.左边的类名:对象的数据类型
2.右边的类名():类的构造方法
(二)创建方法格式:
【访问修饰符】 方法类型 方法名(形参列表){
方法内容;
}
2)访问对象中的成员
(一)访问成员变量:
格式:对象名.成员变量名;
(二) 访问成员方法:
格式:对象名.方法名(参数值列表);
4.2 认识成员方法
4.2.1 成员方法
1)访问权限:
public > protected > 默认的 >pribate
2)方法名:
1.合格的标识符
2.首写字母小写,若干个单词,后面的首字母大写
eg:setDefaultCloseOperation( ){ }
3)形参:
可以有0个或多个 eg:void fun(int x,……)
4)方法体:是否有return 语句
4.2.引申 访问器和设置器
当我们在一个类中用private修饰了一个或多个属性后,这一个或多个属性在其他类中就是不能访问的了,这时我们就可以使用访问器和设置器在其他类中访问或者是控制其他类可以访问和更改部分属性值
4.3 认识构造方法
4.3.1 构造函数
(一)定义时应遵循
(1.)函数名称与类的名称相同
(2.)不含返回类型
(二)格式
类名 对象名=new 类名(传给构造函数的参数列表);
注:(1)在对象的生命周期中,构造函数只有在对象被创建时,才会被调用
(2)构造函数可以被重载,也就是说在一个类中可以定义多个构造函数
(3)在一个类中如果没有定义构造函数,系统会自动为这个类产生一个默认的构造函数,该系统没有参数,也不做任何事情
5.1 静态变量和静态方法【static】
5.1.1 静态变量(也称类成员)
(1.)它属于整个类所有,而不是某个对象所有,被类的所有对象共享
(2.)静态变量可以通过“对象名.变量名”来访问,也可以通过“类名.变量名”来访问
(3.)静态类成员在类被载入时创建,就会为其分配空间直到该类被卸载时才会被回收
5.1.2 静态方法(也称类方法)
1.静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态类成员;
2.静态方法中不能直接调用非静态变量,需要通过对象来访问非静态方法;
3.如果系统在静态方法中调用非静态类变量,可以通过创建类的对象,然后通过对象来访问非静态变量;
4.在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。
5.1.3 静态代码块(初始化器)
(一)格式:
static { 初始化列表; }
eg:static { int a; double b; }
(二)意义:
当类被载入时静态代码块被执行,且只被执行一次,静态代码块经常用来进行类属性的初始化。
(三)执行顺序
静态初始化块–>普通初始化块–>构造方法
public class Demo1{
Demo1(){
System.out.printf("hoell!!");//默认构造函数
}
Demo1(int a){
System.out.printf("hoell!!");//有参构造函数重载
}
int a,b; //定义成员变量
public static void fun(int a){
System.out.printf("hoell!!");
}//定义静态成员方法
}
5.2 认识封装
5.2.1 封装的概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法实现对隐藏信息的访问和操作。
5.2.2 实现封装
(1.)修改属性的可见性:设为private
(2.)创建getter/setter方法:用于属性的读写
(3.)在getter/setter方法中加入属性控制语句:对属性值的合法性进行判断
5.3 包
5.2.1 包定义
管理JAVA文件,解决同名文件的冲突
5.2.2 访问包中的类
格式:import 包名.*
作用:导入该包中的所有类
6.1 认识继承
6.1.1 extends 单继承
继承的本质:代码复用(由已有类创建新类的过程)
继承了:父类中非private修饰的成员(成员变量和成员方法)
6.1.1 构造方法的执行顺序
(1.)先执行父类的构造方法,在执行子类的构造方法
(2.)默认情况下,调用的是父类无参数的构造方法,调用的是父类无参数的构造方法,因为子类构造方法中有隐式的super()
(3.)可以通过super()更改调用父类的构造方法
(4.)默认情况下,如果父类没有无参构造方法,子类创建会出错
6.2 覆盖概念
子类中有与父类同名的成员变量和成员方法
覆盖可分为:(1.)变量的覆盖–>变量的隐藏
(2.)方法的覆盖–>方法重写
注:子类重写的方法,与父类相比,拥有相同的访问权限、方法名、参数
访问权限>=父类方法的访问权限
6.2.2 supper关键字
1)使用场景:在子类中使用
2)调用父类的成员(成员变量、成员方法):super.*** 或 super.xxxl()
3)调用父类的构造方法:super(【参数列表】);
6.2.3 this关键字
1)使用场景:在本类中使用
2)调用父类的成员(成员变量、成员方法):this.*** 或 this.xxxl()
3)调用父类的构造方法:this(【参数列表】);
6.3 多态
6.3.1 认识多态
多态可以分为静态多态和动态多态,方法重载是静态多态,父类引用可以指向子类对象是动态多态
6.3.2 使用多态
(1.)函数传入的形参可以是父类类型,而实际传入的可以是子类对象
(2.)函数返回类型是父类类型,而实际返回的可以是子父对象
6.3.3 父类和子类对象的类型转换
(1.)子类类型对象转换成父类类型:隐式/自动类型转换(无风险)
(2.)父类类型对象转换成子类类型:强制转换型(有风险)
6.4 抽象类和接口
6.4.1 抽象类
(一)抽象类特征
1.抽象类不能被实例化
2.抽象方法必须被重写,除非子类也是抽象类
3.在抽象类中可以含有普通成员函数
6.4.2 接口
(一)格式:【修饰符】 interface 接口名 [extends 父接口1,父接口2] {
undefined 零个到多个常量定义/零个到多个方法定义
}