面向对象编程03:封装、继承、多态

文章目录

  • 面向对象编程03:封装、继承、多态
    • 封装
    • 继承
      • object类
      • super
        • super注意点:
        • `super` VS `this`:
    • 方法重写
    • 多态
      • 多态的注意事项:
    • instanceof关键字
    • 父类与子类之间的类型转换

封装

  • 该露的露、该藏的藏

    • 设计程序要追求“高内聚、低耦合”。
    • 高内聚就是类的内部数据操作细节由自己完成,不允许外部干涉;
    • 低耦合:仅仅暴露少量的方法给外部使用。
  • 封装(数据的隐藏)
    • 通常我们应该禁止直接访问一个对象中数据的实际表示,而应该通过操作接口来访问,这被称为“信息隐藏”。
  • 理解封装,记住这句话就够了:属性私有,get/set

下面我们来看看封装的代码实例:

public class Student {//属性私有:privateprivate String name;//名字private int id;//学号private char sex;//性别private int age;//年龄//提供一些可以操作这个属性的方法:public的get、set方法//Alt+Enter快捷创建get和set方法//get 获得这个数据//set 设置值public void setName(String name) {this.name = name;}public String getName() {return this.name;}public int getAge() {return age;}public void setAge(int age) {if (age<0||age>120){System.out.println("invalid number");}else{this.age= age;}}
}public class Application {public static void main(String[] args) {Student student = new Student();student.setName("David");//将David通过setName方法赋值给name.System.out.println(student.getName());student.setAge(20);System.out.println(student.getAge());}
}
输出结果:
David
20

封装的好处:

  1. 提高程序的安全性。保护数据
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 增加了系统的可维护性

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • extends的意思是“扩展”。子类是父类的扩展。
  • JAVA中类只有单继承,没有多继承!
  • 继承是类与类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
  • 继承关系的两个类:一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends表示。
  • 子类和父类之间从意义上讲应该具有“is a”的关系。

下面我们来看一个简单的继承的例子:

//Java中所有的类都默认直接或间接继承object类
//父类: Personclass Person /*extends object*/ {int money = 10_000_000;public void say(){System.out.println("说了一句话");}
}
//子类:Student
//继承了父类的所有方法class Student extends Person {
}
public class Application {public static void main(String[] args) {Student student = new Student();student.say();//say是父类Person的方法System.out.println(student.money);//money是父类Person中的变量}
}

object类

在Java中所有的类都默认直接或间接继承object类。

class Person /*extends object*/ {
}

java的Object类方法如下:

  1. getClass方法

获取运行时类型,返回值为Class对象

  1. hashCode方法

返回该对象的哈希码值,是为了提高哈希表的性能(HashTable)

  1. equals方法

判断两个对象是否相等,在Object源码中equals就是使用去判断,所以在Object中equals是等价于的,但是在String及某些类对equals进行了重写,实现不同的比较。

  1. clone方法

主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这时就需要在类中复写clone方法。

如果在clone方法中调用super.clone()方法需要实现Cloneable接口,否则会抛出CloneNotSupportedException。

此方法只实现了一个浅层拷贝,对于基本类型字段成功拷贝,但是如果是嵌套对象,只做了赋值,也就是只把地址拷贝了,所以没有成功拷贝,需要自己重写clone方法进行深度拷贝。

5.toString方法

返回一个String字符串,用于描述当前对象的信息,可以重写返回对自己有用的信息,默认返回的是当前对象的类名+hashCode的16进制数字。

  1. wait方法

多线程时用到的方法,作用是让当前线程进入等待状态,同时也会让当前线程释放它所持有的锁。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,当前线程被唤醒

  1. notify方法

多线程时用到的方法,唤醒该对象等待的某个线程

  1. notifyAll方法

多线程时用到的方法,唤醒该对象等待的所有线程

9.finalize

对象在被GC释放之前一定会调用finalize方法,对象被释放前最后的挣扎,因为无法确定该方法什么时候被调用,很少使用。

super

  1. super关键字指向父类:
//父类: Personclass Person {int age = 60;public void say(){System.out.println("Person说了一句话");}
}
//子类:Student
//继承了父类的所有方法class Student extends Person{public void print() {System.out.println("Peosin is"+ super.age);System.out.println("Student");super.say();//}
}
public class Application {public static void main(String[] args) {Student student = new Student();student.print();}
}
输出结果:
Person is 60
Student
Person说了一句话
  1. 调用子类构造器时相当于提前执行了一行隐藏代码:super();
