一. OOP中的基本概念

Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一个可运行的系统。Java的编程单位是类,对象最后要通过类进行实例化(即“创建”)。面向对象编程有三个特性:封装,继承,多态

封装:对类中的属性和方法的具体实现进行封装(隐藏),外界不可见
继承:继承父类中的属性和方法 extends
class 子类 extends 父类
都是单继承
多态:同一个领域中(继承同一个类或者实现同一个接口)的不同对象调用相同的方 法表现不同。

二. 封装

1.类和对象

类是具有相同属性和行为的对象的集合。对象是类的具体化,对象是唯一的。类是具有一组相同属性和行为的抽象化模板,类是对象的抽象。

对象是对问题领域中事件的抽象。对象具有以下特性:

  1. 万物皆为对象。问题领域中的实体和概念都可以抽象为对象。例如学生,成绩单、教师、课和教室。

  2. 每个对象都是惟一的。

  3. 对象具有属性和行为。

  4. 对象具有状态。状态是指某个瞬间对象的各个属性的取值。对象的某些行为会改变对象自身的状态,即属性的取值。

  5. 每个对象都是某个类的实例。小张和小王都属于学生类、中国和美国都属于国家类、中文和英文都属于语言类。

    同一个类的所有实例都有相同属性,但属性取值不一事实上相同,但是它们的状态不一定相同。

    例如:小张和小王都属于学生类,都有姓名、性别、年龄、身高和体重这些属性,但是他们的属性取值不同。同一个类的所有实例都有相同行为,意味着它们具有一些相同的功能。

类是一组具有相同属性和行为对象的模板。面向对象编程的主要任务就是定义对象模型中的各个类:

  1. 类是一种类型:是引用类型;
  2. 类是元数据:描述数据的数据,数据在面向对象领域里以对象的形式存在,类是对象共有属性和方法的抽象描述。

2. 定义方法形式

格式: 修饰符 返回类型 方法名(参数列表)异常抛出类型{方法体}

参数列表:传入数据

返回值类型:传出数据的类型没有返回值,必须写void

修饰符:访问修饰符public,private或者static,final。没有优先级

public int getValue(int value){
if(value>10){
return value+10;
}
}

2. 参数传递:实参传递给形参

形参:方法声明时的参数

实参:方法调用时传递的参数

1)值传递:传递的是数值

参数是基本数据类型的时候,采用值传递

2)地址传递:传递的是地址

参数是引用数据类型的时候,采用地址传递

3. this关键字: 当前对象

​ 1)区分实例变量和局部变量

​ this.name=name;

​ 2)调用本类的构造器

​ this(参数列表);

​ 3)调用本类的方法

​ this.方法名()

4. 数据隐藏

好处:防止外界进行非法修改

如何实现:1)数据的访问修饰符private

2)提供统一的操作(属性的set,get)

数据隐藏就是封装的一个方面,封装的另一个方面隐藏方法。

5. 方法重载

对于类的方法(包括从父类中继承的方法), 如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法。这种现象叫重载。

方法的重载满足的条件:

1)在同一个类中

2)方法名相同

3)参数列表不相同

a)参数个数不相同 ||

b)参数类型不相同 ||

c)参数列表的顺序不相同

4)返回值类型可以不同

5)访问修饰符可以不同

注意:在一个类中不允许定义两个方法名相同,并且参数签名也完全相同的方法。因为假如存在这样的两个方法,Java虚拟机在运行时就无法决定到底执行哪个方法。参数签名是指参数的类型、个数和顺序。

6. 创建和初始化对象(new)

public class Person{
private String name="briup";
}

Person p=new Person();

1)在栈区开辟空间保存对象的引用

2)在堆区开辟空间保存对象本身的数据

3)堆区的地址赋值给栈区的对象的引用

4)为对象的属性进行默认初始化(系统完成)

5)为对象的属性进行显示初始化

6)调用普通代码块{}

7)调用构造器

7. 构造方法

构造器:根据用户需求传入数据, 然后根据传入数据对属性进行初始化。

作用:为属性进行初始化

1)方法名和类名相同

2)没有返回值类型

3)构造的重载(根据不同的情况调用不同的构造器进行相应的初始化)调用本类的 构造器:this(参数列表),必须放在方法的第一行。

4)系统会提供一个无参的构造器,

但是如果本类实现了其他的构造器,系统提供的无参构造器失效。

public class Test{
public Test(){}
public void Test(){} //普通的方法
}

二:继承

好处:代码复用,简化编程

代码复用用在哪些地方:

1)复用父类的属性

2)复用父类的方法(直接调用父类的方法)

3)重写父类的方法

实现:class 子类 extends 父类

java是单继承,但也不是绝对的单继承,java中有接口,一个接口可以继承多个接口,一个类也可以实现多个接口,具体的内容会在接口那篇文章中说明。

关系:子类 is a 父类 或者 子类 is a like 父类

class Student extends Person
student is a Person
Person is a Student(error)

子类继承父类哪些:

1)构造器不能继承

2)方法和属性全部继承,private声明的可以继承,但子类不能使用,只有父类本身才能使用。

继承注意的问题:

1)创建一个子类对象必须先创建一个父类对象

2)子类的构造器会默认调用父类的无参构造器super();

3)父类的无参构造器失效,子类构造器就需要显式的调用父类存在的其他构造器super(参数列表);

4)当一个子类继承了一个父类后,父类中所有的字段和方法都被子类继承拥有,

