面向对象的特征

封装、继承、多态、(有人问第四个特征,再加抽象)

封装

体现形式(2种)

函数---提高代码的复用性

属性的私有化---将属性设置为私有的,通过提供对外的访问方法来间接操作对应属性,可以在方法内对属性做一系列的限定使之符合要求---提高了代码的安全性

private 默认 protected public

1         2.5        3           4

本类    子类  同包类   其他类

权限修饰符

本类

子类

同包类

其他类

public

可以

可以

可以

可以

protected

可以

可以

可以

不行

private

可以

不行

不行

不行

默认

可以

同包子类可以

可以

不行

继承

对一些类中共有的属性和方法进行提取,提取出来一个新的类,通过extends关键字是新的类和原来的来产生联系,这种联系称之为继承。新的类称之为父类(超类、基类),原来的类称之为子类(派生类)

注意:Java中支持的是单继承---一个子类只能有一个父类,而一个父类可以有多个子类

class A {

public int m(){return ;}

}

class B {

public String m(){return “aaa”;}

}

class C extends A, B {}

C c = new C();

c.m();---返回值类型是什么?

优点

1. 提高安全性

2. 提高复用性

3. 统一结构

super关键字

在创建子类对象的时候,会先创建一个父类对象,而这个父类对象在子类中以super关键字的形式存在。super是父类对象的引用,可以认为是父类产生的一个虚拟对象

如果一个构造函数中已经存在了this语句,那么此时不能写super语句,此时如何创建父类对象?---this语句的作用?

子类的每个构造函数中都直接或者间接地有一个super语句---对

如果父类只提供了含参构造,子类的构造函数还能使用默认的super语句吗?---不能

可以通过this来调用父类中的方法或者属性吗?---可以。会先检查当前类中是否有对应属性,如果没有则再检查父类。

重写

在父子类中,存在了方法签名完全一致的方法,称之为函数的重写/覆盖

注意:重写遵守的五个原则:两等两小一大

1. 方法签名一致

2. 当父类中的方法的返回值类型是基本数据类型/void/最终类,子类重写方法的返回值类型必须一致

3. 当父类中的方法的返回值类型是引用数据类型的时候,子类方法的返回值类型要么和父类方法的返回值类型一致,或者子类方法的返回值类型是父类方法的返回值类型的子类

class A{

public Pet m(){}

}

class B extends A {

public Dog m(){};

}

4.子类方法的权限修饰符的范围要大于等于父类方法中权限修饰符的范围

多态

体现形式

编译时多态---重载

运行时多态---向上造型,重写---继承是运行时多态的前提

注意:用向上造型创建对象的时候,用父类声明,用子类创建;父类在声明的时候就相当于给了这个对象一份提纲;子类创建对象的时候是告诉这个对象该怎么干---能不能用看父类,具体执行看子类

重写的理解

1. 方法签名完全一致

2. 子类重写的方法的权限修饰符要大于等于父类

class A{

public void m(){}

}

class B extends A{

protected void m(){}

}

A a = new B();

a.m(); //a对象用A类来声明的,同时告诉a对象身上有一个公共的m方法,可以在任何地方使用;

在使用方法的时候需要看具体子类,这时候,子类中重写的这个方法告诉a不能在其他类中使用---这时候产生了冲突

3. 当父类中的方法的返回值类型是基本数据类型/void/最终类,子类重写方法的返回值类型必须一致

注意:八种基本数据类型之间是相互平等的,不存在继承关系

4. 当父类中的方法的返回值类型是引用数据类型的时候,子类方法的返回值类型要么和父类方法的返回值类型一致,或者子类方法的返回值类型是父类方法的返回值类型的子类

class A {

public void m(){}

}

class B extends A {

public void m(){}

public void mb(){}

}

class C {

public B mc(){return new B();}

}

class D extends C {

public A mc(){return new A();}

}

C c = new D();

c.mc().mb(); //声明c对象用的是C类,告诉了c对象身上有一个mc方法,并且返回值类型是B类,所以调用mc方法的时候可以用一个B类对象来接住结果,可以再次调用B类独显身上的mb方法;
实现用的是D类,具体执行mc方法的时候调用的是D类中的mc方法,D类中mc方法的返回值类型是A类,所以可以定义一个A类对象来接住方法执行后的结果,A身上有mb方法吗?---产生冲突

多态的产生是为了解耦

static

可以修饰变量、方法、代码块、内部类

类变量

static修饰变量,这个变量称之为成员变量或者类变量。静态变量随着类的加载而加载到方法区中的静态区,并且在静态区中被赋予初始值。由于静态变量是先于对象而存在的,可以通过对象来调用,也可以通过类名来调用,一般是通过类名来调用。由于该类创建的所有对象存储的是静态属性在静态区中的地址值,所以静态属性是被所有对象所共享的。---静态属性尽量少用