//父类: Personclass Person {public Person() {System.out.println("Person无参构造已执行");}
}
//子类:Student
//继承了父类的所有方法class Student extends Person{//super();public Student() {System.out.println("Student无参构造已执行");}
}
/*** @author 15065170282*/
public class Application{public static void main(String[] args) {Student student = new Student();}
}
输出结果:
Person无参构造已执行
Student无参构造已执行

super注意点:

  1. super调用父类的构造方法,必须在构造方法的第一个;
  2. super只能出现在子类的方法或者构造方法中;
  3. superthis不能同时调用构造方法!

super VS this:

  1. 二者代表对象不同:

    this: 代表调用者本身

    super: 代表父类应用

  2. 使用前提不同:

    this: 不用继承就能直接使用

    super: 只能在继承条件下使用

  3. 构造方法:

    this();代表本类的构造

    super();代表父类的构造

方法重写

  1. 前提:方法重写需要有继承关系,即子类重写了父类的***方法***,方法名、参数都一致但是方法体不同

  2. 方法重写只针对于实例方法,静态方法不存在重写

  3. 方法重写只针对于public关键字修饰的方法,private修饰的无法被继承

  4. 参数列表必须相同(不同就变成重载了)

  5. 修饰符:范围可以扩大但不能缩小: public>protected>default>private

  6. 抛出的异常范围可以被缩小但是不能扩大:

  7. 为什么需要重写?

    因为有时父类的功能子类不一定需要或不一定满足;

  8. 快捷键(IDEA中):Alt + Insert

class Person{public void say(){System.out.println("父亲说了一句话");}}
class Student extends Person{@Overridepublic void say() {System.out.println("Student 重写了Person的方法");}
}
/*** @author 15065170282*/
public class OverrideTest {public static void main(String[] args) {Person person = new Person();person.say();Student student = new Student();student.say();}
}

多态

  • 同一方法可以根据发送对象的不同采取多种不同的行为方式。
  • 一个对象的实际类型是确定的,但可以指向该对象的引用类型有很多
  • 多态存在的条件:
    1. 有继承关系
    2. 子类重写父类方法
    3. 父类引用指向子类对象

下面来看一个多态的实例:

package JavaSe.oop.demo07;class Person{public void run(){System.out.println("run");}}
class Student extends Person{@Overridepublic void run() {System.out.println("子类重写了父类的run方法");}public void eat(){System.out.println("eat");}
}/*** @ClassName Application* @author 15065170282**/
public class Application {public static void main(String[] args) {//一个对象的实现类是确定的:new Student(); new Person();//但是引用类不能确定:父类的引用指向子类//Student能调用的方法都是自己的或者是继承父类的!Student s1 = new Student();//Person父类可以指向子类但是不能调用子类独有的方法;Person s2=new Student();Object s3=new Student();//对象能执行哪些方法取决于引用类的类型,和实现类无关;s1.eat();((Student) s2).eat();//类型转换s1.run();s2.run();}
}
输出结果:
eat
eat
子类重写了父类的run方法
子类重写了父类的run方法

多态的注意事项:

  1. 多态指的是方法的多态,属性没有多态一说。

  2. 父类和子类因为有联系(继承关系)才能进行转换

    类型转换异常:ClassCastException!

  3. 存在条件: 继承关系,方法需要重写,父类引用指向子类对象: Father F1 = new Son();

无法重写:

  1. static方法,属于类,不属于实例;
  2. final常量;
  3. private方法;

instanceof关键字

instanceof 关键字用于判断两个类之间是否有父子关系。

public class InstanceOfTest {public static void main(String[] args) {//System.out.println(X instanceof Y);//能否编译通过取决于X与Y之间是否有关//object-->Person-->Student//object-->Person-->TeacherObject o = new Object();System.out.println(o instanceof Student);System.out.println(o instanceof Person);System.out.println(o instanceof Object);System.out.println(o instanceof Teacher);System.out.println(o instanceof String);System.out.println("====================================");Person person = new Person();System.out.println(person instanceof Student);System.out.println(person  instanceof Person);System.out.println(person  instanceof Object);System.out.println(person  instanceof Teacher);//编译时就会报错:System.out.println(person  instanceof String);System.out.println("====================================");Student student = new Student();System.out.println(student instanceof Student);System.out.println(student instanceof Person);System.out.println(student  instanceof Object);//编译时就会报错:System.out.println(student  instanceof Teacher);//编译时就会报错:System.out.println(student  instanceof String);}
}
输出结果:
false
false
true
false
false
====================================
false
true
true
false
====================================
true
true
true

父类与子类之间的类型转换

