05天-01-面向对象(概述)
Tip:理解面向对象
l 面向对象时相对面向过程而言。
l 面向对象和面向过程都是一种思想
l 面向过程
强调的是功能行为
l 面向对象
将功能封装进对象,强调了具备功能的对象
l 面向对象是基于面向过程的
05天-03-面向对象(类与对象的关系)
1. 人开门:名词提炼法。
人{
开门(门){
门.开();
}
}
门{
开(){
操作门轴等。
}
}
这个举例也正如张孝祥老师强调的面向对象设计所要把握的一个重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。
现在对人开门的两个类进行分析:
门打开,开的动作有门轴转动等诸多元素,把开门的方法定义在门之中,这样有什么用处呢?再分析人开门,固定的一道门可以被不同年龄的人打开,不同年龄的人由于力量的不同,所打开门的时间也各不相同,门开的动作由门确定下来,要计算开门的时间,那就由人这个类去做,门.开()这个方法就可以在人这个类里多次被共享。写到这里,我觉得张老师的这种经验应该也像毕老师在讲诸如进制转换、排序等方法时,遇到可重复利用的代码块,可以对其进行共性抽取,然后封装成一个共享函数,其他函数可以对其多次调用。这样一来,写出来的代码更简洁、直观、易读,同时也具备可拓展性。
05天-04-面向对象(成员变量和局部变量)
1. 成员变量和和局部变量的变作用范围
成员变量:作用于整个类中
局部变量:作用于函数或语句中。
2. 成员变量和和局部变量在内存中的位置:
成员变量:在对内存中,因为对象的存在,才在内存中存在。
局部变量:存在栈内存中。
05天-05-面向对象(匿名对象的应用)
为了下面阐述方便,先将类写出来:
class Car{
publicvoid run(){
…
}
}
class CarTest{
publicstatic void show(Car c){
…
}
}
class Test{
publicstatic void main(String[] args){
}
}
1. 匿名对象是对象的简化形式。
2. 匿名对象的两种使用情况:
1) 方式一:当对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。
示例:new Car.run();
2) 方式二:可以将匿名对象作为实际参数进行传递。
示例:CarTest.show(new Car);
注意:如果对一个对象进行多次调用,必须给这个对象取名字。
Car q = new Car();
CarTest.show(q);
05天-06-面向对象(封装概述)
Tip:封装(Encapsulation)
l 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
l 好处:
² 将变化隔离。
² 便于使用。
² 提高重用性。
² 提高安全性。
l 封装原则:
² 将不需要对外给提供的内容都封装起来。
² 把属性都隐藏,提供公共方法对其访问。
在进制转换的视频中有详尽的讲解,这里只做简述概要:
class Transform{
publicstatic void toBin(…){
trans(…);
}
public staticvoid toHex(…){
Trans(…);
}
public staticvoid trans(…){
…
}
}
05天-07-面向对象(封装private)
Tip:private(私有)关键字
l private 关键字:
² 是一个权限修饰符。
² 用于修饰成员(成员变量或成员函数)。
² 被私有化的成员只在本类中有效。
l 常用之一:
² 将成员变量私有化,对外提供对应的set,get方法对其访问。提高对数据访问的安全性。
示例:
class Person{
privateint age;
publicvoid set age(int a){
if(a>0 & a<130){
this.age = a;
speak();
}else{
System.out.println(“feifaage”);
}
}
}
05天-08-面向对象(构造函数)
1. 构造函数的特点:
- 函数名与类名相同;
- 不用定义返回值类型;
- 不可以写return语句。
2. 构造函数的作用:给对象进行初始化。
也就是说对象已建立就会调用与之对应的构造函数。
3. 注意:
- 默认构造函数的特点;
- 多个构造函数是以重载的形式存在的。
4. 构造函数的小细节:
当一个类中没有构造函数时,那么系统会默认给类加一个空参数的构造函数;当在类中定义了构造函数后,默认的构造函数就没有了。
5. 构造函数和一般方法在写法上不同:构造函数不带返回值。
示例:
class Person{
public Person(){//构造函数
…
}
public void Person(){//一般方法
…
}
}
6.补充:
构造函数是对象已建立就运行,给对象初始化。
而一般方法是对象调用才执行,是给对象添加具备的功能。
一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用多次。
7.什么时候定义构造函数呢?
当分析事物时,该事物具备一些特性或行为时,那么将这些能容定义在构造函数中。
例如:显示图形化界面,可以将初始化函数定义在构造函数中,对象一建立就能把初始化界面显示出来。
05天-09-面向对象(构造代码块)
1. 构造代码块的作用:给对象进行初始化。(一个类里面可以写多个代码块)
对象已建立就运行,而且优于构造函数执行。
示例:
public Test{
publicTest(){
System.out.println(“Hello Java!”);
}
{
System.out.println(“构造代码块1!”);
}
public staticvoid main(String[] args){
Test test = new Test();
}
{
System.out.println(“构造代码块2!”);
}
}
打印结果:
构造代码块1!
构造代码块2!
Hello Java!
2. 构造代码块和构造函数的区别:
- 构造代码块是给所有对象进行统一初始化。
- 构造函数是给对应的对象初始化。
- 构造代码块中定义的是不同对象共性的初始化内容。
05天-10-面向对象(this关键字)
1.this看上去,适用于区分局部变量个成员变量同名的情况。
示例构造函数:
private String name;
public Person(String name){
this.name =name;
}
3. this为什么可以解决这个问题?this代表的到底是什么呢?
this 就是代表本类的对象,到底代表哪一个呢?
this代表它所在函数所属对象的引用。
简单地说:哪个对象在调用this所在的函数,this就代表哪个对象。
示例:
class Person{
privateString name;
privateint age;
Person(Stringname){
this.name= name;
}
Person(Stringname,int age){
this.name = name;
this.age = age;
}
public voidspeak(){
System.out.println(“name = ”+this.name+”..age”+this.age);
this.show();
}
public voidshow(){
System.out.println(this.name);
}
}
4. this的应用:当定义类中功能时,该函数内部都要调用到调用该函数的对象时,这时用this来表示这个对象。
但凡本类功能内部使用了本类对象,都用this表示。
5. 补充:
this不可以用在静态函数里面
示例:
public Person{
publicvoid speak1(){
System.out.println(“speak1!”);
this.show();//编译通过
}
public staticvoid speak2(){
System.out.println(“speak2!”);
this.show();//编译失败
}
public voidshow(){
System.out.println(this.name);
}
public staticvoid main(String[] args){
Person p = new Person();
this.show();//编译失败
}
}
结论:this不可以用在静态方法中。
05天-12-面向对象(this关键字在构造函数间调用)
l this语句:用于构造函数之间进行相互调用。
l this语句只能定义在构造函数的第一行,因为初始化要先执行。
l 构造函数中的调用只能用this。(当然了还可以用super)
示例:
class Person{
privateString name;
privateint age;
publicPerson(){
//this(name);//注释部分不能同时存在,否则会造成死循环。
}
public Person(){
//this();
this.name = name;
}
publicPerson(String name,int age){
this(name);
this.age = age;
}
}