---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、理解面向对象思想
- 面相对象是相对面向过程而言的
- 面向对象和面向过程都是一种思想
- 面向对象强调的是功能行为
- 面向对象将功能封装进对象,强调具备功能的对象
- 面向对象是基于面向过程的
下面来举例说明面向对象的思想:
1、把大象装进冰箱
我们都知道赵本山的笑话,把大象装进冰箱分三步:第一,打开冰箱盖;第二,把大象装进冰箱;第三,关闭冰箱盖;
在这个过程我们强调的是功能行为,是我们的动作,打开,存储,关闭都是我们人的动作,但是什么是面向对象呢?如果我们转换一下思想,现在打开,存储,关闭都是冰箱的属性,都是冰箱应该具有的功能,所以当我们要把大象装进冰箱时,我们只需要调用冰箱就行了,而不需在关心是怎样打开,怎样存储,怎盐关闭的了,现在 冰箱是对象,是我们要调用的对象,这就是面向对象思想。如下图:
2、餐厅就餐
我们到餐厅就餐就是一个面向对象的实例,首先,我们到餐厅后会叫服务员,这时服务员就是个对象,他有点菜的功能,我们只需要告诉服务员我们需要吃什么便行了,而不需要担心饭是怎么做的,这也是面向对象的实例。
在Java中有这么一句经典的话:万物皆对象。
二、面对对象编程
面对对象的编程更符合人们的思维方式,编写的程序更加健壮和强大,更重要的是,面对对象编程鼓励创造性的程序设计。面对对象是一种先进的编程思想,更加容易解决复杂的问题,面对对象编程主要体现下列3个特性。
1、封装性
面向对象编程核心思想之一就是将数据和对数据的操作封装在一起。通过抽象,即从具体的实例中抽取共同的性质形成一般的概念,比如类的概念。在实际生活中,我们每时每刻都与“对象”在打交道,如日常用的钢笔、骑的自行车、乘的公共汽车等。而经常见到的卡车、公共汽车、轿车等都会涉及以下几个重要的物理量:可乘载 的人数、运行速度、发动机的功率 、耗油量、自重、轮子数目等。另外,还有几个重要的功能:加速、减速、制动、转弯等。也可以把这些功能称为它们具有的方法,而物理量是它们的状态描述,仅仅用物理量或功能不能很好地描述它们。在现实生活中,用这些共有的属性和功能给出一个概念:机动车类。也就是说,人们经常谈到的机动车类就是从具体的实例中抽取共同的属性和功能形成的一个概念,那么一个具体的轿车就是机动车类的一个实例,即对象。一个对象将自己的数据和对这些数据的操作合理有效地封装在一起,例如,每辆轿车调用”加速功能“改变的都是自己的运行速度。
2、继承
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义 的内容作为自己的内容,并加入若干新的内容。继承体现了一种先进的编程模式,子类可以继承父类的属性和功能,即子类继承了父类所具有的数据和数据上的操作,同时又可以增添子 类独有的数据和数据上的操作。比如,“人类”自然继承了“哺乳类”的属性和功能,同时又增添了人类独有的属性和功能采用继承性,提供了类的规范的等级结构。通过类的继承关系, 使公共的特性能够共享,提高了软件的重用性。3、多态
多态是面向对象编程的又一重要特征。有两种意义的多态,一种是操作名称的多态,即有多个操作具有相同的名字,但这 些操作所接收的消息类型必须不同。例如,让一个人执行“ 求面积”操作时,他可能会问你求什么面积?所谓操作名称的多态是指 可以向操作传递不同消息,以便让对象根据相应的消息来产生~定的行为。另一种多态是和继承有关的多态,是 指同一个操作被不同类型对象调用时可能产生不同的行为。例如,狗和猫都具有哺乳类的功能:“喊叫”。当狗操作“喊叫”时产生的声音是“汪汪 ……,,,而当猫操作“喊叫”时产生的声音 是“喵喵……”。
多态性允许每个对象以适合自身的方式去响应共同的消息。
三、类
类是组成Java程序的基本要素。封装了一类对象的状态和方法。类是用来定义对象的模板。
类的实现包括两部分:;类的声明和类体。基本格式为:
class 类名
{ 类体的内容
}
class 是关键字,用来定义类。“class 类名”是类的声明部分,类名必须是合法的Java标识符。两个大括号以及之间的内容是类体。
1、类声明
一下是两个类声明的例子
class People
{ ....
}
class Pig
{ ...
}
给类命名时须遵守下列习惯:
(1)如果类名使用拉丁字母,那么名字首字母必须大写,如Hello,Time,Test,Demo等。
(2)类名最好容易识别,当类名由几个“单词”复合而成时,每个单词的首字母使用大写,如BeijingTime、HelloWorld等。
2、类体
类声明之后的一对大括号以及他们之间的内容称为类体,大括号之间的内容称为类体的内容。
类体的内容由两部分构成:一部分是变量的定义,用来刻画属性;另一部分是方法的定义,用来刻画功能。
例:
/**
这定义的是一个有关人的行为的类
@author 张三
@version 1.1
*/
public class PersonDemo2
{
public static void main(String[] args)
{
Person p1=new Person();
Person p2=new Person("wangming");
p2.setName("LiMing");
System.out.println(p2.getName());
Person p3=new Person("lishi",30);
}
}
class Person
{
private String name;
private int age;
/*
构造代码块。
作用:给对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。
和构造函数的区别是:
构造函数是给说有的对象进行统一的初始化。
而构造函数是给对应的对象初始化。
构造代码块中定义的是不同对象共性的初始化内容。
*/
{
System.out.println("Person code run");
cry();
}
Person()
{
System.out.println("A:name="+name+" age="+age);
//cry();
}
Person(String name)
{
this.name=name;
System.out.println("B:name="+name+" age="+age);
//cry();
}
Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println("C:name="+name+" age="+age);
//cry();
}
public void cry()
{
System.out.println("cry.....");
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
}
</pre></p><p></p><p></p><p><span style="font-size:14px;">3、成员变量和局部变量</span></p><p><span style="font-size:14px;"> 类体分为两部分。变量的定义部分所定义的变量被称为类的成员变量,在方法中定义的变量和方法的参数被称为局部变量。</span></p><p><span style="font-size:14px;">在方法中定义的变量和方法的参数称为局部变量。</span></p><p><span style="font-size:14px;"> (1)成员变量和局部变量的类型可以是Java中的任何一种数据类型。成员变量和局部变量的名字必须符合标识符的规定。</span></p><p><span style="font-size:14px;">例:</span></p><p><pre class="java" name="code">class People {
int boy;
float a[];
void f(){
boolean cool;
Workman zhangboy;
}
}
class Workman {
double x;
}
People类的成员变量a是浮点型数组变量,方法f中的cool和zhangboy是局部变量,其中cool是boolean型变量,zhangboy是Workman类型的变量,即对象。
(2)成员变量在整个类内都有效,局部变量只在它的定义方法内有效。成员变量与它在类体中书写的先后位置无关,但不提倡把成员变量的定义分散地写在方法之间或类体的最后,人们习惯先介绍属性再介绍功能。
class Sun {
int distance;
int find(){
int a = 12;
distance=a; //合法,distance在整个类内有效
return distance;
}
void g(){
int y;
y=a; //非法,因为a已经失效,而方法g内有没有定义变量a
}
}
(3)成员变量又分为实例成员变量(简称实例变量)和类变量(也称静态变量),
class Dog {
float x;//实例变量
static int y;//类变量
}
如果成员变量的前面加上关键字static修饰,这样的成员变量称为类变量或静态变量,实例变量和成员变量区别是当对.java文档进行编译时就为实例变量分配了内存空间,而成员变量在赋值时才分配 内存空间。
(4)如果局部变量变量的名字相同则成员变量被隐藏。即这个成员变量在这个方法内暂时失效。
<span style="font-size:14px;">class Tom {
int x=98,y;
void f(){
int x=1;
y=x;//y得到的是1.不是98,如果方法f中没有“int x=1;”语句,y的值将是98
}
}</span>
(5)如果局部变量的名字与成员变量的名字相同,则成员变量被隐蔽。这时如果想在该方法内使用成员变量,必须使用关键字this
class Demo {
int a,b,c;
void f(int a,b,c){
this.a=a;
this.b=b;
this.c=c;
}
}//this.a、this.b、this.c分别代表成员变量a,b,c
4、方法
一个类的类体由两部分组成:变量的定义和方法的定义。方法的定义包括两部分:方法声明和方法体。一般格式为:
方法声明部分
{
方法体的内容
}
(1)方法声明
最基本的方法声明包括方法名和方法的类型,如:
float area()
{ .....
}
方法的类型可以是任意的Java数据类型,当一个方法不需要返回数据时,方法的类型必须是void。
方法的名字必须符合标识符的规定,如果使用拉丁字母,首字母必须小写。如果由多个单词组成,从第2个单词开始的其他单词的首字母使用大写。例如:
float getTrangleArea()
void setArray(int[] arr)等
(2)方法体
方法声明之后的一对大括号“{“、”}“以及之间的内容为方法的方法体。方法体的内容包括局部变量的定义和合法的Java语句,如:
int getPrimNumberSum(int n){
int sum = 0;
for(itn i=1;i<=n;i++){
int j;
for (j=2;j<i ;j++ ) {
if (i%j==0) {
break;
}
if (j>=i) {
sum=sum+i;
}
}
}
return sum;
}
方法的参数在整个方法内有效,方法内定义的局部变量从它定义的位置之后开始有效。如果局部变量的定义是在一个复合语句中,那么该局部变量的有效范围是该复合语句,即仅在该符合语句中有效,如果局部变量的定义是在一个循环语句中,那么该局部变量的有效范围是该循环语句,即仅在该循环语句中有效。例如:
class A {
void f(){
int m=10,sum=0;
if(m>9){
int z=10; //z仅仅在该复合语句中有效
z=2*m+z;
}
for (int i=0;i<m ;i++ ) {
sum=sum+i;//i仅仅在该循环语句中有效
}
m=sum; //合法,因为m和sum有效
z=i+sum;//非法,因为i和z已无效
}
}
5、方法重载
方法重载是多态性的一种,例如,让一个人执行“求面积”操作时,他pJ能会问你求什么面积?所谓功能多态性是指可以向功能传递不同的消息,以便让对象根据相应的消息来产生相应的行为。对象的功能通过类中的方法来体现,那么功能的多态性就是方法的重载。方法重载的意思是:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。
class AreaDemo {
float getArea(float r){
return 3.14*r*r;
}
double getArea(float x,int y){
return x*y;
}
float getArea(int x,float y){
return x*y;
}
double getArea(float x,float y,float z){
return (x*x+y*y+z*z)*2.0;
}
}
注:方法的返回类型和参数的名字不参与比较,也就是说如果两个方法的名字相同,即使类型不同,也必须保证参数不同。
6、构造方法
构造方法是一种特殊方法,用于对类的成员变量进行初始化。它有以下几个特点:
(1)构造方法名与类名相同.
(2)构造方法不返回任何值,也没有返回类型.
(3)每个类可以有零个或多个构造方法.
(4)构造方法在创建对象时自动执行,一般不能显式地直接调用.
(5)构造方法可以重载。
class StaticCode
{
StaticCode()//构造函数
{
System.out.println("b");
}
StaticCode(int x)//构造函数重载
{
System.out.println("d");
}
}
7、类方法和实例方法
成员变量可分为实例变量和类变量。同样,类中的方法也可以分为实例方法和类方法。
class A {
int a;
float max(float x,float y){
....
}
static float jerry() {
....
}
}
A类中的方法jerry是类方法,max是实例方法。方法声明时,方法类型前面不加关键字static的是实例方法,加关键字static的类方法。
注:构造方法是特殊的方法,不能用static修饰构造方法。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------