Java面向对象的特征的更多相关文章

  1. Java——面向对象的特征三:多态性

    2.5面向对象的特征三:多态性 2.5.1 关于java语言中的向上转型和向下转型 ①向上转型(upcasting) :  子--->父(自动类型转换) ②向下转型(downcasting) : ...

  2. Java——面向对象的特征二:继承性

    2.1面向对象的特征二:继承性 ①引入类继承最基本的作用是:代码重用. ②语法 [修饰符列表] class 子类名 extends 父类名{ 类体; } ③子类继承父类以后,父类中声明的属性.方法,子 ...

  3. Java面向对象的特征一:封装性

    1.4 面向对象的特征一:封装性 当创建了类的对象以后,如果直接通过"对象.属性"的方式对相应的对象属性赋值的话,可能会出现不满足实际情况的意外,我们考虑不让对象来直接作用属性,而 ...

  4. 封装继承多态-java面向对象三大特征

    第七章  封装和继承 一.面向对象的三大特征 封装.继承.多态 二.封装 将类的属性(字段)设置为私有的(private),并添加getter/setter方法操作属性. 注意:get|set方法的固 ...

  5. Java面向对象和特征

    面向对象: 概念: 面向对象是一种程序设计思想,计算机程序的设计实质上就是将现实中的一些事物的特征抽离出来描述成一些计算机事件的过程,这种抽象的过程中,我们把具体的事物封装成一个一个的整体进行描述,使 ...

  6. Java面向对象三大特征

    封装: 首先,属性可用来描述同一类事物的特征, 行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用.比如人这个东东,可用下面的方式封装:人{ 年龄 ...

  7. Java面向对象的特征与含义

    面向对象的主要特征包括抽象.继承.封装和多态. 抽象 把一个类对象的共同特征总结出来,构造新类的过程. 继承 从已有类中得到继承信息,创建新类的过程. 封装 把数据和对数据的操作绑定起来,对数据的访问 ...

  8. Java 面向对象三大特征之一: 多态

    多态与类型转换 子类重写父类方法 1)位置:子类和父类中有同名的方法 2)方法名相同,返回类型和修饰符相同,参数列表相同       方法体不同 多态的优势和应用场合 多态:同一个引用类型,使用不同的 ...

  9. 简述Java面向对象三大特征:封装、继承、多态

    封装: 把对象的全部属性和服务结合在一起,形成不可分割的独立单位: 尽可能隐藏内部细节.(数据隐藏.隐藏具体实现的细节)     public.private.protected.default pu ...

随机推荐

  1. VUE父子组件传值问题

    一.父组件向子组件传递数据 组件实例的作用域是孤立的.这意味着不能(也不应该)在子组件的模板内直接引用父组件的数据.要让子组件使用父组件的数据,我们需要通过子组件的props选项. 1.静态props ...

  2. Spring MVC体系结构和处理请求控制器

    Spring MVC体系结构和处理请求控制器 一:MVC设计模式: (1.)数据访问接口:DAO层 (2.)处理业务逻辑层:Service层 (3.)数据实体:POJO (4.)负责前段请求接受并处理 ...

  3. word,excel,ppt转Pdf,Pdf转Swf,通过flexpaper+swftools实现在线预览

    其实这是我好几年前的项目,现在再用这种方式我也不建议了,毕竟未来flash慢慢会淘汰,此方式也是因为目测大部分人都装了flash,才这么做的,但是页面展示效果也不好.其实还是考虑收费的控件,毕竟收费的 ...

  4. 我两年的web开发生涯

    我两年的web开发生涯 与以前的文章分享给大家自己的知识和观点不同,这篇文章更多的是写给自己的总结. 现在是 2017年10月18. 从 2015年9月 开始接触前端开发,至今两年零一个月. 从 20 ...

  5. 最简单的optparse模块的用法

    optparse模块是python自带的模块,可用于处理命令行 #!/usr/bin/env python # -*- coding: utf-8 -*- """ __a ...

  6. webapp填坑记录[更新中]

    网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...

  7. 使用Gulp构建前端自动化方案

    前言 在刚入门前端的时候,我们并不清楚前端有工具可以帮我们自动化打包压缩文件,当时只关注能实现功能就可以了,也不太在意前端性能优化的问题,随着项目功能的复杂,项目也变得越来越大,页面的执行速度也开始变 ...

  8. [最短路]信使(msner)

    [题目描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指挥部下达一个命令后 ...

  9. 运行java web项目时报错:Several ports (8005, 8080, 8009) required

    运行java web项目时报错:Several ports (8005, 8080, 8009) required 如下图 之所以报上面的错误是因为安装Tomcat的时候,已经把端口8005,8080 ...

  10. C语言一些知识点总结

    一.关键字 1. 什么是关键字 1> 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2> C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doubl ...