狂神JAVASE系列-面向对象编程01
1. 面向过程 VS 面向对象?
面向过程编程:
讲究一手按部就班,解决问题思考的方式按照步骤,第一步做什么,第二步做什么,适合处理一些较为简单的问题。
面向对象编程(Object-Oriented Programming,OOP):
讲究分类的思维,解决问题首先需要思考的是需要用到哪些分类,然后对分类在进行单独的思考,最后对具体的分类下的细节在做面向过程的探索。适合处理较为复杂的问题,尤其是利于多人协作。
总而言之,面向对象和面向过程相辅相成,面向对象从宏观上把握,但是涉及到微观操作还是需要面向过程的思维方式。
==================================================================
什么是面向对象编程?
面向对象的编程的本质思想就是:以类的方式组织代码,以对象组织(封装)数据(好好体会本句)。
面向对象编程的三大特性:
类是抽象的,对象是具体的事物。例如:狗就是类,XX家的狗旺财就是一个对象。
2. 方法基础回顾
方法定义示例:
//main方法 public static void main(String[] args) { /* 下述为定义方法的这个语法(规范) 修饰符 返回值类型 方法名(参数列表){ //方法体 return 返回值; } */ } //return结束方法,返回一个结果 public String sayHello(){ return "sayHello"; } public void print(){ return; //没有返回值 直接return 或者不写 } public int max(int a,int b){ return a > b ? a : b;//三元运算符 }
关于方法调用的问题:
静态方法的调用
非静态方法调用:
分析:
静态方法,也就是带有static关键字的,例如上面示例,对于静态方法,可以直接通过类名.方法名的方式直接调用,例如Student.say(),而非静态方法就无法直接通过类名.方法名的方式调用,会报错。
那么非静态方法怎么去调用?
非静态方法:就需要将这个类首先先实例化,也就是new一个对象出来,然后在对象.方法名去调用。具体如下所示
================
public void a(){ b(); } public void b(){ }====================== public static void a(){ b(); } public static void b(){ }//前两个都是不会报错的,非静态去调用非静态 静态去调用静态=============================//为什么会报错?一个是静态方法,一个是非静态方法//static静态方法 是和类一起加载的 public static a(){ b(); //这样调用会报错 }//下面这个非静态方法,是需要类实例化之后才存在,也就是那一个存在的去调用不存在的显然是有问题 public void b(){ }
关于参数传递和引用传递
public class Demon03 { public static void main(String[] args) { //实际参数和形式参数的类型要对应int add = Demon03.add(1,2); //因为这个static是和类一起加载的,因此不用new直接就可以调用 System.out.println(add); } public static int add(int a,int b){ return a+b; }}
//值传递public class Demon04 { public static void main(String[] args) { int a = 1; System.out.println(a); //1 Demon04.change(a); System.out.println(a); //1 } public static void change(int a){ a = 10; }}
public static void main(String[] args) { Person person = new Person(); System.out.println(person.name); //null Demon05.change(person); System.out.println(person.name); //小君 } public static void change(Person person){ /* persom是一个对象,指向的-->Person person = new Person(); 这是一个具体的人,可以改变属性 */ person.name="小君"; }}//定义了一个Person类,有一个属性nameclass Person{ String name;}
思考为什么上述值传递就没有改变值?而引用传递就改变了?
3. 类与对象的创建
类和对象是什么关系?
- 类是一种抽象的数据类型,是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。
动物,植物等
Person类 Pet类 Car类
- 对象就是抽象概念的具体实例
李四?李四家里的狗子 旺财就是一个具体实例
如何创建和初始化对象
- 使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象,进行默认的初始化以及对类中构造器的调用。
- 类中的构造器,其实就是构造方法,是在进行创建对象的时候必须要调用的。并且构造器有两个特点.(构造器相当重要)
- 1:必须和类名相同
- 2:必须没有返回类型,也不能写void
4. 构造器(构造方法)详解
java文件经过编译会生产class文件(字节码),对比Person.java 和这个Person.class文件可知,在new对象的时候,默认帮我们加了一个方法。且这个方法没有返回值,其方法名和类名是相同的。
由此可得出:
一个类即使什么都不写,也会存在一个方法(构造器)
显示的定义构造器 可以初始化一些值
构造器走完了之后,才生成对象。
构造器核心的作用就两个:
1:使用new关键字,必须要有构造器。(默认是无参构造)也就是new一个对象,本质是在调用构造器,
2:用来初始化值
报错信息如下:
定义了有参构造之后,无参构造就显式空在那里即可。
如上图所示:在new对象的时候传递参数之后,它自动就调用有参构造了,也就是会根据参数去判断,为什么?---------------------------------方法重载。(理解方法重载即可明白此处含义)
一个快捷键:alt+insert 一键生成构造器的快捷键
默认是生产一个有参构造器,
如果是生成无参构造器,点击红色标注框即可。
构造器 总结:
1:和类名相同
2:没有返回值
作用:
1:new 本质是在调用构造方法
2:初始化对象的值
注意点:定义有参构造之后,如果想使用无参构造,必须显式的定义一个无参构造,否则就会报错找不到。
5. 创建对象内存分析
6. 总结