面向对象
什么是面向对象
- 从Java的角度:“万物皆对象”,对象是一个操作单位,所有内容可以被认定为是一个对象(一个操作单位)
- 从程序的角度:对象是内存中的一块存储空间,存放着现实生活中对象特征和行为的具体信息
对象的组成
- 特征:都有什么
- 行为:会做什么
对象间的关系
- is a:一个对象继承自另一个对象
- has a:一个对象是另一个对象的组成部分
- use a:一个对象使用另一个对象
重新认识类
存放对同一批对象的特征和行为的描述,约束同一批对象所具有的内容
测试类:特点为拥有主函数,可以直接执行
描述型的类:特点为没有主函数,无法执行,作用为描述对象特征和行为
类和对象间的关系
- 类是对象的模板
- 对象是类的实例
- 一个模板可以创建多个相同相似的实例
类的组成
- 属性:描述对象特征。也称全局变量、成员属性、成员变量等
- 位置:类以内,其他内容以外,通常写在类的最上方
- 特点:有默认值,作用为空间占位,保证会分配空间
- 属性和局部变量的区别
局部变量 | 属性 | |
---|---|---|
位置 | 方法内部 | 方法外部 |
默认值 | 没有 | 有 |
作用范围 | 定义行开始到直属代码快结束 | 至少整个类 |
命名冲突 | 同哟作用范围内不可重名 | 可以与局部变量重名,局部变量优先级更高 |
- 方法:描述对象行为。也称成员方法、普通方法等
函数就是加了atatic的方法
访问修饰符 返回值类型 方法名(形参列表){
//操作语句
//return 语句;
}
- 位置:类以内,方法以外,和属性平级
package com.by.entity;
public class Student {
String name;
int age;
String sex;
double score;
// score=90.0; 错误!!
//吃饭
public void eat(){
System.out.println("吃饭");
}
//睡觉
public void sleep(){
System.out.println("睡觉");
}
//学习
public void study(){
System.out.println("学习");
}
}
创建对象
类名 对象名=new 类名();
对象的使用
- 使用属性
取值: 对象名.属性名;
赋值: 对象名.属性名=值;
- 使用方法
对象名.方法名(实参列表);
//创建一个学生对象
Student stu1 = new Student();
Student stu2 = new Student();
//给stu1对象属性赋值
stu1.name = "zhangsan";
stu1.age = 20;
stu1.sex = "男";
stu1.score = 90;
//获取stu1对象属性的值
System.out.println(stu1.name);
System.out.println(stu1.age);
System.out.println(stu1.sex);
System.out.println(stu1.score);
//获取查看stu2属性的值
System.out.println(stu2.name);
System.out.println(stu2.age);
System.out.println(stu2.sex);
System.out.println(stu2.score);
//调用stu1中的方法
stu1.eat();
stu1.sleep();
stu1.study();
构造方法
- 特殊的方法,作用为创建对象
语法
1.无参构造
访问修饰符 类名(){
}
- 有参构造
访问修饰符 类名(数据类型 参数名1,数据类型 参数名2,..){
属性名1=参数名1;
属性名2=参数名2;
..
}
package com.by.entity;
public class Student {
public String name;
public int age;
public String sex;
public double score;
// score=90.0; 错误!!
//无参构造
public Student() {
}
//有参构造
public Student(String n, int a, String s, double sc){
//用对应形参给对应属性赋值
name = n;
age = a;
sex = s;
score = sc;
}
//吃饭
public void eat(){
System.out.println("吃饭");
}
//睡觉
public void sleep(){
System.out.println("睡觉");
}
//学习
public void study(){
System.out.println("学习");
}
}
特点
- 语法特点
- 没有返回值类型部分
- 方法名必须与类名一致
类名 对象名=new 类名();
- 第一个类名:用来声明创建的是哪个类的对象
- 第二个类名:用来指明调用构造方法
- 构造方法必须通过new关键字调用
- 根据创建对象时的小括号内的参数列表决定调用的是哪个构造
- 语法补充:利用有参构造创建对象
类名 对象名=new 类名(实参列表);
//利用有参构造创建一个学生对象
Student stu = new Student("zhangsan", 20, "男", 100.0);
- 无参否早与有参构造的区别:
- 无参构造:只负责创建对象
- 有参构造:在创建对象的同时可以给属性赋初始值
- 无参构造至多存在一个,有参构造可以存在0-n个
- 每个类中都会默认提供一个无参构造,该构造具有时效性,当类中显示定义构造后,默认值给予的构造将会失效
对象包含案例代码:
package com.by.entity; /** * 班级类 */ public class Clazz { public String className; public int classNumber; //添加一个老师对象属性 public Teacher tea; //无参构造 public Clazz(){ } //有参构造 public Clazz(String cName, int cNumber) { className = cName; classNumber = cNumber; } } /** * 老师类 */ public class Teacher { public String name; public String sex; public Teacher(){ } //有参构造 public Teacher(String n,String s){ name = n; sex = s; } //行为方法-教学 public void teach(){ System.out.println("正在教java..."); } }
package com.by.test; import com.by.entity.Clazz; import com.by.entity.Teacher; public class Test3 { public static void main(String[] args) { //创建一个老师对象 Teacher t = new Teacher("张三", "男"); //创建一个班级对象 Clazz c = new Clazz("1班", 20); //将对象t赋值给c的tea属性 c.tea = t; //查看班级对象c的所有信息: 班级名 班级人数 所包含的老师姓名 所包含的老师性别 System.out.println("班级名: "+c.className+ " 班级人数:"+c.classNumber+ " 所包含的老师姓名:"+c.tea.name+ " 所包含的老师性别:"+c.tea.sex); } }
方法重载
作用
为了方便程序员书写和调用功能相同或相似的方法
规则
- 方法名必须相同
- 参数列表必须不同
- 与访问修饰符,返回值类型,异常没有关系
this关键字
- 代表当前对象
this.
this.属性名: 用来指明当前类的属性
this.方法名(实参列表):用来指明调用当前类的方法
有参构造标准语法:
public 类名(数据类型 属性名1,数据类型 属性名2,..){ this.属性名1=属性名1; this.属性名2=属性名2; .. }
示例
public Student(String name, int age, String sex, double score){ //用对应形参给对应属性赋值 this.name = name;//属性=形参 this.age = age; this.sex = sex; this.score = score; } public Student(String name, int age) { this.name = name; this.age = age; }
this ()
- 作用为调用本类的其他构造内容
使用
- 根据实参列表决定调用的是哪一个构造内容
- 必须写在构造方法有效代码第一行
- 无法循环调用
public Student() {
//this();循环调用,错误!
this("lisi", 20, "男", 90.0);
}
//有参构造
public Student(String name, int age, String sex, double score){//name="张三" age=22 sex="男" score=90.5
//用对应形参给对应属性赋值
this(name, age);
this.sex = sex;
this.score = score;
}
public Student(String name, int age) {
//this(); 循环调用,错误!
this.name = name;
this.age = age;
}
对象创建过程
- 又名属性的三个赋值时期
- 开辟空间,赋默认值
- 赋初始值
- 执行构造再次赋值
今日掌握
- 对象间的关系
- 类和对象间的关系
- 属性和局部变量的区别
- 构造方法的特点
- 方法重载的规则
- this的含义和
this.属性名
的使用 - 对象的创建过程