面向对象
现实生活中 一切客观存在的事物 都被称为对象 万物皆对象
面向对象思想:从对象入手 找出需求中所有对象 通过对象与对象之间的关系 解决问题
我们一般可以从两个维度 完整的描述一个对象:
1.对象有什么? 对象的特征
2.对象能干什么? 对象的功能
计算机中的对象:
对象的特征: 属性 属性在计算机中用数据来描述
对象的功能: 方法 方法在计算机中用函数来描述
玳瑁
海猪
鹿豚
一、类
对象的模板,用来描述对象有什么特征和功能。
类的构成:属性+方法
语法:
class 类名{
}
类名要望文生义 一般做什么模板叫什么名字
1.属性 — 成员变量和实例变量
a)定义位置:类以内方法以外
b ) 语法:
数据类型 属性名;
String name;
int age;
double score;
定义属性时 选择合适的数据类型
属性名需要望文生义
2.方法 — 成员方法和实例方法
a)定义位置:类以内其他方法以外
b ) 语法:
访问权限修饰符 返回值类型 方法名(参数表){
方法的实现
}
方法的三要素: 返回值类型 方法名 参数表
在方法中,可以直接使用属性
方法名 需要望文生义 驼峰命名法
二、对象
根据模板(类)所创建出的实例,每个实例都有着不同的特征
1.创建一个对象
语法:
类名 对象名 = new 类名();
什么样的对象 就需要什么类型的变量来接收它
2.访问对象的属性/方法
语法:
对象名.属性 = 值; 注意 值的类型要和类中属性的类型 相匹配
也可以使用 对象名.属性 的形式 来使用该属性的数值
Teacher t = new Teacher();
t.name = "老师";
t.age = 9;
t.subject = "挖掘机";
System.out.println(t.name);
String name = t.name;
对象名.方法名(参数);
t.drive();
注意:
我们可以使用 null来给某个引用赋值 但如果一个引用中存储的内容是null 则在运行时该引用调用方法或属性时 会出现 NullPointException
三、方法重载OverLoad
屏蔽方法不同参数间的差异,使一个类中可以定义多个相同方法名的方法 使用起来更为方便
语法要求:1.方法名必须一样
2.参数表必须不一样(参数的个数不同 参数的类型不同 参数的顺序不同)
3.与其他无关
方法重载时,会根据实际的参数来调用相应的方法,在实参与方法的参数列表匹配时存在着以下的机制:
1.按照实参精确的匹配形参,从而确定调用的方法
2.如果精确匹配没有匹配成功,则会按照实参类型 向上继续匹配
3.如果向上匹配时 也无匹配成功 则编译出错
注意:避免参数的混淆调用 导致调用不明确
四、构造方法
1.语法:
1)没有返回值类型 连void都没有
2)构造方法方法名 必须和类名一致(大小写都一样)
3)其余语法 与成员方法一致
2.注意:
1)构造方法 不可以手动调用
2)会在创建对象时 JVM自动调用构造方法
JVM自动调用构造方法时,会根据创建对象时 new 类名(参数) 会根据参数 来调用相应的构造方法
3)构造方法 也可以重载 并且重载语法要求与成员方法一致
4)当一个类中 没有定义任何一个构造方法时 编译器会为这个类提供一个公开的无参数的构造方法 当定义了任意一个构造方法时 编译器都不会再自动提供公开无参构造 要求 只要在一个类中定义了一个有参构造就配套必须定义一个公开无参构造
3.作用:在创建对象的同时 给对象的属性进行赋值
因为在构造方法里 进行了赋值操作
class Student{
//属性
String name;
int age;
double score;
//方法
public void study(){
System.out.println("正在学习");
}
public void sayHello(){
System.out.println("你好,我叫"+name);
}
public Student(){
System.out.println("无参数的构造方法");
}
public Student(String a,int b,double c){
//System.out.println("有参数的构造方法,参数分别是"+a+" "+b+" "+c);
name = a;
age = b;
score = c;
}
}
那么
Student stu = new Student("赵老弟",2,5.9);
就相当于代替了
Student stu = new Student();
stu.name = "赵老弟";
stu.age = 2;
stu.score = 5.9;
五、局部变量与成员变量的区别
成员变量 | 局部变量 | |
---|---|---|
默认值 | 有默认值,默认值与数组元素的默认值一致 | 无默认值 先声明 再赋值 再使用 |
定义位置 | 类以内 方法以外 | 函数(方法)以内 |
作用范围 | 至少类以内可用 两个成员变量不可重名 当成员变量与局部变量的作用范围冲突时 局部变量优先 | 定义行到定义它的代码块结束 并且相同作用范围局部变量不可重名 |
如果想自定义一个属性的默认值 我们可以在声明一个属性时 给该属性赋值
数据类型 属性名 = 值;
这样一来 所有创建出的对象 如果属性没有被赋值 那么该属性都是在声明时的赋值
这种形式 被称为 属性的初始化
今天的作业:1,2,3,5,6,10,11,12
有困难的同学:1,2,3,6,10
六、对象的创建过程
1.开辟空间,为属性赋默认值(属性第一次被赋值 不可控JVM来做 )
2.属性的初始化 如果使用了属性初始化 则初始化的数值 会在这一步覆盖掉默认(属性第二次被赋值 可控)
3.执行构造方法 (属性第三次被赋值 可控)
七、引用
栈空间存储局部变量 堆空间存储对象
在一个局部变量中存储一个对象的堆空间地址这种方式被称为引用
引用的类型 引用名 = new 类名(参数);
等号右边 是被引用部分
等号左边 是引用部分
1.引用类型的之间的地址传递
Dog d = new Dog("旺财",9,"绿色");
Dog d2 = d;
d2.name = "二狗";
System.out.println(d.name);
System.out.println(d2.name);
2.基本数据类型之间的值传递
int a = 10;
int b = a;
b++;
System.out.println(a);
System.out.println(b);
八、this关键字
this指代当前对象
1.this. — 构造方法和成员方法均可使用
a)this.属性名 — 可以指代成员变量 当一个区域里没有和成员变量冲突的局部变量是 属性名前会默认补上this.
b)this.方法名(参数)—指代成员方法
2.this(参数) — 调用构造方法 只能在构造方法中使用
调用时 会根据所填参数来匹配调用相应的构造方法
注意:
a)this()调用时必须在构造方法的第一句
b)避免构造方法的递归调用