狂神说--javase06--面向对象编程

面向对象编程OOP

OOP:java的核心思想,Object-oriented programming

OOD:面向对象设计

OOA:面向对象分析

面向对象这块的点

  • 面向对象是啥:理解思想
  • 类和对象的创建:重点理解创建时的内存分析
  • 面向对象三大特性:封装、继承、多态
  • 抽象类和接口
  • 内部类

面向对象是啥?

面向对象实际是和面向过程相对的,重点理解面向对象的思想。

面向对象的思想:思考问题首先会考虑解决这个问题需要哪些分类。(我在思考前端的入参的时候,目前也是采取面向对象的思想,会把前端的入参封装成几个类,就连查询相关的也是封装了类)

面向对象编程的本质以类的方式组织代码,以对象的方式组织数据

因此,我们说java其实还挺好入门的,因为基本我明确完需求,定义好所需的类,接下来就是用对象组织数据进行业务的开发了


啊,时隔一天我又回来了,本来计划今天拿出2小时学会习的,结果我发现我越看java越困。。。。。。。我还是学点别的吧,因为现在公司内部数据量较大,而作为一名合格的后端开发者,我还是需要会一点关于大数据的知识的。


时隔几天,我大概学习了一下大数据的知识,当然我掌握的也只是个皮毛哈。

大概学了一下大数据相关的知识:从数据单位、对大数据的了解,再到大数据仓库,再到Hadoop(HDFS/MapReduce),再到HIVE哈哈哈,也只能算是大数据入了个门哈。大数据这块其实还是对他有些自己的见解的。另外关于HIVE这里,其实也就是数据仓库下的类sql产物,利用HIVE可以建表、了解HIVE SQL等等,利用HIVE生成mapreduce任务从而获取hdfs数据

接下来,我要再去学习java的基础啦。基础很重要,还是要好好学的!


话不多说,接着学。

对象的创建和初始化(分配内存,内存中变量赋值)

对象的创建方式:new---分配内存的关键。

对象的初始化:通过构造方法完成对象的初始化,hahha,另外的话还有初始化块哦(静态初始化块、普通初始化块的加载时间不同哦,但是都是对对象的初始化工作做了一定的努力哦)

我们创建后类之后,我们创建对象。一个简单的new背后,我们要get到三个点:

  • new之后,会分配内存,在程序加载到这段的时候,由jvm虚拟机分配内存给对象
  • new的时候,会调用该类的构造方法
  • 如果调用的是隐式的构造方法,也会给对象的属性进行默认赋值(对象的初始化其实就是这个)

构造方法-对象初始化的关键

关于java的构造函数这里还是需要明确一下

  • 构造器的访问权限基本都是public ,若果构造器的访问权限为private,那么这个类是不可继承的
  • 构造方法定义时,没有返回值。但是实际执行构造方法后,返回的是这个类的对象。
  • 构造方法的方法名必须和类名相同

java文件和class文件的区别

最近又看了.java文件和.class文件。我们一直强调java源码经编译后生成java字节码,但是有没有关心过这两个文件的潜在关系呢。

其实我们可以写一个.java文件,然后编译,将生成的.class文件和源文件对比下,这个时候你会发现你的注解,包括一些隐式构造函数等等,编译器在编译源文件时还是帮助我们做了很多的。

创建对象时内存的分析

之前在学习数组的时候,我们对数组的创建进行了内存的分析。接下来,我们看看对象的创建内存是怎样的。

其实,分析这些底层的关键,并不是让我们死记硬背,而是说让我们理解高级语言在内存中跑的时候,计算机底层的原理大概是怎样的。

学习狂神老师,在讲解创建对象内存分析的时候,讲的真的挺好的。基本讲解了jvm开始执行java代码的整个过程的内存分析。

我们大概理解下:jvm装载主类至方法区,主类找到程序入口main(),此时main()方法被加载到栈内存。jvm装载Pet类至方法区,此时Pet类的静态的属性及方法被装载到静态方法区。

创建dog对象,会将dog引用变量加载到栈内存。创建的对象分配到堆内存。

狂神说--javase06--面向对象编程_第1张图片


面向对象基本理解之后,我们再来看看面向对象三大特征:封装、继承、多态

面向对象三大特征-----封装

封装,其实是面向对象设计理念中最容易理解的了。

封装:其实就是一种程序的设计思想(高内聚-低耦合)。对于封装,其实在代码上的表现就是属性私有,get set.

在实际工作后,你会大量的用到封装这个设计思想,很重要也很基础。

封装的好处:在实际工作之后实际你会对这个的好处有很多理解。实践出真知,这句话一点都不假。封装其实能够保护我们这个类,能够使类不对外暴露自己的属性,通过统一的接口方法进行编程,同时也便于类的维护。

