java是纯粹的面向对象的语言

也就是万事万物皆是对象

程序是对象的集合,他们通过发送消息来相互通信

每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象

每个对象都有它的类型  也就是类

某一特定类型的所有对象都可以接收相同的消息,因为同一类事物有共同的特性


面向对象开发

•就是不断的创建对象,使用对象,指挥对象做事情。

面向对象设计

•其实就是在管理和维护对象之间的关系。


面向对象特征

封装(encapsulation)

继承(inheritance)

多态(polymorphism)

现实应用场景终归是要解决问题,面向过程的语言,是一个方法伴随着另一个方法的调用

随着应用规模的不断变大,显然软件代码管理变得更加困难

面向对象把功能逻辑封装到类本身,用对象去调用功能 持有数据,结构更加自然,也更符合人们的思维习惯

也就是说java中类 和对象 是划分逻辑功能的具体单位

面向对象的语言中,都会有类这个概念,一类事物他们有共同的属性和行为

java中描述事物通过类的形式体现,类是具体事物的抽象,概念上的定义。

对象即是该类事物实实在在存在的个体。

类:是一组相关的属性和行为的集合

对象:是该类事物的具体体现

成员变量与局部变量

在类中的位置不同

  •成员变量 类中方法外

  •局部变量 方法内或者方法声明上

在内存中的位置不同

  •成员变量 堆内存

  •局部变量 栈内存

生命周期不同

  •成员变量 随着对象的存在而存在,随着对象的消失而消失

  •局部变量 随着方法的调用而存在,随着方法的调用完毕而消失

初始化值不同

  •成员变量 有默认的初始化值

  •局部变量 没有默认的初始化值,必须先定义,赋值,才能使用。

this:代表所在类的对象引用

记住:

•方法被哪个对象调用,this就代表那个对象

什么时候使用this呢?

•局部变量隐藏成员变量

static关键字

可以修饰成员变量和成员方法

static关键字特点

  •随着类的加载而加载

  •优先于对象存在

  •被类的所有对象共享

  •这也是我们判断是否使用静态关键字的条件

  •可以通过类名调用

static关键字注意事项

  •在静态方法中是没有this关键字的

  •静态方法只能访问静态的成员变量和静态的成员方法

静态变量与成员变量

所属不同

  •静态变量属于类,所以也称为为类变量

  •成员变量属于对象,所以也称为实例变量(对象变量)

内存中位置不同

  •静态变量存储于方法区的静态区

  •成员变量存储于堆内存

内存出现时间不同

  •静态变量随着类的加载而加载,随着类的消失而消失

  •成员变量随着对象的创建而存在,随着对象的消失而消失

调用不同

  •静态变量可以通过类名调用,也可以通过对象调用

  •成员变量只能通过对象名调用

匿名对象

匿名对象:就是没有名字的对象。

  •是对象的一种简化表示形式

匿名对象的两种使用情况

  •对象调用方法仅仅一次的时候

  •作为实际参数传递

值传递

java中全部都是值传递   引用类型传递的也是值  只不过是地址

初始化过程

Student s = new Student();在内存中做了哪些事情?

  •加载Student.class文件进内存

  •在栈内存为s开辟空间

  •在堆内存为学生对象开辟空间

  •对学生对象的成员变量进行默认初始化

  •对学生对象的成员变量进行显示初始化

  •通过构造方法对学生对象的成员变量赋值

  •学生对象初始化完毕,把对象地址赋值给s变量

封装

封装概述

  •是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处:

  •隐藏实现细节,提供公共的访问方式

  •提高了代码的复用性

  •提高安全性。

封装原则:

  •将不需要对外提供的内容都隐藏起来。

  •把属性隐藏,提供公共方法对其访问。

构造方法

特点:

1.函数名与类名相同

2.不用定义返回值类型

3.没有具体的返回值。

作用:

给对象进行初始化。

注意:

1.默认构造函数的特点,如果自建将会失去默认,需要的话必须显式

2.多个构造函数是以重载的形式存在的。

代码块

  •在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。

•局部代码块

  •在方法中出现;限定变量生命周期,及早释放,提高内存利用率

•构造代码块

  •在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行

•静态代码块 在类中方法外出现,加了static修饰

  •在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且值执行一次。

执行顺序   静态代码块 > 构造代码块 > 构造方法

private关键字

(1)私有的意义,可以修饰成员变量和成员方法

(2)特点:

被private修饰的后的成员只能在本类中被访问

(3)private的应用:

以后再写一个类的时候:

把所有的成员变量给private了

提供对应的getXxx()/setXxx()方法

继承

多个类中存在相同属性和行为时,

将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

多个类可以称为子类,单独这个类称为父类或者超类。

子类可以直接访问父类中的非私有的属性和行为。

通过extends 关键字让类与类之间产生继承关系。

  •class SubDemo extendsDemo{}

继承的出现提高了代码的复用性。

继承的出现让类与类之间产生了关系,提供了多态的前提。

 

Java只支持单继承,不支持多继承。

  •一个类只能有一个父类,不可以有多个父类。

  •class SubDemo extends Demo{} //ok

  •class SubDemo extends Demo1,Demo2...//error

