目录
1. 初始面向对象
2. 方法回顾与加深
3. 对象的创建与分析
4. 面向对象的三大特征(封装,继承,多态)
5. 抽象类和接口
6. 内部类及OOP实践
1. 初始面向对象
###面向对象&面向过程
- 面向过程思想(线性思维)
步骤清晰简单,第一步,第二步。。。
适合处理一些较为简单的问题 - 面向对象思想
物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独的思考。最后才对某个分类下的细节进行面向过程的思索。
面向对象适合处理复杂的问题,适合处理需要多人协作的问题
###什么是面向对象
面向对象编程(objec-oriented Programming,OOP)的本质是:以类的方式组织代码,以对象的组织(封装)数据。
三大特性:
- 封装
- 继承
- 多态
2. 方法回顾与加深
- 方法的定义
- 修饰符
- 返回类型
- break和return的区别
- 方法名
- 参数列表
- 异常抛出
package oop;
public class Demo01 {
//main方法
public static void main(String[] args) {
}
/*
修饰符 返回值类型 方法名(...){
//方法体
return 返回值;
}
*/
public String sayHello(){
return "hello world";
}
public void hello(){
return;
}
public int max(int a ,int b){
return a>b?a:b;//三元运算符
}
}
- 方法的调用
- 静态方法 static 可以直接调用类.方法 和类一起加载的,存在时间很早
- 动态方法 需要实例化类,才能调用 对象创建(实例化)之后才存在
- 形参和实参
- 值传递和引用传递
package oop;
/*
需求:比较值传递和引用传递之值传递
*/
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);//1
Demo04.change(a);
System.out.println(a);//1
}
public static void change(int a){
//int 不是对象
a=10;
}
}
package oop;
/*
需求:比较值传递和引用传递之引用传递;
传递对象,本质还是值传递
*/
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
Demo05.change(person);
System.out.println(person.name);
}
public static void change(Person person){
//person是一个对象,具体的人,可以改变属性,指向的是Person类
person.name="yiangui";
}
}
//定义了Person类,有一个属性:name
class Person{
String name;
}
- this关键字
3. 对象的创建与分析
alt + inset 可以快速创建无参有参构造器,getter和setter,this关键字
内存分析图:
4. 面向对象的三大特征(封装,继承,多态)
(1).封装
“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是指仅暴露少量的方法给外部使用。
属性私有,get/set
封装的作用:
1. 提高程序的安全性,保护数据;
2. 隐藏代码的实现细节;
3. 统一接口;
4. 系统可维护增加了。
(2).继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
extends的意思是“扩展”。子类是父类的扩展 public class Teacher extends Person { }
Java中只有单继承,没有多继承。
继承是类和类之间的关系。除此之外,类和类之间的关系还有依赖,组合,聚合等。
object类
super代表父的(对比this,代表当前的) 私有的方法函数无法被继承
方法重写:需要有继承关系,子类重写父类的方法
1. 方法名必须相同
2. 参数列表必须相同
3. 修饰符:范围可以扩大,不可缩小 public>protected>default
4. 抛出的异常范围可以被缩小,不可以被扩大。
5.子类父类方向名相同,方法体不同。
为什么要重写:父类的功能不满足子类但是有关。
alt+override
(3).多态
动态编译:类型 可扩展性
同一方法可以根据发送对象的不同而采用多种不同的行为方式。
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
多态是方法的多态,跟属性无关。
package oop.Demo05;
/*
父类Person
成员变量(属性)为name=Person
成员方法(函数)为print函数
*/
public class Person {
String name = "Person";
public void print(){
System.out.println("PersonPrint");
}
}
package oop.Demo05;
/*子类Student
成员变量(属性)是name=Student
成员方法(函数)是重写了父类print方法
*/
public class Student extends Person {
String name = "Student";
@Override
public void print() {
System.out.println("StudentPrint");
}
public void eat(){
System.out.println("eat");
}
}
package oop.Demo05;
/*测试类测试多态
*/
public class Application {
public static void main(String[] args) {
Student s1 = new Student();//子类引用子类对象
Person s2 = new Student();//父类引用指向子类对象
s1.print();//StudentPrint
s2.print();//StudentPrint,两个方法都有时,执行子类的重写方法
System.out.println(s1.name);//Student
System.out.println(s2.name);//Person
s1.eat();//eat
s2.eat();//报错,父类Person可以指向子类对象,但不可以调用子类私有的eat方法.
((Student)s2).eat();//把Person类型强制转换为Student类型,就可以调用子类Student的方法了。
}
}
关键字instanceof用于判断是否有父子关系
package oop.Demo05;
/*
* instance of表示父子关系,理清楚线路,就能搞清楚
* Object > String
* Object > Person > Student
* Object > person > Teacher
* 注意:System.out.println(person instanceof Teacher);//**false** 指向的子类对象Student和Teacher没有父子关系
* */
public class Application {
public static void main(String[] args) {
Object obj = new Student();
System.out.println(obj instanceof Student);//ture
System.out.println(obj instanceof Person);//ture
System.out.println(obj instanceof Object);//ture
System.out.println(obj instanceof Teacher);//false
System.out.println(obj instanceof String);//false
System.out.println("================================");
Person person = new Student();
System.out.println(person instanceof Student);//ture
System.out.println(person instanceof Person);//ture
System.out.println(person instanceof Object);//ture
System.out.println(person instanceof Teacher);//**false** 父类引用指向子类对象Student。Student与Teacher无父子关系
//System.out.println(person instanceof String);//false无法编译
System.out.println("================================");
Student student = new Student();
System.out.println(student instanceof Student);//ture
System.out.println(student instanceof Person);//ture
System.out.println(student instanceof Object);//ture
//System.out.println(student instanceof Teacher);//false无法编译
//System.out.println(student instanceof String);//false无法编译
}
}
5. 抽象类和接口
在这里插入代码片