面向对象
一、什么是对象
万物皆对象。
二、什么是面向对象
面向对象是一种编程思想。
一般情况下是与面向过程对比来说的。
面向过程:
将大象装进冰箱。三步。一般用来解决相对简单的业务问题,代码量较少。
面向对象:
使用相应的思想去解析该问题。
大象:大小
冰箱:容积、入口
执行者:推
面向对象思想一般用来解决大型项目,以及比较复杂业务问题。代码量较多。
三、对象
对象具备一定的特征和行为。
特征:一般使用名词。又称为属性。代表对象有什么。例如:大小、颜色等
行为:一般使用动词。又称为方法。代表对象能做什么。例如:吃、跑等
四、什么是类
类是对象产生的模板。具备有相同的特征和行为的对象,所抽取的共同的特征和行为的模板称为类。
/** * 狗 */ public class Dog { // 属性(特征) String brand; // 品种 int age; // 年龄 String sex; // 性别 String furColor; // 毛色 // 方法,行为 public void eat() { System.out.println("正在吃..."); } public void sleep() { System.out.println("正在睡..."); } }
public class Demo1 { public static void main(String[] args) { // 创建一只狗 Dog dog1 = new Dog(); dog1.brand = "二哈"; dog1.age = 2; dog1.sex = "公"; dog1.furColor = "黑白"; System.out.println("品种为:" + dog1.brand + ",年龄为:" + dog1.age + ",性别为:" + dog1.sex + ",颜色为:" + dog1.furColor); dog1.eat(); dog1.sleep(); Dog dog2 = new Dog(); dog2.brand = "金毛"; dog2.age = 1; dog2.sex = "公"; dog2.furColor = "金色"; System.out.println("品种为:" + dog2.brand + ",年龄为:" + dog2.age + ",性别为:" + dog2.sex + ",颜色为:" + dog2.furColor); dog2.eat(); dog2.sleep(); } }
五、实例变量
对象也叫实例,属性也叫特征、字段(field)、实例变量。
一般变量需要先赋值后使用,实例变量(属性)不需要赋值,可以直接使用,会有默认值。默认值和数组的默认值相同。
public class Demo03 { public static void main(String[] args) { Student s1 = new Student(); System.out.println(s1.score); // 打印默认值0 } }
局部变量 | 实例变量 | |
---|---|---|
定义位置 | 定义在方法的内部 | 定义在类的内部,方法的外部 |
默认值 | 没有默认值,先赋值后使用 | 有默认值,与数组相同 |
使用范围 | 从定义的行到其结构结束 | 本类内部有效 |
命名冲突 | 局部变量不允许重名 | 不能与实例变量同名,但是可以与局部变量同名。局部变量优先 |
六、实例方法
实例方法在定义时不能加static。
分为方法声明和方法实现。
方法声明指方法的名称、返回值、参数列表等。
方法的实现即大括号中间的内容。
public class Student { int score; public void printScore() // 方法声明 // 方法实现 { int score = 5; System.out.println(score); System.out.println(this.score); } }
七、方法重载(overload)
方法重载是指方法名称相同,参数列表(类型、个数、顺序)不同。与返回值类型、访问修饰符无关。
系统根据参数列表去找到相应的方法进行调用。
public class Person { // 食物 public void eat(String s) { } // 药物 public void eat(int n) { } public void eat(int n, String m) { } public void eat(String n, int m) { } // 口香糖 public void eat(double n) { } }
八、构造方法
是类中的一个特殊方法,用来创建对象。
特点:
与类名完全相同
没有返回值类型
不能使用点号调用,需要使用new 关键字调用
如果没有在类中定义构造方法,则编译器会自动提供无参构造方法。
public class Cat { String name; public Cat() { System.out.println("被调用"); } // 不报错,可以存在,但是不应该如此定义一个普通方法 // public void Cat() { // System.out.println("普通方法"); // } }
public class Demo05 { public static void main(String[] args) { Cat cat = new Cat(); } }
九、对象的创建过程
步骤:
分配内存空间
属性的初始值和默认值
构造方法调用
将对象的地址赋值到变量中
十、构造方法重载
可以创建带参数的构造方法,此方法传入的参数,可以使用属性来保存。
注意:如果手动创建的构造方法,那么自带的默认的无参构造方法就没有。
public class Student { String name; int age; public Student(String n) { // 保存传入的参数 name = n; } public void introduce() { System.out.println("学生的姓名为:"+name+"学生的年龄为:"+age); } } public class Demo1 { public static void main(String[] args) { Student s = new Student("张三"); s.introduce(); } }
有参构造方法可以减少给属性赋值的代码,强制要求在创建时必须要给属性赋值,才能正确使用。
public class Student { String name; int age; public Student() { } public Student(String n) { // 保存传入的参数 name = n; } public Student(String n, int a) { // 保存传入的参数 name = n; age = a; } public void introduce() { System.out.println("学生的姓名为:"+name+"学生的年龄为:"+age); } }
十一、this关键字
当构造方法中,变量名与属性相同时,应该使用this关键字调用属性。
public class Student { String name; int age; public Student(String name, int age) { // 保存传入的参数 this.name = name; this.age = age; } public void introduce() { System.out.println("学生的姓名为:"+name+"学生的年龄为:"+age); } }
this关键字表示当前类的对象。有以下用法:
1、调用当前对象属性(如上代码)
2、调用当前对象的方法。
3、调用其他构造方法
public class Student { String name; int age; String sex; public Student(String name, int age) { // 保存传入的参数 this.name = name; this.age = age; } public Student(String name, int age, String sex) { // 调用其他构造方法 this(name, age); this.sex = sex; } public void introduce() { System.out.println("学生的姓名为:"+name+"学生的年龄为:"+age); } public void m1() { System.out.println("方法m1被调用,也进行自我介绍"); // 调用当前对象的方法,哪个对象调用m1方法,this就指代哪个对象。 this.introduce(); } }