Java面向对象
一、面向对象的概念
Java语言是纯粹的面向对象的程序设计语言,这主要表现为Java完全支持面向对象的三种基本特征:继承、封装和多态。
Java语言完全以对象为中心,Java程序的最小程序单位是类,整个Java程序由一个一个的类组成。
Java完全支持使用对象、类、继承、封装、消息等基本概念来进行程序设计,允许从现实世界中客观存在的事物
(即对象)出发来构造软件系统,在系统构造中尽可能运用人类的自然思维方式。实际上,
这些优势是所有面向对象编程语言的共同特征。而面向对象的方式实际上由OOA(面向对象分析)、OOD(面向对象设计)和OOP
(面向对象编程)三个部分有机组成,其中,OOA和OOD的结构需要使用一种方式来描述并记录,
目前业界统一采用UML(统一建模语言)来描述并记录OOA和OOD的结果。目前UML的最新版是2.0它一共包括13种类型的图形,
使用这13种图形中的某些就可以很好地描述并记录软件分析、设计的结果。
二,面向对象和面向过程的一些区别
面向对象:概念
面向对象是基于面向过程的。
面向过程:面向过程是以函数为基础,完成各种操作。强调的是过程。
面向对象:面向对象是以对象为基础,完成各种操作。强调的是对象,结果。
举例:
孙悟空三打白骨精。
面向过程:
打():
孙悟空,白骨精
面向对象:
孙悟空.打(白骨精)
面向对象的思想特点:
A:是一种更符合人们思考习惯的思想
B:可以将复杂的事情简单化
C:将程序员从执行者转换成了指挥者
举例:
买电脑。
面向过程:自己做了所有的事情。
面向对象:田野(中关村卖电脑)
吃饭。洗衣服。
面向过程:买菜,洗菜,切菜,做菜,吃菜,洗盘子...
面向对象:找个对象 -- 让她做了。
问题:8000, 2000
旅游:
面向过程:自己查路线,定票,查宾馆,去火车站... 旅游...
面向对象:找个旅行社。...
找工作的例子:
招人示例:
面向过程:
面向对象:
以后做任何事情:
找对象。让这个对象做事情。
自己造对象,然后用。还可以给别人用。
三、面向对象的设计简介
面向对象的基本思想是使用类、对象、继承、封装、消息等基本概念来进行程序设计。
采用面向对象方式开发的软件系统,其最小的程序单元是类,这些类可以生成系统中的多个对象,而这些对象则直接映像成客观世界的各种事物。采用面向对象方式开发的软件系统逻辑上的组成结构。如图所示:
从图上可以看出,面向对象的软件系统由多个类组成,类代表了客观世界上具有某种特征的一类事物往往有一些内部的状态数据,比如人有身高、体重、年龄、爱好等各种状态数据--当然程序没有必要记录该事物所有的状态数据,程序只要记录业务关心的状态数据即可。
面向对象的语言不仅使用类来封装一类事物的内部状态数据,这种状态数据就对应于图中的Field;而且类会提供操作这些状态数据的方法,还会为这类事物的行为特征提供相应的实现,这种实现也是方法。因此:可以得到如下基本等式:
Field(状态数据)+方法(行为)=类定义
从这个等式来看,面向对象比面向过程的编程粒度要大;面向对象的程序单位是类;而面向过程的程序单位是函数(相当于方法)因此面向对象比面向过程更简单、易用。我们举个例子来说,希望完成“猪八戒吃西瓜”这样一件事情。
面向过程的思维:吃(猪八戒,西瓜); 面向对象的思维:猪八戒.吃(西瓜);
下面用一个例子来说明什么是面向对象:
/**面向过程:
A:去专卖店
B:买手机
C:离开专卖店
代码体现:
*/
class 测试类
{
public static void main(String[] args)
{
go();
buy();//关注类内函数的调用
leave();
}
public static void go()
{
System.out.println("去专卖店");
}
public static void buy()
{
System.out.println("买你要的手机");
}
public static void leave()
{
System.out.println("高兴的离开专卖店");
}
/**
对比对象函数的调用。
C:测试
测试中调用买和移动的功能。
代码体现:
*/
class 买
{
public void buy()
{
System.out.println("买手机");
}
}
class 移动
{
public void go()
{
System.out.println("去专卖店");
}
public void leave()
{
System.out.println("离开专卖店");
}
}
class 测试类
{
public static void main(String[] args)
{
移动.go();
买.buy();
移动.leave();
}
}
下面是一个以汽车为对象的面向对象过程
/*
汽车:
成员变量:品牌,价格,颜色
成员方法:跑,停,
*/
class Car
{
//品牌
String brand = "路虎";
//价格
int price;
//颜色
String color;
//跑的功能
public void run()
{
System.out.println("牌子为:"+brand+"颜色为:"+color+"的汽车启动了");
}
//停的功能
public void stop()
{
System.out.println("牌子为:"+brand+"颜色为:"+color+"的汽车停止了");
}
}
//测试类
class CarTest
{
public static void main(String[] args)
{
//创建车
Car c = new Car();
//使用成员变量
System.out.println(c.brand+"---"+c.price+"---"+c.color);
//给成员变量赋值
c.brand = "奥拓";
c.price = 20000;
c.color = "蓝色";
System.out.println(c.brand+"---"+c.price+"---"+c.color);
c.run();
c.stop();
//手动让对象变为垃圾
c = null;
c.run();
c.stop();
}
}
四、成员变量和局部变量
成员变量和局部变量的区别?
A:定义位置区别
成员变量 在类中,方法外
局部变量 在方法中,或者方法的形式参数
B:初始化值的区别
成员变量 有默认初始化值
局部变量 没有默认初始化值,想先定义,赋值,才能使用
C:存储位置区别
成员变量 存储在堆中,随着对象的存在而存在,随着对象的消失而消失。
局部变量 存储在栈中,随着方法的调用而存在,随着方法调用完毕而消失。
在使用变量的时候:
首先在局部范围找,有就使用。
接着在成员方法找,有就使用。
如果在成员位置没有,就报错。
使用过程中,遵循一个原则:就近原则。
class Student
{
int age;
public void show()
{
//int age;
System.out.println(age);
}
}
class StudentTest
{
public static void main(String[] args)
{
//创建对象
Student s = new Student();
s.show();
}
}
五、封装
(1)隐藏实现的细节,提供公共的访问方式。
类,方法等其实都是封装的具体体现。
(2)private关键字
A:用于修饰成员变量和成员方法。
B:被修饰的内容在其他类中是不可以被访问的。
(3)常见的应用:(掌握)
类中的所有成员变量私有,给出对应的get/set方法。
代码体现:
class Student
{
private String name;
private int age;
public Student(){}
public Student(String name,int age)
{
this.name = name;
this.age = age;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
六、构造方法
(1)格式及特点
格式:
访问权限修饰符 类名(参数...){}
访问权限修饰符:
public,private
特点:
A:方法名和类名相同
B:没有返回值类型
C:没有具体的返回值
(2)注意事项:
A:如果你不给构造方法,jvm会自动给你一个无参构造方法。
B:如果你给出了构造方法,那么,jvm将不再提供无参构造方法。
这个时候,你如果要使用无参构造方法:只能自己提供
推荐:永远手动给出无参构造方法。
七、this 关键词
this关键字(掌握)
(1)是一个关键字。代表当前类的引用。
简单记:在方法中,哪个对象调用方法,this就代表谁。
(2)应用场景:
解决局部变量隐藏成员变量问题。
class Worker
{
//姓名
private String name;
//年龄
private int age;
//无参构造方法
public Worker(){}
public Worker(String name,int age)
{
this.name = name;
this.age = age;
}
public void setName(String name) //name="林青霞";
{
//name = name;
//假如我能够限定第一个name是成员变量的name
//我就能够把值赋值给成员变量的name
this.name = name;
//w.name = name;
}
public String getName()
{
如果局部范围内没有name,那么就不需要加this。
如果局部范围有name,就要加this。
return this.name;
return name; //而是省略this
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
class WorkerTest
{
public static void main(String[] args)
{
//创建对象
Worker w = new Worker();
//输出成员变量的值
System.out.println(w.getName()+"---"+w.getAge());
//给成员变量赋值
w.setName("黄飞鸿");
w.setAge(26);
System.out.println(w.getName()+"---"+w.getAge());
}
}