面向对象思想
讲面向对象之前不得不提面向过程.
面向过程:是单一的操作,比如说买东西,洗澡,刷牙就是.
面向对象:我可以请个菲佣,帮我买东西,帮我洗澡,帮我刷牙,这就是面向对象
面向对象的特点:
可重用性强
三大特征:继承\封装\多态
注意:面向对象不可能取代面向过程的.面向对象是基于面向过程的.
对象和类的关系
状态和行为
状态指的是人的肤色\头发\什么人行为指的是走路\跑\喝茶
对象(object)可以定义成包含数据(状态)和行为的一个实体,对象也称为实例(instance)。
对象具有状态和行为
-------------------------------------------------------------------------------------------------------------------
类
类是对象的模板.
在编程世界里,是先有类,再有对象的.
类的定义
public class Person{
String name;
int age;
void run(){
System.out.println("人在奔跑着");
}
void eat(){
System.out.println("人在吃饭");
}
}
这里的nae和age是成员变量,又叫做字段(Field)
对象的基本操作
我想拿到上面代码的对象
Person p1 = new Person();
赋值
p1.name = "张三";
p1.age = 16;
调用方法
p1.run();
p1.eat();
上面的代码已经有
1创建对象
2赋值
3使用方法
还有些操作
4打印对象 是一串数字
5对象的比较 == 比较的是引用的内存地址值
6对象的生命周期 new到垃圾回收器回收之间
7匿名对象
对象的实例化过程
学生缴费案例
class Student{
String name;
int age;
boolean isFee = false;
void jiaofei(){
isFee=true;
}
}
public class StudentDemo{
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
s1.name = "王";
s1.isFee = true;
s2.name = "张";
s3.name = "徐";
Student[] sarr = {s1,s2,s3};
for(Student s:sarr){
if(s.isFee==false){
s.isFee = true;
}
}
System.out.println(s1.isFee);
System.out.println(s2.isFee);
System.out.println(s3.isFee);
}
}
构造器
我们在创建Student对象,代码如下:
Student s1 = new Student();
其实我们在创建对象的时候,都是调用构造方法,构造函数/构造器/构造子.
--------------------------------------------------------
构造器:主要用于创建对象并返回对象和初始化对象数据.
--------------------------------------------------------
构造器的特点:
类都有一个默认构造器,当不显示的定义构造器的时候,编译器会在编译的时候,提供一个默认构造器.
1):构造器的名字必须和当前所在类的类名相同.
2):不需要定义返回值类型,更加不能使用void作为返回.构造器的目的在于创建和返回当前类的对象,即使要编写返回类型,也应该是当前类名,如:StudentStudent(){},既然和当前类名相同,就规定统统省略.
3):构造器中不需要使用return来返回当前构造的对象.
-------------------------------------------------------
默认构造器:
1):无参数,无方法体.
2):构造器的访问修饰符和当前类的修饰符相同(是否有public).
3):一旦在类中显示地提供了构造器,则默认的构造器就不再提供了.
推论:一个类至少有一个构造器(即使没有自定义,编译器也会创建一个默认的).
-----------------------------------------
public class Student{
默认的构造器
public Student(){}
}
---------------
class Student{
默认的构造器
Student(){}
}
-------------------------------------------------------
方法的重载:在同一个类中,方法同名,但是参数列表不同.
解决了相同的功能方法,因为参数列表不同,而带来参数名不同的问题.
构造器重载:
不同类的构造器是不相同的.对于构造器重载来说,肯定是在同一个类中,并且构造器都是和类名相同.
所以在同一个类中的多个构造器就必须参数列表不同(参数类型,参数个数,参数顺序).
static修饰符
类是用来描述多个对象共同的状态和行为的,就拿人的姓名.
看右图,春哥和凤姐这个两个对象,都有拥有姓名,年龄身高和体重等状态,但是不同对象的状态值却不一样.此时发现,我们所描述的信息是针对于某一个具体对象的,对象不同,那么名字是可能不一样的.
---------------------------------------------------------------
现在,我想描述一类事物的状态和行为,比如:人类,有总人数的状态,有毁灭的行为.
可能有人认为,毁灭是一个行为,那么可以在Person类中,定义一个方法(destory),若想毁灭人类,则调用该方法即可.但是新的问题又来了?到底谁来调用destory方法?
春哥.destory();
凤姐.destory();
都不对的,因为他们只能表示自己,不能表示人类.
----------------------------------------------------------------
我们平时在类中定义的成员变量和方法,都是对象的状态和行为.
那如何表示,一类事物的状态和行为呢?不是某一个个体(对象)的.
此时,为了解决该问题,咱们得学习一个修饰符:static.
-----------------------------------------------------------------
static可以修饰成员变量(字段),可以修饰方法等,就表明该字段或该方法属于类,而不属于某一个对象.
-----------------------------------------------------------------
类成员(static修饰成员)的特点:
1):随着类被加载进JVM而同时也最初始化和在内存中分配空间.
2):优先于对象存在.(对象是通过new出来的.)
3):被该类的所有对象所共享.
该状态/行为是整个人类的,那么每一个人都是拥有该状态/行为的.
4):直接使用类名调用即可.
人类毁灭: Person.destory();
类成员和实例成员的访问:
------------------------------------------------
类 成员:使用static修饰的成员变量/方法,属于类,所以可以直接使用类名访问.
实例成员:没有使用static修饰的成员变量/方法,属于对象.必须使用对象来访问.
----------------------------------------------------------------------------------
访问规则:
1):静态方法只能访问静态的成员变量/方法,不能访问非静态的成员变量/方法(属于对象).
静态成员优先于对象存在.
2):非静态方法可以访问非静态成员变量/方法,也可以访问静态的成员变量/方法.
因为底层使用对象访问的.
3):对象可以访问静态成员,但是不推荐,因为底层依然使用类名在调用.
4):类可以访问静态成员,类不能访问非静态成员(成员变量/方法).
-----------------------------------------------------------------------------------
一般的,在开发中类成员如何使用:
一般的,在开发中工具类的工具方法都使用static修饰,如此的好处,直接使用工具类名.方法就可以调用,使用更加简单.
数组的工具类:java.util.Arrays中的工具方法.
一般的,若静态方法需要访问一个成员变量,此时才把成员变量使用static修饰.
深入变量
变量的分类和初始值:
变量因定义的位置不同,分为成员变量和局部变量.
成员变量: 直接定义在类的花括号中的变量.又称之为,字段(Field),有人把成员变量称之为属性,这是错的.
使用static修饰: 类成员变量.
没有使用static修饰: 实例成员变量.
局部变量: 变量除了成员变量,其他就是局部变量.
1):直接定义在方法中的变量.
2):方法的形式参数.
3):代码块({})中的变量.
成员变量都有初始化值,局部变量没有初始化值.
使用局部变量,必须先赋值.成员变量的默认初始值如右图.
在Java中,只有final修饰符,可以修饰局部变量,其他的都不能修饰局部变量.
-----------------------------------------------------------------------------
变量的作用域和生命周期:
当一个变量被定义的时候,它作用域就已经确定了.
成员变量:在整个类中有效.
局部变量的初始化和在JVM中的运行机制:
局部变量定义后,必须显示初始化后才能使用,因为系统不会为局部变量执行初始化操作。
这就意味着,定义局部变量后,系统并未为这个变量分配内存空间。
直到程序为这个变量赋值时,系统才会为局部变量分配内存,并将初始值保存到该内存中。
局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。
基本数据局部变量:直接把这个变量的值保存到该变量所对应的内存中。
引用数据局部变量:这个变量内存中存的是堆中的一块内存空间的地址值,通过该地址引用到该变量实际引用堆里的的对象。
栈内存中的变量无需系统垃圾回收,其往往随方法或代码块的运行结束而结束。
栈中的运算速度远远快于堆内存.