子类可以任意的支配使用,每个子类对象中都拥有了父类中的所有字段。当构造一个子类的实例对象时,该对象的实例变量包括了子类本身以及父类中的所有实例变量,实例方法也包括了子类和父类中的所有实例方法。子类构造器用来初始化子类中所有的实例变量,而父类构造器super(实参)用来初始化父类中所有的实例变量。那么在堆中为子类实例对象分配的内存区域中包括了子类和父类中所有初始化后的实例变量。

5)在构造器不能同时出现this和super,并且this和super只能出现在构造器的第一行,否则会报错。

1. super代表父类对象,this代表当前对象

  1. 调用父类的属性(很少用),因为都是私有的,不能调用

    super.name=name;
  2. 调用父类的构造器

    super(参数列表);
  3. 调用父类的方法(子类中包含和父类相同的方法名)

    super.方法名(参数列表);

2. 方法的重写

条件:当父类的方法不能够满足子类方法的需求。

就可以对父类的方法进行重写

1)发生在子父类

2)方法名必须相同 &&

参数列表必须相同 &&

返回值类型必须相同

3)可见性(访问修饰符)不能变小

4)异常不能扩大

加上@Override让编译器来检查是否是一个重写方法

三:多态

概念:同一领域中的不同对象调用相同的方法表现不一样。

静态数据类型:变量申明时候的类型,编译时

动态数据类型:创建对象时的数据类型,运行时

对象真正的数据类型是动态数据类型决定的,运行时数据类型

实现多态必须满足什么条件:

1)子类必须重写父类中的方法

2)父类的引用指向子类的对象: 父类 变量 = new 子类();

Person p=new Student();

java学习笔记(基础篇)—面向对象编程之封装、继承、多态的更多相关文章

  1. java学习笔记-基础篇

    Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...

  2. Java学习笔记——基础篇

    Tips1:eclipse中会经常用到System.out.println方法,可以先输入syso,然后eclipse就会自动联想出这个语句了!! 学习笔记: *包.权限控制 1.包(package) ...

  3. java学习笔记(基础篇)—变量与表达式

    一:局部变量和实例变量 定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则. 作用域:指它的存在范围,只有在这个范围内,程序代码才能访问它. 变量的生 ...

  4. java学习笔记(基础篇)--java关键字与数据类型

    java关键字与数据类型 Java语言的关键字是程序代码中的特殊字符.包括: . 类和接口的声明--class, extends, implements, interface . 包引入和包声明--i ...

  5. java学习笔记(基础篇)—数组模拟实现栈

    栈的概念 先进后出策略(LIFO) 是一种基本数据结构 栈的分类有两种:1.静态栈(数组实现) 2.动态栈(链表实现) 栈的模型图如下: 需求分析 在编写代码之前,我习惯先对要实现的程序进行需求分析, ...

  6. java学习笔记(基础篇)—java数组

    一:什么是数组,什么时候使用数组? 数组是用来保存一组数据类型相同的元素的有序集合,数组中的每个数据称为元素.有序集合可以按照顺序或者下标取数组中的元素. 在Java中,数组也是Java对象.数组中的 ...

  7. java学习笔记(基础篇)—抽象与接口的区别

    抽象与接口的区别 一.抽象(abstract) 1. 抽象方法 1) 作用:定义规范 2) 抽象方法用来描述具有什么功能,但不提供实现. 3) 如果类中一个方法没有实现就要定义一个抽象方法. 2. 抽 ...

  8. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  9. Java 学习笔记提高篇

    Java笔记(提高篇)整理   主要内容: 面向对象 异常 数组 常用类 集合 IO流 线程 反射 Socket编程 1.  面向对象 1.1包 用来管理Java中的类, 类似文件夹管理文件一样. 因 ...

随机推荐

  1. 让Qt在MIPS Linux上运行 good

    下载 首先下载Qt everywhere,当前的版本是4.7.2,可以从nokia的网站上下载,也可以从git服务器上下载.考虑到文件有200M 以上的大小,下载速率低于25kBPS的,需要考虑从什么 ...

  2. Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)

    之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...

  3. Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)

    对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程.其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件 ...

  4. 云计算核心技术Docker的探索

    首先通过一个简单的场景来看一下为什么Docker这么火? 开发人员在开发的时候是有一套开发环境,包括运行的操作系统,依赖的服务比如WebLogic.Java,一些特定的配置,比如JVM大小.字符集,操 ...

  5. python中的函数名,闭包,迭代器

    一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...

  6. 生产环境MySQL优化

    a:硬件的优化: 1. 采用64位cpu,cpu至少4颗,L2缓存越大越好2. 内存要大,32-64G运行1-2个实例,96-128G运行3-4个实例3. 机械盘选用sas盘,转速15000以上,有可 ...

  7. Spring如何解决循环引用

    概念 什么是循环引用? 故名思义,多个对象形成环路. 有哪几种循环引用? 在Spring中存在如下几种循环引用,一一举例分析一下 注入循环引用(Set注入 注解注入) package c.q.m; i ...

  8. 你必须了解的java内存管理机制(三)-垃圾标记

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...

  9. Django多对多表的三种创建方式,MTV与MVC概念

    MTV与MVC MTV模型(django): M:模型层(models.py) T:templates V:views MVC模型: M:模型层(models.py) V:视图层(views.py) ...

  10. sails项目创建与常用基础操作总结

    1.全局安装: cnpm install -g sails 2.创建项目: sails new sails_shop ,选2 或者: sails new sails_shop --fast ,选2 c ...