面向过程:打开冰箱,存储大象,关上冰箱。
对于面向过程思想,强调的是过程(动作)。c语言就是面向过程的。
面向对象:找到冰箱即可,冰箱具备打开,存储,关闭的功能,冰箱将这些功能进行了封装。
对于面向对象思想,强调的是对象(实体)。C++和java是面向对象的。
特点:1.面向对象就是一种常见思想,符合人们的的思考习惯。
2.面向对象的出现,将复杂的问题简单化。
3.面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者。
举例:买电脑
面向过程:自己查找资料,学习,然后自己去买。
面向对象:找一个懂的人,让他帮你买,自己指挥就行。
类是java语言对现实生活中的事物进行描述的一种形式。对于事物描述通常只关注
两方面。一个是属性,一个是行为。描述时只要明确该事物的属性和行为并定义在
类中即可。对象就是该类事物中实实在在存在的个体。定义类其实就是在定义类中
的成员。
类与对象之间的关系:类是一组相关的属性和行为的抽象,对象是该类事物的具体体现。
类:事物的描述对象:该类事物的实例。在java中通过new来创建的。
事物:
属性 特征
行为 功能
类:
成员变量 特征
成员方法 功能
类的组成:
成员变量 类中方法外的变量
成员方法 没有static修饰的方法
需求:
用Java语言体现学生类。
分析:
A:得到学生事物
B:把学生事物转换为学生类
C:用代码体现学生类
实现:
A:得到学生事物
属性:
行为:
B:把学生事物转换为学生类
成员变量:
成员方法:
C:用代码体现学生类
学生类:
成员变量:
成员方法:
创建类的对象:
格式:
类名 对象名 = new 类名();
这样就表示创建了该类类型的一个对象。
如何使用成员呢?
成员变量:
对象名.变量;
成员方法:
对象名.方法名(...);
描述小汽车:
分析:1.属性:轮胎数,颜色, 2.行为:运行class Car
{
int num;
String color;
void run()
{
System.out.println(num+"..."+color);
}
}
class CarDemo
{
public static void main(String[] args)
{
//在计算机中创建一个car的实例,通过new关键字。
Car c=new Car(); //c就是一个类类型的引用变量,指引了该类的对象。
c.num=4; //4个轮胎
c.color="red"; //车是红色的
c.run(); //要使用对象中的内容可以通过 对象.成员 的形式来调用
}
}
成员:成员变量就是属性,成员函数就是行为。
成员变量和局部变量的区别:1.成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
2.成员变量存在于堆内存的对象中;
局部变量存在于栈内存的方法中。
3.成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
4.成员变量都有默认初始化值。
局部变量没有默认初始化值。
成员变量和局部变量的区别?
A:在类中的位置不同
成员变量 类中方法外
局部变量 方法内或者方法声明上
B:在内存中的位置不同
成员变量 堆内存
局部变量 栈内存
C:生命周期不同
成员变量 随着对象的存在而存在,随着对象的消失而消失
局部变量 随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值
成员变量 有默认初始化值
局部变量 没有默认初始化值
例题:判断程序运行结果。
//基本数据类型参数传递
class Demo
{
public static void main(String[] args)
{
int x=3;
show(x);
System.out.println("x="+x);
}
public static void show(int x)
{
x=4;
}
}
答案:x=3 (x先是默认值0,然后变成3,show运行完后弹栈,不改变x的值)
//引用数据类型参数传递
class Demo
{
int x=3;
public static void main(String[] args)
{
Demo d=new Demo();
d.x=9;
show(d); //这句若改成show(new Demo());则程序结果为x=9
System.out.println(d.x);
}
public static void show(Demo d)
{
d.x=4;
}
}
答案:x=4 (x先是默认值0,然后是3,然后9,这里操作的是对象,是在堆内存
里的,栈内存d的只是指向堆内存的地址,相当于指针,所以会再次改变x为4)
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离,便于使用,提高了复用性和安全性。
封装的原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
(台式电脑的主机机箱就是一个典型的封装体。)
private:私有,是一个权限修饰符,用于修饰成员变量和方法,私有的内容只能在本类中访问。
注意:私有仅仅是封装的一种体现而已,私有是封装,但封装不仅仅是私有。
封装加入private后的标准代码:
A:把成员变量private修饰
B:针对每一个成员变量给出
getXxx()和setXxx()(注意首字母大写)
注意:这里的xxx其实是成员变量名称。
构造函数:
特点: 1.函数名与类名相同。
2.不用定义返回值类型。
3.没有具体的返回值。
作用:给对象进行初始化。
在描述事物时,该事物一产生就具备一些内容,这些内容就定义在构造函数中。
注意:多个构造函数是以重载的形式存在的。创建对象都“必须”要通过构造函数
初始化,即使没有定义过构造函数,该类中也会有一个默认的空参数构造函数。
(重载,简单说,就是函数或者方法有同样的名称,但是参数类型不同或个数不同或顺序不同的情形,这样的同名不同参数的函数之间,称之为重载函数或者方法。)
构造函数与一般函数的区别:
构造函数在对象创建时就会调用,对对象进行初始化,且只调用一次。
一般函数在对象创建后,需要函数功能时才会调用,可以被多次调用。
标准代码的写法:
手机类:
成员变量:
brand,price,color
构造方法:
无参,带参
成员方法:
getXxx()/setXxx()
show(),call()
this关键字
当成员变量和局部变量同名,可以用关键字this区分。
this.name=name this代表当前对象(专业术语:this即所在函数所属对象的引用)
简单说就是那个对象调用了this所在的函数,this就代表那个对象
this还可以用于在构造函数中调用其他构造函数,但只能定义在构造函数的第一行,
因为初始化动作要先执行。
static(静态)关键字
特点:1.static是个修饰符,用于修饰成员(成员变量和成员函数)
2.static修饰的成员被所有的对象共享。
3.static优先于对象存在,因为static的成员随着类的加载就存在了。
4.static修饰的成员多了一种调用方式,可以直接被类名调用。
5.static修饰的数据是共享数据,对象中存储的是特有数据。
成员变量(实例变量)随着对象的存在而存在,随着对象的被回收而消失。存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量(类变量)随着类的加载而存在,随着类的消失而消失。存储在方法区(共享数据区)的静态区。所以也叫对象的共享数据。
注意:1.静态方法只能访问静态成员。
2.静态方法不能使用this或super关键字。
3.主函数是静态的。
静态static什么时候用?
1.静态变量:当对象中成员变量的值都是相同的,那么这个成员就可以被静态修饰。
如果数据在对象中是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。
2.静态函数:函数是否用静态修饰只参考一点,就是该函数功能是否需要访问到对象中的特有数据。
如果不需要,定义成静态的更好一点,因为非静态方法需要被对象调用,而仅创建对象,不访问特有数据,该对象的创建是没有意义的。
static{} 静态代码块:类一加载就执行,而且只执行一次。可以给类进行初始化。
{} 构造代码块:可以给所有对象初始化,构造函数是给对应的对象的进行针对性的初始化。
执行顺序:静态代码块>构造代码块>构造函数
补充:关于主函数的格式
主函数格式:public static void main(String[] args);
主函数格式是固定的,且能被jvm所识别和调用。
public:因为权限必须是最大的。
static:jvm调用主函数时是不需要对象的,直接用主函数所属类名调用即可。
void:主函数没有具体的返回值。
main:函数名,不是关键字,只是一个jvm识别的固定的名字。
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。
args是唯一可以改变的,就是变量名,合法即可。