面向对象
学习目标
1.掌握面向对象思想
2.认识类与对象
3.面向对象特点
4.掌握接口及构造方法
5.关键字this、static、final、finally、super等
6.内部类
一、面向对象思想
面向过程:具体化
面向对象:模型化
将数据以及解决问题的方法封装起来,通过继承、多态来实现,方便我们使用。
二、类与对象
1.定义
对象:一个具体的实体、事物
类:把具有相同属性和作用的对象归为一类,进行抽象描述
2.类
类包括属性(常量和变量)和方法。
1.变量
1.全局变量
定义在类里面的变量,可以被任何类或方法使用。
2.局部变量
从定义的作用域开始,到代码块结束
3.类变量(静态变量)
类变量又叫静态变量,在定义类的同时,用static来修饰该变量,使用时需要用类名.变量名,使用对象也可以使用。当使用类改变变量的值,其值也会发生变化。
4.成员变量
在类中的变量,必须先实例化才能使用的变量
2.变量的联系与区别
成员变量:作用范围是整个类,定义在方法体和语句块之外,一般定义在类的声明之下;成员变量包括实例变量和类变量。
实例变量:独立于方法之外的变量,无static修饰,声明在一个类中,数值型变量默认值为0;布尔型默认值为false;引用类型默认值为null
类变量:用static修饰,属于对象共有,存储在静态存储区。
调用:
类名.静态变量名/对象名.静态变量名
局部变量:类的方法中的变量,在栈上分配,无默认值,必须经初始化
3.创建对象
(1)声明变量
(2)实例化对象
(3)初始化变量
三、面向对象特点
1.封装
2.继承
Java中支持单继承,不能多继承,但可以多重继承。
1.重写和重载的区别
3.多态
1.抽象
1.抽象类
①不能直接创建对象
②抽象类不能被实例化
③可以有抽象方法也可以没有
2.抽象方法
只有声明,没有方法体
2.多态的实现
①父类名称 对象名=new 子类名称();
②接口名称 对象名=new 实现类名称();
3.多态的访问规则
1.访问成员变量:编译看左边,运行看左边
2.访问成员方法:编译看左边,运行看右边
4.多态的转型
1.向上转型
向上转型是安全的,小范围转向大范围;但是对象一旦向上转型为父类的话,无法调用子类原本的特有内容
格式:
父类名称 对象名=new 子类名称();
2.向下转型进行还原
格式:
子类名称 对象名=(子类名称)父类对象;
3.instanceof
四、接口和构造方法
I.接口
1.接口最重要的内容是抽象方法,从Java8开始,可以定义默认方法、静态方法,Java9开始,可以定义私有方法。
2.接口中抽象方法的修饰符:public abstract
3.接口中可以定义成员变量,修饰符:public static final
4.接口中的常量必须进行赋值
5.接口中没有静态代码块和构造方法
II.构造方法
1.构造方法在什么时候运行?
在new的时候会自动运行,且只运行一次。
2.每个类当中,必须拥有构造方法
构造方法不写也是有的,编译时,会自动检查类中是否有构造方法,如果没有,编译器会自动添加一个构造方法。
3.注意事项
1.接口中没有自动的构造方法
2.静态代码块比构造方法先执行
4.普通方法和构造方法的区别
①构造方法的方法名必须和类名相同,普通方法没有特殊要求
②构造方法在对象创建的时候就执行一次,而且只执行一次;而普通方法是在对象被创建后需要使用时才被调用,可以多次被调用
5.有了构造方法之后,可以对对象的属性进行初始化,那么还需要对应的setter和getter方法吗?
需要,因为对象在创建后需要修改和访问相应属性时,就可以通过set和get方法来操作。
6.构造方法里可以有return吗?
可以,但没有意义
五、关键字
I.static
1.static是属于类的,不属于对象自己
2.有了static都推荐使用类名称来进行调用
3.静态不能直接访问非静态,在内存中,“先有的”静态内容,"后有的”非静态
4.静态方法中不能使用this,this调用的是当前对象
5.静态代码块只会执行唯一的一次,用来一次性的对静态成员变量进行赋值
6.为什么main方法所在的类,在定义其他自定义方法的时候,都要用public static修饰?
只有main方法在公有级别时,才会对JVM可见;而且main方法是所有程序的入口,不通过对象调用某个方法,只有将该方法定义为静态方法。JVM对于Java程序已经是最底层,由它调用的方法的返回值已经没有任何地方可去,所以用void修饰。
II.this
1.this可以在本类的构造方法之间进行调用
2.this()只能写到代码第一行
3.this.的方式,区分封装里面局部变量和成员变量同名的情况
III.super
1.子类可以通过super()调用父类的构造方法
2.super(参数)调用的是父类的有参构造方法
3.super()只能写到代码第一行
4.this和super不能同时存在。
5.所有类的构造方法,默认第一行都是super();
IV.final
1.final用法:
定义一个成员变量;
用final修饰的成员变量,必须进行手动赋值
修饰一个局部变量;
用final修饰的局部变量,不能更改
修饰一个类;
用final修饰的类,不能有子类
修饰一个方法。
用final修饰的方法,不能被覆盖重写
2.对于类来说,abstract和final不能同时使用
六、内部类
成员内部类
1.定义格式
修饰符 class 外部类名称{
修饰符 class 内部类名称{
}
}
2.注意:内用外,随便访问;外用内,需要内部类的对象
3.使用成员内部类
直接访问:外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();
间接访问: 在外部类的方法中,使用内部类
局部内部类:定义在方法内部
1.只有当前所属的方法才能使用它
2.局部内部类中,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效的final
匿名内部类:省略类的定义,只使用一次
1.定义格式:
接口名称 对象名=new 接口名称(){
//覆盖重写的所有抽象方法
};
2.匿名内部类,在创建对象的时候,只使用唯一的一次。
3.匿名对象,在调用方法的时候,只能调用唯一的一次。
4.匿名内部类和匿名对象不是一回事。