Java支持多层继承(继承体系)

  •class A{}

  •class B extends A{}

  •class C extends B{}

定义继承需要注意:

  •不要仅为了获取其他类中某个功能而去继承

继承缺点:

1,让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。

原则:低耦合,高内聚。

耦合:类与类的关系

内聚:自己完成某件事情的能力

2.打破了封装性

super

this代表本类对象的引用

•类与类之间要有所属( " is a " )关系,xx1是xx2的一种。

super代表父类的内存空间的标识。

当子父类出现同名成员时,可以用super进行区分

子类要调用父类构造函数时,可以使用super语句。

方法覆盖 override

子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。

父类中的私有方法不可以被覆盖。

在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。

覆盖注意事项:

  •覆盖时,子类方法权限一定要大于等于父类方法权限

  •静态只能覆盖静态。

覆盖的应用:

  •当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,

  这样,即沿袭了父类的功能,又定义了子类特有的内容。

子类实例化过程

子类中所有的构造函数默认都会访问父类中空参数的构造函数

因为每一个构造函数的第一行都有一条默认的语句super();

子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。

当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。

final关键字

final可以修饰类,方法,变量。

final修饰的类不可以被继承。

final修饰的方法不可以被覆盖。

final修饰的变量是一个常量。只能被赋值一次。

内部类只能访问被final修饰的局部变量。

1,变量

a:基本类型 值不能发生改变

b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的

2,初始化时机

a:只能初始化一次。

b:常见的给值方式

定义的时候。(推荐)

构造方法中。

抽象类

抽象定义:

  •抽象就是从多个事物中将共性的,本质的内容抽取出来。

抽象类:

  •Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,

包含抽象方法的类就是抽象类。

抽象方法的由来:

•多个对象都具备相同的功能,但是功能具体内容有所不同

那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。

抽象类和抽象方法必须用abstract关键字来修饰。

抽象方法只有方法声明,没有方法体,定义在抽象类中。

•格式:修饰符 abstract 返回值类型 函数名(参数列表) ;

抽象类不可以被实例化,也就是不可以用new创建对象。原因如下:

  •抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。

  •而且抽象类即使创建了对象,调用抽象方法也没有意义。

抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。

接口

格式:

  interface {}

接口中的成员修饰符是固定的。

  •成员常量:public static final

  •成员函数:public abstract

  •接口中的成员都是public的。

没有构造方法

接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。

接口是对外暴露的规则。

接口是程序的功能扩展。

接口的出现降低耦合性。

接口可以用来多实现。

类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。

接口与接口之间可以有继承关系。

•类实现接口用implements表示

•格式:

  class 类名 implements 接口名 {}

•接口不能实例化 那么,接口如何实例化呢?

  按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。

•接口的子类 要么是抽象类   要么重写接口中的所有抽象方法

 

类与类,类与接口以及接口与接口的关系

类与类

•继承关系,只能单继承,但是可以多层继承

类与接口

•实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口

接口与接口

•继承关系,可以单继承,也可以多继承

 

多态

某一类事物的多种存在形态

程序中体现:

  父类或者接口的引用指向或者接收自己的子类对象。

好处和作用:

  多态的存在提高了程序的扩展性和后期可维护性

前提:

  •需要存在继承或者实现关系

  •要有覆盖操作

  •有父类或者父接口引用指向子类对象。

对类文件进行分类管理。

给类提供多层命名空间。

写在程序文件的第一行。

类名的全称的是 包名.类名

包也是一种封装形式。

定义包的格式

  •package 包名;

  •多级包用.分开即可

注意事项:

  •package语句必须是程序的第一条可执行的代码

  •package语句在一个java文件中只能有一个

  •如果没有package,默认表示无包名

类:

  •默认default,public,final,abstract

  •我们自己定义:public居多

成员变量:

  •四种权限修饰符均可,final,static

  •我们自己定义:private居多

构造方法:

  •四种权限修饰符均可,其他不可

  •我们自己定义:public 居多

成员方法:

  •四种权限修饰符均可,fianl,static,abstract

  •我们自己定义:public居多

 

 

import

简化类名。

一个程序文件中只有一个package,可以有多个import。

用来导包中的类,不导入包中的包。

内部类

将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。

访问特点:

  •内部类可以直接访问外部类中的成员,包括私有成员。

  •而外部类要访问内部类中的成员必须要建立内部类的对象。

成员内部类 局部内部类

内部类定义在成员位置上

•可以被private static成员修饰符修饰。

•被static修饰的内部类只能访问外部类中的静态成员。

成员内部类不是静态的:

        外部类名.内部类名 对象名 = 外部类名.new 内部类名();

成员内部类是静态的:

        外部类名.内部类名 对象名 = new 外部类名.内部类名();

内部类定义在局部位置上

•也可以直接访问外部类中的成员。

•同时可以访问所在局部中的局部变量,但必须是被final修饰的。

内部类访问外部类属性 外部类名称.this.属性名

匿名内部类

