Java面试题详解一:面向对象三大特性
一,多态:
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面试题详解一:面向对象三大特性的更多相关文章
- Java面试题详解四:==和equals的去别
一,功能 1.对于== 作用于基本数据类型的变量,比较的存储的值是否相等, 作用于引用类型的变量,比较的是其所指向的对象的地址是否相同(即是否是同一个对象) 2.对于equals Object的equ ...
- Java面试题详解二:java中的关键字
一,final1.被final修饰的类不可以被继承2.被final修饰的方法不可以被重写3.被final修饰的变量不可以被改变 重点就是第三句.被final修饰的变量不可以被改变,什么不可以被改变呢 ...
- Java面试题详解三:比较器
一,Comparable和Comparator1.Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较.Comparable接口中只有一 ...
- Java入门系列(三)面向对象三大特性之封装、继承、多态
面向对象综述 封装 封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口. 有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者:而外部调用者也可以知道 ...
- 《Java面试全解析》505道面试题详解
<Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...
- 最强Java并发编程详解:知识点梳理,BAT面试题等
本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- JAVA基础——面向对象三大特性:封装、继承、多态
JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...
- Java 反射机制详解(下)
续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...
随机推荐
- 复制 cmd 窗口文本三步曲:
1:右键菜单点"标记": 2:按住左键选文字: 3:选完右键点一下! (关键一步,只需点一下就好!!) so 待选文字就跑到剪切板上了
- LeetCode算法题-Remove Duplicates from Sorted List
这是悦乐书的第160次更新,第162篇原创 01 前情回顾 昨晚的爬楼梯算法题,有位朋友提了个思路,使用动态规划算法.介于篇幅问题,这里不细说动态规划算法,以后会在数据机构和算法的理论知识里细说. 昨 ...
- java 对象属性复制,将一个对象的属性值赋值给另一个对象, 属性名需要相同
import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(源对象, 目标对象);
- nodejs websocket
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> <script ty ...
- Java面试知识点之线程篇(二)
前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...
- c# base64编码解码
1.base64转pdf
- Android面试题目整理与解说(二)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/bz419927089/article/details/31386787 1.Dalvik和标准Jav ...
- Java学习笔记(四)——好记性不如烂键盘(答答租车)
根据所学知识,编写一个控制台版的租车系统. 功能: 1. 展示所有可租车辆 2. 选择车型.租车辆 3. 展示租车清单,包含:总金额.总载货量及其车型.总载人量及其车型 代码参考imooc中Java课 ...
- 写了12年JS也未必全了解的连续赋值运算
引子 var a = {n:1}; var b = a; // 持有a,以回查 a.x = a = {n:2}; alert(a.x);// --> undefined alert(b.x);/ ...
- PHP删除数组中空值的方法介绍
这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...