黑马程序员_java面向对象
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、面向对象
相对于面向过程来说,java是面向对象的。面向过程,是强调的功能行为;面向对象,实际是将功能进行封装,就是把我们需要的功能装在一个盒子里,当需要这个功能的时候,只需要把这个盒子拿过来,让盒子自己进行运行这个功能,而对象就是具有这个功能的盒子。
宏观上来说,就是万物都是对象,微观上来说就是一个具有一定功能的实体或者虚体,想冰箱,电视,甚至人,都具有一定的功能和技能,我们不必知道他们具体功能是怎么实现的,只需要知道他们有什么功能,让他们做可以了。举例来说,就是我会一些东西,比如会用办公软件,会编程,那么公司就会用我这些技能,而我就以那个对象,公司就是指挥调用的人。
面向对象的三个特征: 封装 继承 多态
开发其实就是找对象使用,没有对象,就创建一个对象。
找对象,建立对象,使用对象,维护对象。
二、类和对象的关系
按我自己的理解来说,类就是一张二维图纸或者是三维模拟图,对象就是根据这些图纸生产出来的具体实物,如果类是手机图纸,那么对象就是手机。这样来说,类就是描述对象的特征和属性的,对象就是一个具体的实体。
类:就是对显示生活事物的描述 在java中就是class定义的类
对象:就是这类事物,实实在在的个体 就是java中在堆内存中用new建立的实体
//类就是描述
class Car
{ 描述事物的属性和行为
具体java程序一般包括数据类型和函数
int num = 4;.................................................成员变量
void run()
{ System.out.println(num);}
}
成员变量和局部变量:
1)作用范围:
成员变量定义在类中,作用与整个类中
局部变量作用于函数汇总,或者语句中
2)内存中未知
成员变量:在堆内存中,因为对象的存在,才在内存中存在
局部变量:存在栈内存中
3)初始化
成员变量:系统默认初始化为0,即我们命名是可以不赋值,成员变量即可参加运算。
局部变量:必须编程时候我们给局部变量初始化,否则参与不了运算。
//建立对象用new来表示 具体格式为: 类名 名称 = new 类名();
内存管理和数组类型建立的时候相似,只是没有相应的角标。
要调用对象里的功能,java里格式为:对象.对象成员 。程序如下:
class CarDemo
{
public static void main(String[] args)
{
Car c = new Car();................................建立一个对象,c就是一个类类型变量,类类型变量指向对象
c.num = 8;.............................................调用对象里的功能
new Car() .num=9;...............................匿名调用对象
}
}
注意上面程序中的匿名对象的应用
new Car().num=5;
new Car().color='bule';
new Car().run();
这其实是三个匿名对象,彼此之间没有联系。匿名对象使用方式一、当对对象的方法(此处注意是方法)只调用一次时,可以用匿名对象来完成,这样写比较简化,如果对一个对象进行多个成员调用,必须给这个对象起个名字。二、使用方式二:可以将匿名对象作为实际参数进行传递。
三、对象三大特征之一:封装
1、封装概述
隐藏对象的属性和实现细节,仅对外提供公共访问方式。
将变化隔离,便于使用,提高重用性,提高安全性。之前学习的函数就是最小的封装体。
2、封装,关键字 private
private 关键字 私有的意思 权限修饰符中的异类,用于修饰类中的成员(成员变量和成员函数)
将类中的成员变量和函数私有化后,类以外即使建立了对象也不能直接访问。
程序例子:
lass Person
{
private int age ;................................................此处age私有化了,只有在本类中有效
void speak()
{
System.out.println("age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.age =20;......................................................................此时,对age访问就失效了
p.speak();
}
}
想要在访问被私有化的变量时,就要在本类中建立一个函数,可以调用被私有化的成员变量。
一个成员变量通常都会对应两个访问方式:一个设置,一个获取
可以在本来中加入以下程序:
public void setAge(int a )....................................用于设置成员变量的值
{
age=a;
}
public int getAge()................................................用于获取成员变量值
{
return age;
}
注意:私有仅仅是封装的一种表现形式。
之所以对外提供访问方式,就因为可以再访问方式中加入逻辑判断语句。对访问的数据进行操作,提高代码的健壮性。即可以在本类的方法中,加入判断或者其他语句,对类外访问数据进行控制。
3、构造函数
构造函数的名字与类名相同,而且这个函数不需要定义返回值类型,不可以写return语句。其作用是给对象进行初始化。
对象以建立的时候,就会调用与之对应的构造函数,就像一个物体的基本特性,只要对象产生,构造函数就会运行,起具体的作用就是给对象进行初始化。如果我们在编程的时候,没有定义构造函数,系统就会给与一个默认的空参数的构造函数Person( ){ } 。当我们在类中自定义了构造函数虎,默认的构造函数就没有了。
class Person
{
Person().......................................................此处就是构造函数
{
System.out.println("person run");
}
}
构造函数可以进行重载,即是在建立对象的时候,给不同的对象进行不同的初始化。一个类可以产生很多对象,可调用相对应的构造函数。就像如下程序:
Person()............................................构造函数Person()
{
System.out.println("A");
}
Person(String n) .....................................构造函数 Person(String n)
{
name = n;
System.out.println(name);
}
Person(String n,int a) ................................. 构造函数Person(String n,int a)
{
name = n;
age = a;
System.out.println(name+","+a);
}
此时就可看出一般函数和构造函数的不同:
构造函数在对象一建立的时候就会运行一次,给对象初始化
一般函数是对象调用才会执行,是给对象添加对象具备的功能。
一个对象建立,构造函数只运行一次。
而一般方法可以被该函数调用多次。
//构造代码块 { System.out.println("ABCD") }
构造代码块也是给对象进行初始化,对象一建立就运行,而且优先于构造函数执行。相对于构造函数,构造代码块是给所有对象进行统一初始化,而构造函数是给想对应的对象进行初始化。所以,构造代码块是可以给不同对象的共性进行定义和初始化。
4、this关键字
Person(String name)
{
name = name;
}
这个程序中,name输出为null。就是说局部中定义两个name,都是局部变量,通俗来说就是局部变量现在局部找相对应的局部变量,没有的话,才会到本类中找成员变量。所以,此时就用关键字this区分成员变量和局部变量同名的情况。程序变为:
Person(String name)
{
this.name = name;...............加上个this关键字。
}
this 代表它所在函数所属对象的引用,就是说哪个对象调用this所在的函数,this就代表这个对象。
this的应用:当定义类中的功能是,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
注意构造函数间的调用只能用this 关键字
Person(String name)
{
this.name = name;
}
Person(String n,int a)
{
this(name);....这个函数间调用语句必须是在第一行,初始化先执行函数自己初始化,再执行自定义初始化
age = a;
System.out.println(name+","+a);
}
构造函数间不可以重复调用,就是你调用我,我调用你,否则相当于死循环。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------