  1. 父类引用指向子类的对象: Father f = new Son();
  2. 子类转换成父类,向上转型;
  3. 父类转换成子类,向下转型:强制转换
  4. 作用:方便方法的调用,减少代码的重复

下面来看父子类类型转换的代码实例:


class Test{}
class TestSon extends Test{public void go(){System.out.println("go");}
}
/*** @ClassName Application* @Author ${17368877923}**/
public class Application {public static void main(String[] args) {//类型之间的转化: 父  子//高------>低需要强转//低------>高可以直接转Test test = new TestSon();new  TestSon().go();//对象.方法//test.go();TestSon testSon = (TestSon) test;
//可以对比int testSon=3; double test =3.0; int testSen=(int) test;高到低强转
// testSon将test对象转换为TestSon类型,我们就可以使用TestSon类型的方法了testSon.go();((TestSon) test).go();}
}

面向对象编程03:封装、继承、多态相关推荐

  1. 第九课(面向对象):封装 继承 多态

    一.面向对象概念:根据模板(创建一个类)并实例化 这个思路就叫面向对象 二.使用面向对象编程好处: 可以重复使用(实例化类) 容易修改(只用修改类的模板) 三.面向对象的特点: 封装 继承 多态 类名 ...

  2. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  3. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  4. 面向对象编程03—封装、继承、重写、MRO、多态

    九.封装 根据需求将属性和方法封装到一个抽象的类中,在使用的时候,只要按照自己的需求去调用,不必了解实现的细节. 封装有两方面的含义: 1.将数据(属性)和行为(方法)包装到类对象中.在方法内部对属性 ...

  5. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  6. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  7. Java基础【之】面向对象编程(封装、继承(extends、方法重写、super)、多态(动态绑定、重载/重写)、代码实现)

    Java基础[之]面向对象编程(封装.继承.多态.代码实现) 1.封装 2.继承 2.1.extends 2.2.方法重写 2.3.super 3.多态 3.1.对象的多态.方法的多态 3.2.动态绑 ...

  8. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

  9. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

最新文章

  1. 为什么mac运行变慢,如何提升mac运行速度
  2. 深入理解android卷II 即将发布
  3. 2d fft matlab,证明2D-FFT能够拆分成两个1D-FFT
  4. 32通过rs485烧写程序_28027芯片sci程序烧写问题请教
  5. java 检查进程是否存在
  6. 觉得WaitGroup不好用?试试ErrorGroup吧!
  7. 第3章 控制程序流程(1)
  8. (二)cmockery中run_tests.c分析
  9. 6.RabbitMQ实战 --- 从故障中恢复
  10. MySQL全量备份和增量备份脚本
  11. 最强大脑记忆曲线(4)——关于项目中的全局变量
  12. SQL中开窗函数first_value() 和 last_value()
  13. iOS使用wifi传输文件到iPhone
  14. 房多多Q2营收同比下降46%:亏损同比扩大8.9倍,股价再创新低
  15. python matplotlib柱状图显示数据标签及百分号
  16. https信任证书的三种方式
  17. 自学系列 | 就谈独立思考!
  18. Linux操作提示:“Cant open file for writing”或“operation not permitted”的解决办法
  19. 什么是CDN什么是高防CDN
  20. 软件测试之Web测试方法总结

热门文章

  1. win7如何在桌面上加计算机,详细教您win7如何添加显示桌面图标
  2. 外贸购物直播解决方案
  3. Java实现MD5加密解密
  4. ubuntu调试android设备不识别
  5. Share实例:用python将ppt转为pdf
  6. 北极没冰川了。。。南极下起了冻雨。。。
  7. html弹性盒子垂直排列,css3弹性盒子布局
  8. word题注编号格式从仅数字顺序编号到包含章节号编号
  9. Greenplum6 JDBC insert性能媲美MySQL
  10. dp 部分和问题及其扩展