就是内部类的简化写法。

前提:

  •内部类可以继承或实现一个外部类或者接口。

格式为:

  •new外部类名或者接口名(){

      覆盖类或者接口中的代码,(也可以自定义内容。)

  }

简单理解:

  •就是建立一个带内容的外部的类或者接口的子类匿名对象。

Object类

(1)Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。

(2)Object类的构造方法有一个,并且是无参构造

这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造

(3)要掌握的方法:

toString()

返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示。

这个表示其实是没有实际意义的,一般子类都会重写该方法。

equals()

比较两个对象是否相同。默认情况下,比较的是地址值是否相同。

而比较地址值是没有意义的,所以,一般子类也会重写该方法。

(4)要了解的方法:

hashCode() 返回对象的哈希值。不是实际地址值,可以理解为地址值。

getClass() 返回对象的字节码文件对象

finalize() 用于垃圾回收,在不确定的时间

clone() 可以实现对象的克隆,包括成员变量的数据复制,但是它和两个引用指向同一个对象是有区别的。

(5)两个注意问题;

直接输出一个对象名称,其实默认调用了该对象的toString()方法。

==和equals()的区别?

==

基本类型:比较的是值是否相同

引用类型:比较的是地址值是否相同

equals()

只能比较引用类型。默认情况下,比较的是地址值是否相同。

但是,我们可以根据自己的需要重写该方法。

-1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal的更多相关文章

  1. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  2. Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员、局部),匿名对象的调用,构造代码块(5)

    Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员.局部),匿名对象的帝爱用,构造代码块(5)

  3. java面向对象的三大特性——继承

    ul,ol { margin: 0; list-style: none; padding: 0 } a { text-decoration: none; color: inherit } * { ma ...

  4. PHP面向对象 实例化 构造函数 封装 继承 静态

    PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...

  5. 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装

    抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...

  6. JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

    JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...

  7. JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.面向对象的特性之:多态性 多态性的理解:事物的多种形态 1.1 广义上多态性的体现:①方法的重写,重 ...

  8. java 对象初始化和代码块初始化顺序

    class A { public A(){ System.out.println("测试!!!!!!!!!!!"); } } class Demo19 extends A { { ...

  9. java学习(四)static静态变量 和this

    java中的this /* this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 注意:谁调用这个方法,在该方法内部的this就代表谁. this的场景: 解决局部变量隐藏成员变量 */ ...

随机推荐

  1. 20181115 python-第一章学习小结part3

    第一章,基本数据类型-------仅学三种,字符型,数字型,布尔型 仅学三种数据类型: 字符型,加了引号的都可以被认为是字符串,字符串可以拼接 数字型,int,float,long三种,可以进行运算 ...

  2. 了解vue APi

    阳光那么好,何必自寻烦恼,过好每一个当下,一万个美丽的未来抵不过一个温暖的现在. 一.Vue.nextTick(): 该api 是在Dom节点更新结束之后执行的一个延时回调.在修改数据之后,立即使用这 ...

  3. Spring Security 整合freemaker 实现简单登录和角色控制

    Spring Security 整合freemaker 实现简单登录和角色控制     写这篇文章是因为我做了一个电商网站项目,近期刚加上权限控制.整个过程很简单,在此给大家梳理一下,也算是自己对知识 ...

  4. Mybatis Mapper文件中的一小坑

    前几天来一需求,实现过程中需要修改一个底层的查询接口,具体修改就是在where中添加一个条件,由于这个底层SQL使用的地方太多,所以就想着是用if加一标识符做个判断,传一个只有我会使用的参数,然后动态 ...

  5. jenkins配置演示

    构建代码的几个名词: make:linux或者windows最原始的编译工具,在Linux下编译程序常用make,windows下对应的工具为nmake.它负责组织构建的过程,负责指挥编译器如何编译, ...

  6. 对象池----unity中应用

    对象池应用在unity中能减少资源消耗,节省内存空间具体原理不再赘述. 以下是他的操作步骤:(注意:对象池中应用到了栈或对队列!) 1).先建立一个(怪物)物体   mMonster; 2).再建立一 ...

  7. 判断二叉树是否BST

    一.问题: 请实现一个函数,检查一棵二叉树是否为二叉查找树.给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树. 二.思路: 解法一:从根节点开始遍历二叉树, ...

  8. PHP算法之冒泡排序

    //冒泡排序 //①思路,先比较出第一次,找一个最大的值,排到最后; //②重复count遍之后,就能得到排序; //③优化,每一次循环之后不需要再次全部重复; $array = [11,5,4,58 ...

  9. 当使用vue的按键修饰符不起效果的时候怎么办?如@keyup.enter = '' ;

    这个问题困扰了我一个多小时,各种测bug !始终测不出来! 直接上代码(错误示范) <el-form-item prop="password"> <el-inpu ...

  10. Netty(三) 什么是 TCP 拆、粘包?如何解决?

    前言 记得前段时间我们生产上的一个网关出现了故障. 这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信. 但这个请求并不是常见的 HTTP ,而是利用 Netty 自定义的协议. 有个 ...