一,多态:
1.面向对象四大基本特性:抽象,封装,继承,多态
抽象,封装,继承是多态的基础。多态是抽象,封装,继承的表现。
2.什么是多态
不同类的对象对同一消息作出不同的响应叫做多态
3.多态的作用
简单来说:解藕。详细点就是,多态是设计模式的基础(既然是基础,那么一些设计模式中肯定有多态的下面三个条件)
4.多态存在的三个条件
有继承关系
子类重写了父类方法
父类引用指向子类对象
5.注意:
因为多态存在必须要有“子类重写父类方法”这个条件,那么下面三种类型的方法没办法表现出多态的特性(因为不能被重写)
static方法:static修饰的方法是属于类的,而不属于实例
final方法:因为被final修饰的方法无法被子类重写
private方法:被private修饰的发那个法对子类不可见,
protected方法:被protected修饰的方法可以被子类见到,也可以被重写,但无法被外部所引用,无法引用,就没有多态
6.多态的分类:
编译时多态,方法的重载
运行时多态,方法的重写
7.分析多态问题的几条原则
比如有一个父类Father,有一个子类Children
(1)向上转型是自动的。Father f=new Children()是自动的,不需要强转
(2)向下转型要强转。即Children c=new Father()是无法编译通过的,必须要Children c=(Children)new Father(),让父类知道它要转成具体哪个子类
(3)父类引用指向子类对象,子类重写了父类的方法,调用父类的方法,实际调用的是子类重写了父类的该方法。
即 Father f=new Children(),f.toString()实际上调用的是Children中的toString()方法
例如:

父类:
public class Father {
private double money=100; public double getMoney() {
return money;
} public void setMoney(double money) {
this.money = money;
} public void usePhone(){
System.out.println("使用老年机");
}
}
子类:有继承关系,并且重写父类的方法userPhone()
public class Children extends Father {
public void usePhone(){
System.out.println("继承money:"+getMoney()+"使用智能机");
}
}
public class Test {
public static void main(String[] args) {
Father f=new Children(); //父类的引用指向子类对象。
f.usePhone();//其实是调用子类的方法,输出:“继承money:100.0使用智能机”
}
}

二,封装
一个对象他所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作
封装就是把一个对象的属性私有化,同时提供一些可以被外界访问属性的方法
1.封装的三大好处:
良好的封装能减少耦合
类内部的结构可以自由修改
可以对成员变量更精确的控制
隐藏信息,实现等细节
2.实际应用
(1)好处1:封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。

public class User {
private Long id;
private String name;
private int age; public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

如果我们需要修改User这个类,把 age改为String 。你只有一处使用了这个类还好,如果你有几十个甚至上百个这样地方,你是不是要改到崩溃。如果使用了封装,我们完全可以不需要做任何修改,只需要稍微改变下Husband类的setAge()方法即可。

public class User {
private Long id;
private String name;
private String age; //改为String类型 public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getAge() {
return age;
} public void setAge(int age) {
this.age = String.valueOf(age);
}
}

(2)好处2:可以对成员变量进行更精确的控制。

public class User {
private Long id;
private String name;
private int age; public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public int getAge() {
return age;
} public void setAge(int age) {
if(age>150){
System.out.println("年龄不符合要求");//输出提示信息
}else {
this.age = age;
} }
}
好处3:例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。
public class User {
private Long id;
private String name;
private Integer sex;
private String sexString; public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getSexString() {
if(sex==1){
setSexString("男");
}else if(sex==0){
setSexString("女");
}else {
setSexString("未知");
}
return sexString;
} public void setSexString(String sexString) {
this.sexString = sexString;
}
}

三,继承
1.使用继承可以用来复用代码。可以将所有子类的共同属性放入父类中
使用继承记住三句话:
子类拥有父类非private的属性和方法
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
子类可以用自己的方式实现父类的方法
2.构造方法:
首先是通过构造方法来完成对象的初始化,子类的构造方法默认调用父类的构造方法,通过super()方式
(1).父类有默认的构造方法,子类的构造方法默认执行super();调用父类构造方法进行实例化
(2).父类没有默认构造方法(肯定是手写了构造方法),子类构造方法中显示使用super()调用父类构造方法
3.缺点:
父类变,子类必须变
继承是一种强耦合关系

Java面试题详解一:面向对象三大特性的更多相关文章

  1. Java面试题详解四:==和equals的去别

    一,功能 1.对于== 作用于基本数据类型的变量,比较的存储的值是否相等, 作用于引用类型的变量,比较的是其所指向的对象的地址是否相同(即是否是同一个对象) 2.对于equals Object的equ ...

  2. Java面试题详解二:java中的关键字

    一,final1.被final修饰的类不可以被继承2.被final修饰的方法不可以被重写3.被final修饰的变量不可以被改变  重点就是第三句.被final修饰的变量不可以被改变,什么不可以被改变呢 ...

  3. Java面试题详解三:比较器

    一,Comparable和Comparator1.Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较.Comparable接口中只有一 ...

  4. Java入门系列(三)面向对象三大特性之封装、继承、多态

    面向对象综述 封装 封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口. 有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者:而外部调用者也可以知道 ...

  5. 《Java面试全解析》505道面试题详解

    <Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...

  6. 最强Java并发编程详解:知识点梳理,BAT面试题等

    本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...

  7. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...

  8. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  9. Java 反射机制详解(下)

    续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...

随机推荐

  1. 关于Numba开源库(Python语法代码加速处理,看过一个例子,速度可提高6倍)

    关于Numba你可能不了解的七个方面 https://yq.aliyun.com/articles/222523 Python GPU加速 (很详细,有代码练习)https://blog.csdn.n ...

  2. HTML 页面自动刷新

    学习就是一个不断积累的过程,每一天能够学到一点新东西说明自己就在进步!! HTML head 里面设置页面自动刷新功能 <meta http-equiv="Refresh" ...

  3. 将含有makefile文件的源码加入Eclipse工程

    转载自https://www.linuxidc.com/Linux/2011-02/32763.htm 很多软件在开发或者分析时需要一个像样的IDE,Eclipse是其中很优秀的一个,至少个人感觉很好 ...

  4. Ubuntu下使用QQ/Wechat

    实验环境:Ubuntu 16.04桌面版root用户下 安装Docker 配置Docker的apt源 $ sudo apt-get install apt-transport-https ca-cer ...

  5. Linux 小知识翻译 - 「补丁」(patch)

    这次,聊聊补丁. 当有bug或者安全漏洞的时候,就会发布补丁.打上补丁之后,就能解决相应的bug或者安全漏洞. 那么,「补丁」到底是什么呢? 「补丁」只有少量的代码,一般都是对程序的一部分进行更新或者 ...

  6. 一张有料的图片!!!附文件-图片合成器C语言实现算法

    凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.打开F盘,先找两个文件,一个是压缩文件(2.rar),另一个是一张图片(1.jpg),将其放到F盘目录下, ...

  7. HTML做的网页 如何使当前页面跳转到另一页面锚点处

    当前页面a.html另一页面b.html当前页面: <a href="b.html#aaa">跳转到b页面aaa处</a>另一页面:<a name=& ...

  8. Redis 的安装 使用 通知事件

    Redis 的安装 使用 介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string.list.set.zset(sorted ...

  9. Java 8 新特性:3-函数(Function)接口

    (原) 以前,在创建泛型时,是这么写的: List<String> list = new ArrayList<String>(); 现在,可以这么写了: List<Str ...

  10. ESP32:mdns协议

    mdns(即多播dns,Multicast DNS)主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构.语法和资 ...