面向对象概念

  所有操作基于对象进行操作实现

面向对象的三大特征

  封装、继承、多态

类:具有相同特征和行为物体的统称

在java中类的定义语法:

[修饰符]   class   类名{

  属性;

  方法;

}

属性和方法称为成员、分别是成员属性和成员方法

类的使用:

1.创建对象

结合关键字new, new 对象名(参数列表);

2.调用它的方法和属性

对象名.属性

对象名.方法(参数列表)

对象创建的详细过程:

class Person{
private String name;
private int age; public Person{
this.name=name;
this.age=age;
}
{
age=20;
}
}
class Main{
public static void main(String[] args){
Person person=new Person("XXX",18);
}
}

对象的具体创建过程:

1.在堆中开辟内存空间,JVM对象进行静态初始化,就是给各个属性赋予默认值

整数(byte、short、int、long):0

小数(double、float):0.0

字符(char):0/' '

布尔值(boolean):false

2.JVM对对象进行动态初始化,就是执行< init >()方法,注意:IDEA 2018版本才显示< init >()方法,其他版本不显示



< init >()方法组成:成员属性的赋值语句和构造代码块从上往下组成

例如:{

age=20;

}



3.构造方法初始化:利用构造方法对属性进行赋值

this:

出现的位置:出现在本类的构造方法中/成员方法中

作用:

1、表示当前对象,谁调用该方法,this就指代谁

2、可以调用本类中的构造方法,减少代码重复

局部变量和成员变量的区别:

1.作用域:方法中可以直接使用成员变量(成员变量作用范围整个类,局部变量只能在方法中访问)

2.内存分配:成员变量在堆中分配内存,局部变量在栈中分配内存

3.成员变量:直接定义在类中 局部变量:定义在方法中,包括方法参数

4.生命周期:局部变量在方法执行完成就销毁,成员变量根这个对象的销毁而销毁

5.有无默认值:JVM不会给局部变量赋予默认值,JVM会给成员变量赋予默认值

如果一个类中局部变量和成员变量同名,优先访问局部变量,可以用this区分局部变量和成员变量

封装的含义:定义类的过程

继承:

为什么要有继承?

正面角度:拓展父类

反面角度:将子类中相同的代码抽象到父类中,提高代码的复用性,减少重复代码

继承语法:

    public class 子类名 extends 父类名{

    }

方法的重写:

子类重写父类中的方法,除了方法体重写之外,其他的和父类定义的一样

方法的重载:

在同一个类中,方法名相同,参数列表不同(类型,顺序,个数),和返回值相同

super:

1、可以在子类的构造方法中调用父类的构造方法,通过super调用父类中的构造方法

必须放在子类构造方法中的第一行,如果子类构造方法没有调用父类的构造方法,默认调用无参构造

2、调用父类的构造方法给父类中定义的属性赋值,或调用父类中的属性和方法

修饰符:

访问修饰符、static修饰符、final修饰符

访问修饰符的作用:控制被修饰的内容(类、类的成员)在其他类中的访问情况,具体参考baidu

一般结论:属性使用private,方法使用public

在开发中,我们需要给类中每个属性提供一个getter获取方法和setter修改方法

访问修饰符:public protected default private

static修饰符作用:控制被修饰的内容的加载时机

static修饰的成员就变为静态成员,而且静态成员不在属于单个对象,而是属于类

直接可以通过类名.属性/方法名直接调用

类的加载过程:

JAVA中的类都是懒加载,需要用的时候才去加载

具体过程:

1、JVM将class加载到方法区(元空间)

2、JVM对类进行静态初始化:给静态属性在方法区中的常量池开辟空间

3、JVM对类进行动态初始化:执行< cinit >()方法

< cinit >()方法组成:静态属性的赋值语句+静态代码块从上到下依次组成

类的初始化小细节:

如果父类没有初始化,首先加载父类的.class文件

然后再初始化本类

final修饰符:

final修饰类:类不可被继承

final修饰方法:方法不可被重写

final修饰变量:变量变常量

修饰成员变量,成员变量要再对象初始化阶段或构造方法中完成赋值

修饰静态变量:静态变量必须在类的初始化阶段完成赋值

抽象类:

抽象方法的定义语法:

        public abstract class ClassName{
public abstract 返回值类型 方法名(参数列表); }

抽象可以含有抽象方法,但不能被实例化

一般的普通类不可以含有抽象方法,但含有抽象方法的一定是抽象类

抽象类的构造方法作用:

给子类对象在初始化的时候给父类中定义的属性赋值

接口:比抽象类更加抽象,在接口中只能含有抽象方法(接口中方法的访问修饰符默认是public abstract)和常量

定义语法:

[访问修饰符] interface InterfaceName{
public static final 数据类型 常量名=值;
public abstract 返回值类型 方法名(参数列表);
}

使用接口:

class ClassName implement InterfaceName{
重写接口中的方法
}

多态:

