Java面向对象
1 什么是面向对象
面向过程:考虑问题从步骤考虑,第一步做什么,第二步做什么
面向对象:(OOP,Oriented-Object-Programming)先考虑解决问题需要哪些分类,在每个分类下再考虑面向过程。以类的方式组织代码;以对象的形式封装数据
从认识论的角度,先有对象后有类。对象是具体的事物,类是对对象的抽象;
从代码运行角度,先有类后有对象。类是对象的模板。
2 方法回顾
方法定义
修饰符+返回值类型+方法名(…){
//方法体
return 返回值
}
方法调用
静态方法:加static修饰,和类一起加载
非静态方法:类实例化之后才存在 new 类.非静态方法
3 类与对象的创建
一个项目应该只存在一个main方法
创建类相当于创建了一堆对象的模型,类里面包括属性和方法
用new关键字创建对象是将类进行了实例化,相当于创造了具体的个体,创建时会为对象分配内存空间并且进行默认的初始化以及对类中构造器的调用。
4 构造器详解
一个类即使什么都不写,也会存在一个方法
显示定义构造器(没有返回值的方法):public 类名(){
}
作用:初始化值
注意:使用new关键字(本质是在调用构造器),必须要有构造器;
一旦定义了有参构造,无参构造就必须显式定义;
Alt+insert快捷键生成构造器
5 封装
程序设计追求“高内聚,低耦合”
属性私有 修饰词private , 通过public的get/set方法获取数据和设置数据
alt+insert 自动生成get/set方法
封装的意义:提高程序安全性,保护数据
隐藏代码的实现细节
统一接口
增加系统可维护性
6 继承
定义继承 修饰词+class+类名+extends+父类名
子类继承父类,就会拥有父类的全部方法(私有的无法被继承)
一个子类只能有一个父类
Java中,所有类都默认直接或间接继承 Object类
注意点:
super调用父类的构造方法吗,必须在构造方法的第一个
super必须只能出现在子类的方法或者构造方法中
super和this不能同时调用构造方法
new对象时,父类的引用可以指向子类
重写:需要有继承关系,子类重写父类的方法
方法名必须相同;参数列表必须相同;父类修饰符必须比子类修 饰符更严格,public>protected>default>private ; 抛出的异 常:范围可以被缩小,但不能被扩大
重写后的方法体不同
为什么要重写:
父类的功能,子类不一定需要或者不一定满足
7 多态
同一个方法可以根据发送对象的不同而采用多种不同的行为方式。
一个对象的实际类型是确定的:
new Student() new Person
但他可以指向的引用类型是不确定的:
Student s1=new Student()
Person s2=new Student() 父类的引用指向子类
Object s3=new Student()
对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
子类可以用父类的方法,父类用子类的方法需要强制转换成子类
注意点:
- 多态是方法的多态
- 父类和子类有联系,类型转换异常ClassCastException
- 存在条件:必须存在继承关系,方法被重写;父类的引用指向子类对象 Father f1=new Son();
- Static方法属于类,不属于实例,不能被重写
- final 常量,不能重写
- private方法 ,私有,不能重写
8 instanceof和类型转换
X instanceof Y 测试X是否是Y的类的实例
对象类型的转化:父类要用子类独有的方法,必须先强制转换为子类
子类转换成父类可能会丢失自己的方法
9 static关键词
作用:在没有创建对象的时候调用方法或者变量,和类一起被加载
- static方法:不依赖于任何对象,没有this;非静态方法可以调用静态方法/变量
- static变量:静态变量被所有对象共享,内存里只有一个副本,在类初次加载的时候就被初始化;非静态变量是对象拥有的,在创建对象的时候初始化,可存在多个副本,各对象拥有的副本互不影响。
- static代码块:
10 抽象类
抽象类、抽象方法,用abstract修饰,
不能new抽象类,只能靠子类实现;抽象类中可以有普通方法;抽象方法必须写在抽象类中;
11 接口
声明接口的关键词 interface
类通过implements实现接口,必须重写接口中的方法
一个类可以实现多个接口
接口的作用:约束;定义一些方法,让不同的人实现;方法都是public abstract;常量public static final;接口不能被实例化,接口中没有构造方法;
12 内部类
在一个类的内部再定义一个类
一个java类中可以有多个class类,但只能有一个public class