DUFQ_2020.12.5-杜飞强-面向对象基础
面向对象基础
面向对象
面向对象程序OOP(Object Oriented Programming)是一种基于对象概念的软件开发方法。
三大特性
封装、继承、多态
对象
在面向对象的世界中认为万事万物都是对象,看得见、摸得着的任何物品,例如猫、狗、订单、商品等。
两个方面认识对象
1.对象有什么状态?
对象的状态指对象本身固有的属性,例如猫的年龄、体重、毛色等。
2.对象有什么行为?
对象的行为指对象具有哪些功能,例如猫捉老鼠、上树、跳跃等行为。
所有的对象都有状态,所有的对象都有行为。
属性 = 状态 方法 = 行为
对象就是真实存在的具体的个数,属性是类内方法外的变量。
类
类是具有相同的状态和相同的行为的一组对象的集合。如果多对象都有相同的状态和相同的行为,就可以将这些对象归纳为同一类。例如学号、姓名、身高的状态等统称为学生类。
类和对象的关系
类和对象的关系就如同模具和用这个模具制作出来的物品之间的关系。一个类给出它的全部对象的一个统一的定义,而它的每个对象则是符合这种定义的一个实体(也称作实例),因此类和对象的关系就是抽象和具体的关系。类是多个对象进行综合抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例。
- 类是对象的抽象,类是对象的模板。
- 对象是类的实例(instances),对象是类的一个具体个体。
定义类
第一步:定义Student类
public class Student {
}
第二步:定义类的属性
public class Student {
//定义类的属性
String name;
int age;
int weight;
String tel;
}
第三步:定义类的方法
public class Student {
//定义类的属性
String name;
int age;
int weight;
String tel;
//定义方法
public void dowork() {
}
public void learn() {
}
}
定义对象
通过new运算符创建对象
例如
Student s = new Student();
对象分为两部分,分别是对象的引用和对象的实例。
对象的引用:s 栈中
对象的实例:new Student(); 堆中
对象的引用指向到对象的实例。
使用对象
使用成员运算符.来使用对象
例如:
s.name=”哈哈”;
s.dowork();
对象的数组
代码
Person []persons =new Person[]{
songjiang,
huarong,
husanniang
};
内存
类的构成
类的构成是指类中包含哪些内容
类中包含属性和方法
类的成员变量
类的属性是指类内,方法外声明的变量。
类的属性也叫成员变量。
类的成员变量的内存分配在堆中,属性的内存单元是在实例化对象时分配的。
例如
public class Student {
//定义类的属性
String name;
int age;
int weight;
String tel;
}
常见错误
Student stu=null;
stu.name = "aa";
错误原因是stu是空指针,无法将字符串aa保存到stu指向的name内存单元中。
变量的作用域
成员变量的作用域是类内
局部变量的作用域是方法内或者循环内或者if语句内。
类的成员变量
类中定义分方法就是类的方法,也叫成员方法。
类的方法包括main方法,构造方法,析构方法,普通方法。
例如:
public class Student {
//定义方法
public void dowork() {
System.*out*.println("做作业");
}
public void learn() {
System.*out*.println("学习");
}
}
方法重载
定义
在同一个类中,方法名称相同,方法参数不同(个数不同,或者类型不同,或者顺序),与返回值无关的多个方法称为方法重载。
eg:定义不带参数的work()方法,再定义一个带有参数的work()方法,形成work()方法的两次重载。
public void work(int hour) {
System.*out*.println("做作业");
}
public void work(double a) {
System.*out*.println("做作业");
return 0;
}
方法重载的调用
方法调用时,jvm会自动根据主调方法的参数来决定调用哪个重载形势的方法。
eg:
public static void main(String[] args) {
Student s =new Student();
s.dowork();//调用没有参数的dowork方法
s.dowork(21);//调用有一个整型参数的dowork方法
}
参数的传递
对比方法内部对基本数据类型参数与引用类型参数重新赋值后对主调方法的影响。
public class Person {
public int age;
}
public class TestPerson {
public static void main(String[] args) {
//基本数据类型
System.out.println("***** 基本数据类型 ****");
int num1 = 11;
int num2 = num1;
System.out.println("num1="+num1);
num2 = 22;
System.out.println("把num1赋给num2后,修改num2的值,num1="+num1);
//引用数据类型
System.out.println("***** 引用数据类型 ****");
Person person1 =new Person();
person1.age =11;
Person person2 = person1;
System.out.println("person1.age="+person1.age);
person2.age = 22;
System.out.println("把person1对象赋给person2对象,修改person2对象的age属性值后,person1.age="+person1.age);
}
}
运行结果:
** * ** 基本数据类型 * ***
num1=11
把num1赋给num2后,修改num2的值,num1=11
** * ** 引用数据类型 * ***
person1.age=11
把person1对象赋给person2对象,修改person2对象的age属性值后,person1.age=22
评论留言