向上转型和向下转型

向上转型:父类类型/接口类型 对象名=子类类型的对象/子类类型对象的引用

父类引用指向子类的对象

通过对象名只能调用父类/接口中定义的方法,编译看左边,运行看右边

class Person{
String name; public void info(){ }
} class Chinese extends Person{
@override
public void info(){ }
} class Main{
public static void main(String[] args){
Person chinese=new Chinese();多态
}
}

向下转型:

语法格式:子类类型 对象名=(子类类型)new 父类类型();

在编译的时候,始终是正确的

但在运行的时候,需要检测有边对象的真正类型,只有类型和声名类型一样才能强转成功

例:

class Animal{

    class Cat{

    }
class Dog{ }
class Main{
public static void main(String[] args){
Animal animal=new Animal();
Cat cat=(Cat)animal;
Dog dog=(Dog)animal;//错误 Animal01 animal01=new Dog();
Dog dog=(Dog)animal01;//正确
}
}

补充:

instanceof:

A instanceof B: 判断对象A是否是B类或B的子类的实例化对象

getClass()方法,获取当前对象的类型

JAVA面向对象详细总结的更多相关文章

  1. java面向对象详细全面介绍

    一.面向对象 1.面向过程与面向对象 POP与OOP都是一种思想,面向对象是相对于面向过程而言的.面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做.面向对象,将功能封装进对象,强调具备了功能的 ...

  2. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  3. 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符

    [重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符   1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...

  4. Java——面向对象基础

    Java继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类具有父类的各种属性和方法,或子类从父类继承方法,使得子类具 ...

  5. Java面向对象(二、继承)

    Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...

  6. java面向对象总结(二)

    Java 封装 实现Java封装的步骤 java面向对象值继承 概念: 继承的格式: 类和类之间的关系: 继承的特点: 继承的优缺点 继承的好处: 继承的缺点: 继承的注意事项: 使用继承的步骤: J ...

  7. 2018-2019-2 20175202实验二《Java面向对象程序设计》实验报告

    2018-2019-2 20175202实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初 ...

  8. Java面向对象课程设计——购物车

    Java面向对象课程设计——购物车 小组成员:余景胜.刘格铭.陈国雄.达瓦次仁 一.前期调查 流程 客人(Buyer)先在商城(Mall)中浏览商品(Commidity),将浏览的商品加入购物车(Sh ...

  9. 2017-2018-2 20165318 实验二《Java面向对象程序设计》实验报告

    2017-2018-2 20165318 实验二<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄  ...

随机推荐

  1. Windows核心编程 第十四章 虚拟内存

    第1 4章 虚 拟 内 存 <这一章没啥,是说的几个内存相关的函数 > 14.1 系统信息 许多操作系统的值是根据主机而定的,比如页面的大小,分配粒度的大小等.这些值决不应该用硬编码的形式 ...

  2. 音视频开发:为什么推荐使用Jetpack CameraX?

    我们的生活已经越来越离不开相机,从自拍到直播,扫码再到VR等等.相机的优劣自然就成为了厂商竞相追逐的赛场.对于app开发者来说,如何快速驱动相机,提供优秀的拍摄体验,优化相机的使用功耗,是一直以来追求 ...

  3. (CV学习笔记)梯度下降优化算法

    梯度下降法 梯度下降法是训练神经网络最常用的优化算法 梯度下降法(Gradient descent)是一个 ==一阶最优化算法== ,通常也称为最速下降法.要使用梯度下降法找到一个函数的 ==局部最小 ...

  4. idea设置js为ES6

  5. GitBash管理代码

    一.Git是什么? Git是目前世界上最先进的分布式版本控制系统. 1.Git和SVN的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中 ...

  6. Redis数据结构—跳跃表

    目录 Redis数据结构-跳跃表 跳跃表产生的背景 跳跃表的结构 利用跳跃表查询有序链表 Redis跳跃表图示 Redis跳跃表数据结构 小结 Redis数据结构-跳跃表 大家好,我是白泽,最近学校有 ...

  7. [bug] sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1054, "Unknown column 'recevie_name' in 'field list'")

    Python Flask 开发购物网站,提交订单时报错 根据提示,检查代码,发现是字段名拼写错误导致,数据库对应的字段是receive_name,误写成了recevie_name 另外要注意,灰色字和 ...

  8. 每天一个linux命令(49):at命令   atrm删除作业,由作业号标识。

    atq命令 例如:从现在起三天后的下午四点运行作业at 4pm + 3 days:在July 31上午十点运行作业at 10am July 31:明天上午一点运行作业at 1am tomorrow. ...

  9. 使用nmcli命令配置网络

    !!!前言 nmcli是redhat7或者centos7之后的命令该命令可以完成网卡上所有的配置工作,并且可以写入配置文件,永久生效 1.NetworkManager NetworkManager是管 ...

  10. linux进程间通信-(转自 临水)

    一.进程间通信概述进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别 ...