面对对象OOP(1)
一、类和对象
1.1、类
1、Java语言最基本单位就是类,类似于类型
2、类是一类事物的抽象
3、可以理解为模板或者设计图纸
1.2、对象
每个对象具有三个特点:对象的状态,对象的行为和对象的标识。
1、对象的状态用来描述对象的基本特征。
2、对象的行为用来描述对象的功能。
3、对象的标识是指对象在内存中都有一个唯一地址,用来和其他对象区分开来。
4、类是一类事物的抽象,对象是具体的实现
1.3、类和对象的关系
1、计算机语言是用来描述现实的。(属性+行为)
2、通过类来描述事物,把事物的属性当作成员变量,把行为当作成员方法。
1.4、对象在内存中的存储
Java把内存非为5大区域,我们总店关注栈和堆。
1、一般来讲,局部变量存在栈中,方法执行完毕内存就被释放。
2、对象(实例化类(new class))存在堆中,对象不再被使用时,内存才会被释放。
3、每个堆内存的元素都有地址值
4、对象的属性都有默认值(例如成员变量的默认值)。
1.4.1 单一对象内存图
1、在栈内存中,创建一个引用变量p,持有对象的地址(这个表示对象堆中)。
2、在对内存中,创建Person对象,并且开辟变量的空间,完成初始化。
3、给堆内存中的元素,分配一个唯一标志(地址值),交给p去保存。
4、p.name=“lisi” ;p.age=20;就去堆内存中找到唯一的地址值,找到Person对象,并对其属性进行修改赋值。
5、p.eat();就去堆内存中找唯一的地址值,找到Person对象,执行Person的方法。
1.4.2 多对象内存图
1、变量p和变量p1不是一片空间,p1需要开辟新的空间
2、Person p1=new Person,这时只要有new,就会开辟新空间,在堆内存中存入对象。
1.5、创建对象的流程
Person p = new Person
1、把Person.class文件加载进内存,
2、在堆内存中,开辟空间,存放Person对象,
3、在栈内存中,开辟空间,存放变量p,
4、对成员变量进行默认的初始化
5、对成员变量进行显示初始化
6、执行构造方法(如果有构造代码块,就先执行构造代码块,再执行构造方法)
7、堆内存完成
8、把堆内存的地址值赋值给变量p,p就是一个引用变量,引用了Person对象的地址值。
1.5.1、匿名对象
没有名字的对象,是对象的简化表现形式
使用场景:
当被调用的对象只调用一次时(多次创建多个对象浪费内存)
下面这种情况使用匿名对象会浪费内存
//正常的对象建立
Demo d = new Demo();
d.sleep();
d.game();
//这个d就是对象的名字。
//使用匿名对象
new Demo().show();//创建了一个对象调方法
new Demo().game();//又创建了一个对象调方法
2、构造方法
2.1、概念
构造方法时一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要时完成对象的创建或者对象的初始化。当类实例化一个对象时会自动调用构造方法
构造方法和其他方法一样可以重载(加入参数,可以实现不同方式的对象创建)
构造方法又是构造函数,而构造函数又称为构造器,而构造器用于对象的创建
2.2、形式
可以无参也可以有参
修饰符 类名(参数){
}
public class test(){
String name;
//无参构造
public test(){
}
//含参构造
public test(String n){
name=n;
}
}
构造方法赋值
public class test2{
String name;
int age;
//赋值方式一,通过含参构造赋值
public test2(String name,int age){
this.name=name;
this.age=age;
}
//赋值方法2.通过setXXX()方法赋值
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
}
public class test3(){
public static void main(String[] args){
test2 t1=new test2("小明",12);
System.out.println(t1.name);
System.out.println(t1.age);
test2 t2=new test2();
t2.setName("小明");
t2.setAge(12);
}
}
3、构造代码块和局部代码块
3.1 构造代码块(静态代码块)
1、在类的内部,方法外部的代码块
2、通常用于抽取构造中的共性代码
3、每次调用构造方法之前都会执行构造代码块
4、优先于构造方法加载
3.2 局部代码块
1、在方法里面的代码块
2、通常用于控制变量的作用范围,出了括号就失效
3、变量的范围越小越好,成员变量会有线程安全问题
3.3 执行顺序
构造代码块是最优先的,局部代码顺序执行
4、this关键字
4.1、概念
this代表本类对象的一个引用对象
构造函数中,this()必须放在第一行
4.2、形式
public class test(){
String name;
public void test1(String name1){
this.name=name1
}
}
4.3、应用
1、当局部变量和成员变量同名时,用于区分。
如果附近有同名变量,会遵从变量的就近原则。
2、构造方法间的调用
public class test(){
public static void main(String[] args){
Animal a=new Animal();
}
}
class Animal{
public Animal(){
this("来福");
System.out.println(name);
}
public Animal(String name){
System.out.println(name);
}
}
5、final关键字
5.1、概念
1、是java提供的一个关键字
2、final是最终的意思
3、final可以修饰类、方法、成员变量
出现的初衷:Java出现继承后,子类可以更改父类的功能,当父类不允许子类改变时可以利用final关键字修饰父类的方法、成员变量
5.2、特点
1、被final修饰的类,不能被继承
2、被final修饰的方法,不能被重写
3、final修饰的变量是一个常量,值不能更改
4、常量的定义形式:final 数据类型 常量名=值