1.定义
1)面向过程:第一步做什么,第二步做什么...
2)面向对象:分类的思想,抽象(将多个对象相像的共同点抽取出来,形成类)
对于描述复杂的事务,需要从宏观上把控,先用面向对象的思想来分析整个系统;但是具体到微观操作,再用面向过程的思想来处理。
2.面向对象编程: Object-Oriented-Programming,简称OOP
以类的方式组织代码,以对象的形式封装数据
3.三大特性:封装 、继承、多态
从认识论角度:先有对象后有类。对象-----是具体的,具体的事务; 类------是抽象的,是对对象的抽象
从代码运行的角度:先有类后有对象,类是对象的模板
2.创建与初始化对象
如何初始化一个类:使用new关键词创建
new Student(); //这样就可以初始化Student这个类
=====》在idea上先输入new Student();,再Alt+回车
Student student = new Student();
使用new关键词创建时,会分配内存空间、给创建的对象进行默认初始化及对类中构造器的调用
1)先创建一个Application类,这是我们包含main方法的类,一个项目里面只有一个main方法
2)再创建一个Student学生类,一个类中只有属性(成员变量)和方法
1 //学生类 2 public class Student { 3 //一个类中只会有属性和方法 4 5 //属性:字段 6 String name; 7 int age; 8 9 //方法 10 public void study(){ 11 //this表示当前类 12 System.out.println(this.name+"在学习"); 13 } 14 }
3)在main方法里实例化Student类,然后才可以进行调用
1 //一个项目应该只存在一个main方法,也就是说demo02这个项目只在Application类中写一个main方法,其他类里面不写main方法 2 public class Application { 3 public static void main(String[] args) { 4 //由于类是抽抽象的,所以需要实例化 5 6 //实例化Student类 7 //先输入new Student();,再Alt+回车 8 Student student = new Student(); 9 /*类实例化后会返回一个自己的对象, 10 也就是说,上面的student对象就是Student类的一个具体实例! 11 例如下面的xiaoming,xiaolan也是Student类的一个具体实例 12 */ 13 Student xiaoming = new Student(); 14 Student xiaolan = new Student(); 15 //调用学生类的name属性 16 //这里会输出null,因为上面在创建xiaoming这个对象的时候,会进行默认初始化, 17 //而name的默认属性是String, 18 System.out.println(xiaoming.name); 19 20 //赋值 21 xiaoming.name="小明"; 22 xiaoming.age=3; 23 System.out.println(xiaoming.name); 24 System.out.println(xiaoming.age); 25 } 26 }
3.构造器(构造方法)
1)一个类即使什么都不写,也会有构造器。构造器必须与类名相同,必须没有返回值类型,也不能写void。在new时被调用。使用new关键字,本质上是在调用构造器
2)构造器分为无参构造和有参构造。类中默认有一个无参构造,可以不写。但是,如果类中显式写了有参构造而不写无参构造,无参构造就自动失效。所以,为了防止子类调用问题,一般都会写上。有参构造与无参构造都存在时,就相当于方法的重载。
3)构造器用于初始化类中的属性
新建一个Person类,里面为空,在main方法中调用,显示如下图:
运行发现可以运行成功,下面打开Person.java的class文件查看
加上out目录,然后查看out目录下会有生成的class文件(java文件运行后才会有)
进行对比发现,class文件里默认就有一个person的方法,这就是构造器。
Alt+Insert
添加无参构造
添加有参构造
1)先创建一个Application类
2)再创建一个Person类
1 public class Person { 2 String name; 3 int age; 4 5 //无参构造,默认可以不写 6 public Person() { 7 //构造器用于初始化值 8 this.name = "rzd"; 9 } 10 11 //有参构造,当存在有参构造时,无参构造必须显式定义 12 //这里this.name中的name是上面的属性name 13 //而=右边的name是定义方法时()内的形参name 14 15 public Person(String name, int age) { 16 this.name = name; 17 this.age = age; 18 } 19 }
3)在main方法里实例化Person类,调用构造器
1 //构造器 2 public class Application { 3 public static void main(String[] args) { 4 Person person = new Person(); 5 Person person1 = new Person("rzd1", 5); 6 7 /*由于有参无参构造都存在,就相当于方法的重载 8 所以上面实例化Person类时,决定要调用哪一个构造器 9 是根据是否有传参来定的。 10 */ 11 12 System.out.println(person.name); 13 System.out.println(person1.name); 14 } 15 }
4.创建对象的内存分析
我们先写一个程序
在demo04包下新建Pet类
1 package com.rzd.oop.demo04; 2 //面向对象内存分析 3 public class Pet { 4 public String name; 5 public int age; 6 7 public void shout(){ 8 System.out.println(this.name+"叫了一声"); 9 } 10 }
再在demo04同级目录下新建Application类
1 package com.rzd.oop; 2 import com.rzd.oop.demo04.Pet; 3 4 public class Application { 5 public static void main(String[] args) { 6 Pet dog = new Pet(); 7 8 dog.name="旺财"; 9 dog.age=3; 10 dog.shout(); 11 System.out.println(dog.name); 12 System.out.println(dog.age); 13 } 14 }
此时debug运行这个程序,可以看到流程如下:
进入main方法--->new一个Pet类的dog对象--->进入Pet类,调用Pet类下的无参构造,生成name和age属性,此时属性的值为默认值--->给name和age复制“旺财”和3,调用shout方
以上流程,在内存中的流程如下:
5.小结
1)类与对象:类是一个模板,是抽象的;对象是类的一个具体实例,是具体的
2)方法:先定义、再调用
3)对象的引用
引用类型:除了8大基本类型(byte short int long float double char boolean ),其他都是引用类型。
对象是通过引用来操作的,栈--->堆
4)属性:又叫字段(Field)、成员变量
属性的定义:修饰符 属性类型 属性名=属性值
5)对象的创建和使用
new关键词创建对象,调用构造器
Person xiaoming=new Person();
xiaoming.name 调属性
xiaoming.sleep() 调方法