面向对象三大特征-----继承

继承,继承也比较好理解。继承的本质实际是对类的抽象

继承

  • 关键字extends:子类对父类的扩展
  • 继承是类和类之间的关系
  • java中只有单继承,没有多继承
  • 子类继承父类,就会拥有父类的全部public/protected访问权限的方法
  • super的关键字,用于子类调用父类方法、属性时使用。super调用父类的构造器,必须在子类构造器的第一行
  • this关键字代表 本类调用,super关键字代表父类调用
  • 方法重写

在看继承这块的时候,我看到了一个很好的快捷键ctrl+H。这个快捷键真的爱了,直接能查到类之间的继承关系

在java中,所有的类的父级爸爸是Object类,没事可以大概研究下Object类。这个留这下次有时间在研究吧,补充一嘴:其实Object类里面有很多的native方法,是不是觉得越来越了解java的底层了,这么说吧java的底层还得是c、c++啊。。。。。

super

方法重写@Override

方法的重写,仅仅作用在非静态方法上.  子类继承父类,才存在重写。子类重写父类的方法,方法名&参数列表&修饰符范围可以扩大不可缩小

接口定义方法,实现类必须实现接口定义的方法。和方法的重写有很大区别哦。接口和抽象类都会在开发中用到,但是接口用到的更多哦。

面向对象三大特征-----多态

多态----方法的多态

  • 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
  • 同一个方法可以根据发送对象的不同而采用多种不同的行为方式
  • 多态存在的前提:有继承关系,子类重写父类方法,父类引用指向子类对象

static关键字详解

  • static可以修饰属性和方法。修饰属性:静态变量/类变量。修饰方法:静态方法/类方法
  • 被static修饰的属性或方法,是随着类的加载而加载的,因此生命周期长一些。另外:因为类方法和类属性的生命周期和普通方法、属性的生命周期略有差异,因此注意调用的合理性。
  • static这块就是注意一下调用的顺序即可。明确static是随着类的加载而加载的,因此代码的执行顺序需要熟悉。
  • 区分静态代码块和匿名代码块。静态代码块仅随着类的加载而加载一次,而匿名代码块是随着对象的创建而创建,而且是在构造方法之前执行。
  • 其实这些java特性不用特别关心,都是java的jvm执行机制而已。。。。。
  • 被final修饰的类不能被继承

狂神说--javase06--面向对象编程_第2张图片

再看一个比较好玩的东西,大家看看也可以这么用。当我们想引用类的静态方法时,可以直接引用方法。而不是引用类。

狂神说--javase06--面向对象编程_第3张图片

抽象类

我们看看抽象类吧

  • 抽象类:类用abstract修饰,抽象类中可有普通方法啊;但是抽象方法必须在抽象类中
  • 抽象方法:方法用abstract修饰
  • 子类继承extends抽象类,必须对抽象类中的抽象方法进行实现,但是类是单继承的,java的接口可以多继承
  • 抽象类不能new,思考一下抽象类有构造器嘛?有的。

接口

接口其实比抽象类在实际开发中更广泛使用,我们来看看接口吧

实际开发都是面向接口编程,定义好接口之后,我们在做实现类就ok了

我现在就是定义接口,然后在去写具体的实现类

  • 在实际开发中,一般都是使用接口而不是抽象类,因为类只能单继承,而接口可以多继承。
  • 接口和具体类、抽象类的区别:具体类--只有具体的实现方法     抽象类:具体的实现方法和规范(抽象方法)都有    接口:只有规范!!!!
  • 在实际的开发中,一般都是接口和具体类结合使用
  • 另外一般开发中都是先定义接口,在定义实现类
  • 另外接口中的方法默认都是 public abstract。因此可以直接定义方法名和返回值,不用加修饰符
  • 接口中的属性默认都是public static final,这个在开发中也挺常用的,如果你需要一系列的常量,你可以定义在接口中,使用这个常量的时候 import static 包名.类名.常量名即可。
  • 类实现接口:用implements关键字,另外类的命名可以接口名+Impl
  • 实现了接口的类必须实现接口中的方法
  • 用interface定义,接口中定义方法,实现类implements可以多继承接口
  • 接口不能被实例化,接口中没有构造方法

内部类

简单了解下内部类。内部类其实在实际开发中不太常用,了解就可。

内部类就是指在类的内部在定义类,内部类可以获取外部类的私有属性及方法

  • 普通内部类class(在类内声明)
  • 静态内部类 static class(在类内声明)
  • 局部内部类(在类内的方法中声明)
  • 匿名内部类(在类外声明,)

 

你可能感兴趣的:(Java)