一、 面向对象概念
1.1 理解面向对象
面向对象是相对面向过程而言,面向对象和面向过程都是一种思想。
区别在于:面向过程强调的是功能行为;面向对象将功能封装进对象,强调具备了功能的对象。
面向对象是基于面向过程的。
1.2 面向对象的特点
1、是一种符合人们思考习惯的思想
2、可以将复杂的事情简单化
3、将程序员从执行者转换成了指挥者
如何实现需求: 如果有具备所需功能的对象,就调用这个对象;如果没有就创建一个具备所需功能的对
象并调用这个对象来完成需求先要去找具有所需的功能的对象来用。这样可以提高程序复用性并简化开发。
简言之:Java中实现需求就是找对象,建立对象,使用对象,维护对象的关系
1.3 面向对象开发过程、设计过程、特征
1、开发的过程:其实就是不断的创建对象,使用对象, 指挥对象做事情
2、设计的过程:其实就是在管理和维护对象之间的关 系。
3、面向对象的特征:封装(encapsulation)、继承(inheritance)、多态(polymorphism)
现实中对象无处不在:
空调:我们只需要操作遥控上的加热、制冷按钮,空调就能实现相应功能,而不需要我们去关心
其内部是如何运作。
灯:只需要打开开关,灯就会亮,而不用去了解灯内部具体的构造和实现原理。
二、类与对象的关系
类是对拥有相同行为特征对象的一个抽象描述,而对象是类这个抽象概念中事实存在的个体。
如:人类是对所有人的描述,张三就是这个类中的具体对象。
映射到Java中:描述就是被class定义的类(如 class Person)。具体对象就是Java在堆内存中
用new建立的实体(如 Person ZhanSan=new Person())
2.1 类与对象(图例)
类与对象的关系如图
可以理解为:
类就是图纸:图纸是用来描述汽车的属性。
汽车就是堆内存中的对象:汽车是具备图纸所描述属性的具体实体。
2.2 类的定义
生活中描述事物无非就是描述事物的属性和行为。
如:人有身高,体重等属性,有说话,打球等行为。
Java中用类class来描述事物也是如此:
属性:对应类中的成员变量。
行为:对应类中的成员函数。
定义类其实就是在定义类中的成员(成员变量和成员函数)。
2.3 成员变量和局部变量的区别
成员变量:成员变量定义在类中,在整个类中都可以被访问;成员变量存在于堆内,随着对
象的建立而建立,如果不再使用,JVM会应用垃圾回收机制进行回收;成员变量有默认初始化值。
局部变量:局部变量只定义在局部范围内,如函数内、语句内等;局部变量存在于栈内存中。
当作用的范围结束,变量空间会自动释放;局部变量没有默认初始化值。
2.4 创建对象,使用对象(以车为例)
class Car//对Car这类事物进行描述
{
String color = "red";
int num = 4;
public static void show()
{
System.out.println("color="+color+"..num="+num);
}
}
class CarDemo
{
public static void main(String[] args)
{
Car c1 = new Car();//建立对象
Car c2 = new Car();
c2.color = "black";//对对象的属性进行修改
c2.show();//使用对象的功能。
}
}
对上例代码中对象在内存中结构的描述:
2.5 匿名对象
匿名对象是对象的简化形式
匿名对象两种使用情况:
1、当对对象方法仅进行一次调用时,用匿名对象来实现比较简化;如果对一个对
象进行多个成员调用,必须给这个对象起名字
2、匿名对象可以作为实际参数进行传递。
代码实例:
class Car
{
String color="red";
int num=4;
void run()
{
System.out.println(color+","+num);
}
}
class NiMingObject
{
public static void main(String[] args)
{
new Car().num=5; //在堆内新开辟Car类型的实例1,并将num改为5
new Car().color="blue";//在堆内新开辟Car类型的实例2,并将color改为blue
new Car().run();//在堆内新开辟Car类型的实例3,调用其run()方法
Car c=new Car();
c.num=6;
c.run(); //实例c可以通过c.对象成员 对属性进行修改及方法调用
new Car().num=6;//匿名对象只能修改一个属性
new Car().run();//匿名对象只能调用一个方法
Car q=new Car();
q.run();
}
}
三、 封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
封装的好处:1.将变化隔离 2.便于使用 3.提高重用性 4.提高安全性
封装原则:将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问。
private关键字:是一个权限修饰符,用于修饰成员(成员变量和成员函数),被私有化的成
员只在本类中有效(既被私有修饰的成员只能被本类调用)。
Private关键字常用到的一个示例:将成员变量私有化,对外提供对应的set 、get 方法对
其进行访问。提高对数据访问的安全性。
class Person
{
//将age私有化之后,类以外即使建立了对象也不能直接访问,但人有年龄
//,就需要在Person类中提供对应访问age的方式
private int age;
public void setAge(int a)
{
if (a>0&&a<130)
{
age=a;
}
else
System.out.println("年龄错误");
}
public int getAge()
{
return age;
}
void talk()
{
System.out.println("age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p=new Person();
//a.age=-23; //:30: 错误: age可以在Person中访问private
p.setAge(-32);
p.talk(); //输出结果”年龄错误 age=0“ //成员变量有默认值 局部变量不初始化不能参与运算
}
}
四、 构造函数
构造函数特点:
1.函数名与类名相
2.不用定义返回值类
3.不可以写return语句作用: 给对象进行初始化。
注意:
1.默认构造函数的特点。
2.多个构造函数是以重载的形式存在的。
3.构造函数对象一建立就会调用与之对应的构造函数
构造函数的小细节:
1.当一个类中没有定义构造函数时,那么系统会默认给该类加入一个
空参数的构造函数
2.当在类中自定义了构造函数后,系统默认构造函数就消失
构造函数和一般函数区别:
1.写法上不同。
2.在运行上也有不同;构造函数是在对象一建立就运行,给对象初始化。
而一般方法是对象调用才执行,是给对象添加对象具备的功能
什么时候定义构造函数:3.一个对象建立,构造函数只运行一次。而一般方法可以被该对象调用多次
当分析事物时,该事物存在具备一些特性或者行为, 那么将这些内容定义在构造函数中
构造代码块:
构造代码块(定义不同对象共性的初始化内容)
作用:给对象进行初始化
运行:对象一建立就运行,而且优先于构造函数执行
与构造函数区别:
1.构造代码块是给所有对象进行统一初始化
2.而构造函数是给对应的对象初始化
代码示例:
class Person
{
private String name;//构造代码块
private int age;//构造代码块
Person()
{
System.out.println("A:name="+name+",,age"+age);
}
Person(String n)
{
name=n;
System.out.println("B:name="+name+",,age"+age);
}
Person(String n,int a)
{
name=n;
age=a;
System.out.println("B:name="+name+",,age"+age);
}
}
class PersonDemo2
{
public static void main(String[] args)
{
Person p2=new Person();
Person p1=new Person("zhang");
Person p3=new Person("zhang",6);
}
}
五、this关键字
特点:this代表其所在函数所属对象的引用。 换言之:this代本类对象的引用。
换言之:哪个对象在调用this所在的函数,this就代表哪个对象。
什么时候使用this关键字:当在函数内需要用到调用该函数的对象时,就用this。
六、static关键字
static关键字用于修饰成员(成员变量和成员函数)
被修饰后的成员具备以下特点:
1.随着类的加载而加载
2.优先于对象存在
3.被所有对象所共享
4.可以直接被类名调用
使用注意:
1.静态方法只能访问静态成员
2.静态方法中不可以写this,super关键字
3.主函数(main)是静态的