目录
15.2 重载Overload 与重写Override的区别
8.面向对象
8.1基本概念
面向对象是一种编程思想,通过它可以把生活中复杂的事情变得简单化,从原来的执行者变成了指挥者,面向对象是基于面向过程而言的。我们不需要关注实现的过程,只要关注结果就好了。
这就是我们所说的面向对象的编程实现(OOP,Object Oriented Programming)
8.2面向对象的三大特征
1.封装性,把相关的数据封装成一个“类”组件
2.继承性,是子类自动共享父类属性和方法,这是类之间的一种关系
3.多态,增强软件的灵活性和重用性
9.类和对象
9.1 类
1) Java语言最基本单位就是类,类似于类型。
2) 类是一类事物的抽象。
3) 可以理解为模板或者设计图纸。
9.2 对象
每个对象具有三个特点:对象的状态,对象的行为和对象的标识。
1) 对象的状态用来描述对象的基本特征。
2) 对象的行为用来描述对象的功能。
3) 对象的标识是指对象在内存中都有一个唯一的地址值用来和其他对象区分开来。
4) 类是一类事物的抽象,对象是具体的实现。
9.3 类和对象的关系
1) 计算机语言来怎么描述现实世界中的事物的? 属性 + 行为
2) 那怎么通过java语言来描述呢?通过类来描述一类事物,把事物的属性当做成员变量,把行为当做方法
9.4对象在内存中的存储
java把内存分成5大区域,我们重点关注栈和堆
1.一般来将,局部变量存在栈中,方法执行完毕内存就被释放
2.对象(new出来的东西)存在堆中,对象不再被使用时,内存才被释放
3.每个堆内存的元素都有地址值
4.对象中的属性都是有默认值的
TIPS:栈与队列指的是一种数据的结构
栈:先进后出(FILO--First In Last Out)
队列:先进先出(FIFO--First In First Out)
创建对象时,内存经历的什么?
1.在栈内存中开辟一块空间,存放引用类型变量p,并把p压如栈底
2.在堆内存中开辟一块空间,存放Phone对象
3.完成对象的初始化,并赋予默认值
4.给初始化完毕的对象赋予唯一的地址值
5.把地址值交给引用类型变量p来保存
9.5 创建对象的流程
Person p = new Person();//短短这行代码发生了很多事情
1. 把Person.class文件加载进内存
2. 在栈内存中,开辟空间,存放引用变量p
3. 在堆内存中,开辟空间,存放Person对象
4. 对成员变量进行默认的初始化
5. 对成员变量进行显示初始化
6. 执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)
7. 堆内存完成
8. 把堆内存的地址值赋值给变量p ,p就是一个引用变量,引用了Person对象的地址值
10.封装
10.1 概述
封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法
好处:
1.提高安全性
2.提高重用性
10.2 private关键字
是一个权限修饰符,可以用来修饰成员变量(类里方法外)和成员方法,被私有化的成员只能在本类中访问
TIPS:如何封装?封装后的资源如何访问?
我们可以使用private关键字来封装成员变量与方法
如何访问私有资源?
关于成员变量:
1. setXxx – 对外提供公共的设置值方式
2. getXxx – 对外提供公共的获取值方式
关于成员方法:
把私有方法放在公共方法里供外界调用即可
11.构造方法
11.1 概念
构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
对象创建就是通过构造方法完成的,主要功能是完成对象的创建或者对象的初始化
当类创建对象(实例化)时,会自动调用构造方法
构造方法与普通方法一样可以重载
11.2 形式
与类同名,且没有返回值类型,可以含参也可以不含参
11.3 代码
//1创建无参构造方法
public Person() {
System.out.println("我是Person类的无参构造");
}
//2创建含有1个参数的构造方法
/**快速向下复制:Ctrl+Alt+向下键*/
public Person(String s) {
System.out.println("我是Person类的1个参数的构造方法"+s);
}
//3创建Person类的全参构造
public Person(String n,int a,String addr) {
//6.4给Person类对应的属性赋值
name = n;//等号右边赋值给等号左边,用户传过来的名字给到成员变量name
age = a;//用户调用此构造方法时,传过来的年龄a给到成员变量age
address = addr;//用户调用此构造方法时,传过来的地址addr给到成员变量address
System.out.println("我是Person类的全参构造"+n+a+addr);
}
11.4构造代码块和局部代码块
11.4.1 构造代码块的特点:
a.位置:在类的内部没方法的外部
b.作用:用于抽取构造方法中的共性代码
c.执行时机:每次调用构造方法前都会调用构造代码块
d.注意事项:构造代码块优先于构造方法加载
11.4.2 局部代码块
a.位置:在方法里的代码块
b.作用:通常用于控制变量的作用范围,出络花括号就失效
c.注意事项:变量的作用范围越小越好,成员变量会存在线程安全的问题
11.4.3 代码块加载顺序
1.当创建对象时,程序会自动调动构造方法,但是如果有构造代码块,会先去执行构造代码块,再执行构造方法
2.当通过对象调用方法时,会执行方法中的功能,如果方法中有局部代码块,就会执行局部代码块
3.执行顺序: 构造代码块-->构造方法-->局部代码块[前提:调用方法(如果方法有局部代码块,局部代码块才会执行)]
4.构造代码块的功能: 用于提取构造方法中的共性
5.局部代码块的功能:控制变量的作用范围
12 this
12.1 概念
This代表本类对象的一个引用对象
12.2 形式
this.name = name
12.3 注意
this可以用来进行构造方法之间的调用
但是注意!!!!!调用是单向的,不是双向来回调用,会死循环
13.继承
13.1 概念
继承是面向对象最显著的一个特征
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并扩展新的能力
java继承是会用已存在的类的定义作为基础建立新类的技术
新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类(超类/基类)
这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用
13.2 特点
1.使用extends关键字来表示继承关系
2.相当于子类把父类的功能复制了一份
3.java只支持单继承
4.继承可以传递
5.不能继承父类的私有成员
6.继承多用于功能的修改,子类可以在拥有父类功能的同时,进行功能拓展
7.像是is a 的关系,要求子类必须是父类的一种继承机构,依赖性非常强,强耦合
/**OCP原则:面向功能修改关闭,面向功能拓展开放
* --只允许拓展,不允许修改原来的代码*/
//总结:
//1.子类创建对象时,默认会访问父类的无参构造
//2.在构造方法的第一行,都有一条默认语句super();--代表的是调用父类的无参构造
//3.当父类没有无参构造时,可以通super调用父类的其他构造方法
/**1.构造方法可以被继承吗?--不可以!!!
* 语法要求天然就不符合:构造方法需要与类名同名
* */
14.Super
可以通过这个关键字使用父类的内容,Super代表的是父类的一个引用对象
注意:在构造方法里,出现的调用位置必须是第一行
15.方法重写Override
1.继承以后,子类就拥有了父类的功能
2.在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
3.子类中方法的签名与父类完全一样时,会发生覆盖/复写的现象
4.格式要求:方法的返回值 方法名 参数列表 要完全一致,就方法体是重写的
TIPS: 父类的私有方法不能被重写,子类在重写父类方法时,修饰符
子类重写父类方法时,子类修饰符要大于等于父类修饰符的权限
15.小结:
15.1 this与super的区别
1) This代表本类对象的引用
class Father3{ this.XXX } //this -- Father3 this = new Father3();
2) super代表父类对象的引用
class Father3{ super.XXX } //this -- Father3 super = new Father3();
就相当于创建了一个父类对象
3) this可以在两个变量名相同时,用于区分成员变量和局部变量
4) this 可以在本类的构造方法之间调用,位置必须是第一条语句,注意,不能相互调用,会死循环
5) super是发生了继承关系以后,子类如果想用父类的功能,可以通过super调用
6) 如果发生了重写,还想用父类的功能,需要使用super来调用
7) Super在调用父类构造方法时,必须出现在子类构造方法的第一条语句,而且如果父类中没有提供无参构造,子类可以通过super来调用父类其他的含参构造
15.2 重载Overload 与重写Override的区别
1) 重载: 是指在一个类中的现象,是指一个类中有很多同名的方法,但是方法的参数列表不同
2) 重写: 是指发生了继承关系以后(两个类),子类去修改父类原有的功能,子类中有一个方法签名(返回值类型 方法名(参数列表) )和父类的一模一样
3) 重载的意义: 是为了方便外界对方法进行调用,什么样的参数程序都可以找到对应的方法来执行,体现的是程序的灵活性
4) 重写的意义:是在不修改源码的前提下,进行功能的修改和拓展
(OCP原则:面向修改关闭,面向拓展开放)
5) 重写要求方法的修饰符: 子类权限 >= 父类的权限