面向对象的基本概念
面向对象是相对于面向过程而言的,面向对象强调的是对象(实体),面向过程强调的是过程(动作)
面向对象是一种常见的思想,复核人们的思考习惯, 面向对象的出现,将复杂的问题简单化,让曾经过程的执行者变为指挥者
面向对象是围绕着对象来实施的,只要能够具体化的都可以成为对象,有对象用对象,没对象造对象,维护各个对象之间的关系
Ø 开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
Ø 设计的过程:其实就是在管理和维护对象之间的关系
2.类和对象
类与对象的关系:
类是事物的描述(属性,行为),用java语言对现实生活中的事物进行描述,是通过类的形式来体现;对象是该类事物的实例(个体),
类是对象的模板一个类所包含的方法和数据描述一组对象的共同属性和行为。
类是在对象上的抽象,对象是类的具体化,是类的实例
定义类方法
定义类就是在定义类中的成员:成员变量(属性)成员方法(行为)
用关键字class声明一个类,通过new来创建一个类对象,有几个new就有几个对象
class Car
{
intnum; //成员变量 属性
Stringcolor;//成员变量
voidrun() //行为
{
System.out.println(num+"..."+color);
}
}
创建对象过程及原理
1)对象的声明格式:
类名名称 //如下Car c
2)对象的实例化:
通过运算符 new为对象分配内存空间实例化一个对象。new 调用对象的构造方法,返回该对象的一个引用(类类型,即对象名称c),有几个new就有几个对象
3)对象的初始化:
执行构造方法,进行对象的初始化(成员变量赋值)
示例
class CarDemo
{
publicstatic void main(String[] args)
{
//通过new关键字在计算机中创建一个car的实例。
Carc = new Car(); //c就是一个类类型的引用变量,指向了该类的对象
c.num = 4;
c.color = "red";
c.run();//要使用对象中的内容可以通过 对象.成员的形式来完成调用。
//汽车改装厂。 类类型的参数Car
publicstatic void show(Car c)//类类型的变量一定指向对象。要不就是null。
{
c.num= 3;
c.color= "black";
System.out.println(c.num+"..."+c.color);
}
}
内存图解
对象的生命周期
成员变量和局部变量的区别:
1,
成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
2,
成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
3,
成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
4,
成员变量都有默认初始化值。
局部变量没有默认初始化值。必须手动初始化
匿名对象的使用(简写格式)
1,当对象对方法仅进行一次调用的时候,就可以简化成匿名对象。
Car c = new Car();//一般对象
c.run();
newCar().run();//匿名对象
错误示例:(创建了三次对象,注意new)
newCar().num = 5;
newCar().color = "green";
newCar().run();
2,匿名对象可以作为实际参数进行传递。
Carc1 = new Car();
show(c1); //show()是一个方法
show(newCar());//参数传递
函数的参数传递
基本数据类型和引用数据类型参数图解
Ø 基本数据类型show执行完之后就弹栈了,主函数中只剩下3,所以输出结果x=3
Ø 引用数据类型show将值赋给堆内存中的对象,执行完后弹栈,d.x指向堆内存x=4
没对象和有对象的区别
构造函数
特点:
- 函数名与类名相同
- 没有返回值,不用定义返回值类型
- 作用: 给对象进行初始化。
注意: 默认构造函数的特点。
多个构造函数是以重载的形式存在的。
如果一个类中没有定义过构造函数,那么该类中会有一个默认的空参构造函数Demo(){}
包括主函数
如果类中中定义了指定的构造函数,那么类中的默认构造函数就没有了(要注意)
Ø 一般函数和构造函数的区别
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化;对象创建时,会调用只调用一次。。
一般函数:对象创建后,需要函数功能时才调用;对象创建后,可以被调用多次。
Ø 什么时候定义构造函数呢?
在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。
构造函数可以有多个,用于对不同的对象进行针对性的初始化.
多个构造函数在类中是以重载的形式来体现的。
细节
1,1,构造函数如果完成了set功能。set方法是否需要。
构造函数只能被一个对象调用一次(new完对象给对象初始化时),一般函数可以被同一个对象多次调用
2,一般方法不能调用构造函数,除非new一个对象,(没必要)
3,构造函数没有返回值,加返回值就变成了一般函数。
书写规范:一般函数应小写,以便与构造函数区分开
4,构造函数中是可以有return语句的。(条件判断)结束函数,一般很少见
函数的重载
条件:函数名相同,参数列表不同
cass Person
{
int age;
String name;
Person(String n)//构造方法只能被一个对象执行一次
{
name=n;
}
public void setName(String n)// 1.一般方法存在的必要性,可以被一个对象执行多次,改名
{
name=n;
}
Person(String n, int a)
{
name=n;
age=a;
}
public void speak()
{
System.out.println(name+”:”+age);
}
}
Person p=new Person(”小强”,10)
P.speak
构造函数内存图解
new来创建空间,构造函数进栈,只负责赋值,构造函数执行完毕弹栈,将对象的地址值赋给p2
本章小结
1. 一旦在某个非静态方法中调用了另一个非静态的成员属性/方法,这个非静态的成员属性/方法前面必须通过一个对象。
2. 如果没有跟对象来调用这个属性/方法,那么调用这个属性/方法的对象一定是和调用这个非静态方法的对象同为一个对象--àthis
3.构造函数只能用new来初始化对象,而不能像普通方法那样被调用!