初识面向对象
- 初识面向对象
- 方法回顾和加深
- 对象的创建分析
初识面向对象
-
面向过程思想
- 步骤清晰简单,第一步做什么,第二部做什么….
- 面向过程适合处理一些较为简单的问题
-
面向对象思想
- 物以类聚,分类的思想模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
-
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
-
面向对象编程的本质就是:以类的方式组织代码,以对象的形式组织(封装)数据
-
面向对象的三大特性
- 封装:封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。
- 继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 多态:多态是同一个行为具有多个不同表现形式或形态的能力。
回顾方法和加深
-
静态方法与非静态方法的调用
- 静态方法定义: 在类中使用static修饰的静态方法会随着类的定义而被分配和装载入内存中;而非静态方法属于对象的具体实例,只有在类的对象创建时在对象的内存中才有这个方法的代码段。
Student类
package com.oop.demo01; public class Student { //静态方法 public static void eat(){ System.out.println("kazikazi"); } //非静态方法 public void say(){ System.out.println("hello"); } }
Demo01类
package com.oop.demo01; public class Demo01 { public static void main(String[] args) { //调用静态方法可以直接调用 Student.eat(); System.out.println("========================"); //调用非静态方法时需要实例化对象 new //对象类型 对象名字 = new 对象值; Student student = new Student(); student.say(); } }
运行结果
可以知道,静态方法在main方法中调用可以直接调用,非静态方法则需要先实例化类(new一个对象)才能调用
-
值传递
package com.oop.demo01; public class Demo02 { public static void main(String[] args) { int a = 1; System.out.println(a);//1 change(a);//实参 System.out.println(a);//1 } //返回值为空 public static void change(int a){//形参 a = 10; } }
上述代码中a的值没有改变是因为实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参
通俗来说就是:小明去餐厅看到别人桌子上的糯米鸡好吃,然后小明就叫服务员点了一份糯米鸡,小明吃完了,别人桌上的却不受影响,因为他们吃的不是同一份糯米鸡。
-
引用传递
package com.oop.demo01; public class Demo04 { public static void main(String[] args) { Person person = new Person(); person.name = "高佬"; System.out.println(person.name); Demo04.change(person); System.out.println(person.name); } public static void change(Person person){ //person是一个对象,指向了一个对象 person.name="志恒"; } } class Person{ String name; }
实参传递给形参的是参数对于 堆内存上的引用地址 实参和 形参在内存上指向 了同一块区域 对形参的修改会影响实参
对象的创建分析
对象的创建
-
对象可以通过new关键字来创建,示例如下
创建一个Student类
package com.oop.demo02; //学生类 public class Student { //属性 String name; int age; //方法 public void print(){ System.out.println(this.name+"学生在学习"); } }
Test类
package com.oop.demo02; //一个项目只能有一个main方法 public class Test { public static void main(String[] args) { /* 类:抽象的,需要实例化 * 类实例化之后会返回一个自己的对象 * student对象就是一个Student类的具体实例 * */ Student student1 = new Student(); Student student2 = new Student(); //给对象赋值 student1.name = "小明"; student1.age = 10; System.out.println(student1.name); System.out.println(student1.age); System.out.println(student2.name); System.out.println(student2.age); } }
运行结果:
-
使用new关键字创建的时候,除了分配空间之外,还会给创建好的对象进行默认初始化以及对类中构造器的调用。
构造器
-
构造器又叫构造方法,在进行创建对象的时候必须要调用的。并且构造器有一下两个特点:
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
作用
- 使用new关键字,本质就是在调用构造器
- 初始化对象的值
注意点
- 定义有参构造之后,如果想使用无参构造,就必须显示的定义一个无参的构造
ait+Insert IDEA生成构造器的快捷键
-
构造器代码示例:
Person类:
package com.oop.demo02; public class Person { //一个类即使什么都不写,它都会存在一个方法(构造器) //显示的定义构造器 String name; int age; //无参构造 public Person() { } //有参构造:一旦定义了有参构造,无参就必须显示定义 public Person(String name,int age) { this.name = name; this.age = age; } }
Test类:
package com.oop.demo02; //一个项目只能有一个main方法 public class Test { public static void main(String[] args) { //new 实例化一个对象 Person person = new Person("minster",21); System.out.println(person.name+" "+person.age); } }
对象的内存分析
-
首先先创建一个简单的Pet类
package com.oop.demo02; public class Pet { String name; int age; public Pet() { } public Pet(String name, int age) { this.name = name; this.age = age; } public void shout(){ System.out.println(this.name+"在叫"); } }
Tset
package com.oop.demo02; //一个项目只能有一个main方法 public class Test { public static void main(String[] args) { //new 实例化一个对象 Pet dog = new Pet("旺财",3); Pet cat = new Pet("cat", 3); dog.shout(); cat.shout(); } }
内存分析图
在内存中,创建一个对象,栈空间中存放的是对象的引用,而堆空间中存放的是new出来的东西,栈、堆两个空间通过一个内存地址相互连接。