前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >-1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态

-1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态

作者头像
noteless
发布2018-09-11 11:10:58
6890
发布2018-09-11 11:10:58
举报
文章被收录于专栏:noteless

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()

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档