封装

封装的概念理解起来非常容易,我初次接触很容易地联想到了vue中的计算属性,或者python中的私有属性问题。他们在这个问题上显得极为相像。话不多说,上代码:

// 定义一个Person类class Person{

public String name;

public int age;

}

Person p1 = new Person();

p1.name = "zhangsan";

p1.age = 20;

先定义一个Person类再实例化一个p1对象,给p1的两个属性赋值。这看起来似乎并没有什么问题,但是这样Person类的属性可以随意地被外部自定义修改,并不是一件好事,于是我们把它改成私有。

// 将属性改成私有class Person{

private String name;

private int age;

}

将属性改成私有后就并不能被外部访问且随意地修改。但是问题来了,既不能被访问又不能被修改那定义的属性意义何在?所有必须得想个办法让它可以被访问且不能随便地被外部修改。

class Person{

private String name;

private int age;

// 获取name public String getName{

return name;

}

// 设置name public void setName(String name){

name = name;

}

// 获取age public int getAge{

return age;

}

// 设置age public void setAge(int age){

if (age > 0 && age < 100){

age = age;

}

}

}

Person p1 = new Person();

p1.setName("zhangsan");

p1.getName(); // "zhangsan"p1.setAge(20);

p1.getAge(); // 20

如此一来便达到了我们的目的,可以在设置方法里加一些判断条件既能让属性可以访问又不能被外部随意地修改,

这就是所谓的封装了。

继承

继承算是面向对象编程中尤为显著的特征了,说到面向对象,就少不了继承。何为继承?

老师是人,学生也是人,老师和学生都拥有人的特性,那么就可以说老师和学生都继承了人。

狗是动物,猫是动物,狗和猫都拥有动物的特性,那么就可以说狗和猫都继承了动物。

这种关系,就称为继承。继承的作用是把一些子类(老师,学生)共同的特性单独抽象成一个父类(人)。

// Person类class Person{

//...}

// Teacher类,继承Person类class Teacher extends Person{

// ...}

// Student类,继承Person类class Student extends Person{

// ...}

子类在定义时通过extends继承父类,获得父类所有的属性以及方法(私有的除外),大大简化了代码。

构造器

java中实例化一个对象会调用对应类中的构造方法,如果没有显示地指明构造方法,则默认为与类同名的方法。

class Person {

// 默认的构造方法 public Person(){

}

}

Person p1 = new Person();

//=====================分割线=====================class Person {

// 指定的构造方法 public Person(String name, int age){

this.name = name;

this.age = age;

}

}

Person p1 = new Person("zhangsan", 20);

如果指定了构造方法就必须在实例化时传入指定的参数列表,再像之前一样实例化则会报错。

也可以对构造方法进行重载,这样就可以多种形式去实例化了,如下:

class Person{

private String name;

private int age;

public Person(){

}

public Person(String name, int age){

this.name = name;

this.age = age;

}

}

Person p1 = new Person(); // 两种方式都可以了Perosn p2 = new Person("zhangsan", 20);

注意,如果继承了父类,子类在实例化时默认会首先调用父类的构造方法。也就是说如果自定义了父类的构造方法则必须也在子类的构造方法中实现。这么说有些不太容易理解,上代码:

class Person{

protected String name;

protected int age;

// 自定义Person类的构造方法 public Person(String name, int age){

this.name = name;

this.age = age;

}

}

// Teacher类继承Person类class Teacher extends Person{

// ... protected int id;

}

Teacher t1 = new Teacher(); // 会报错,因为子类默认先调用父类的构造方法,要求传入参数// 修改后class Teacher extends Person{

public Teacher(String name, int age, int id){

super(name, age);

this.id = id;

}

}

Teacher t1 = new Teacher("zhangsan", 20);

子类中的super指向父类,以上将参数name和age传入super相当于传入并调用父类的构造方法,再对自身进行构造(this指向实例化对象自身这一点阐述了,参考JavaScript中的this);

方法重写

子类如果想扩展从父类继承来的方法或者做一些修改,可以对继承的父类中的方法进行重写,使用@override修饰。

class Person{

protected String name;

public void say() {

System.out.print("I am " + this.name);

}

}

// 子类class Teacher extends Person {

@override

public void say() {

System.out.print("Hello! Everybody!");

}

}

Teacher t1 = new Teacher();

t1.say(); // Hello! Everybody!

多态

什么叫多态?引用廖雪峰老师的一句话,多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

光靠这一句话理解可能十分费劲,所以话不多话,上代码:

class Person{

public void run(){

System.out.print("I am person, i am running.")

}

}

class Teacher extends Person{

@override

public void run(){

System.out.print("I am teacher, i am running.")

}

}

Person p1 = new Person();

p1.run(); // I am person, i am running.Teacher t1 = new Teacher();

t1.run();// I am teacher, i am running.

看到以上代码你可能会说这结果不是显而易见的嘛,多态在哪呢。接着看:

class Person{

public void run(){

System.out.print("I am person, i am running.")

}

}

class Teacher extends Person{

@override

public void run(){

System.out.print("I am teacher, i am running.")

}

}

Person p2 = new Teacher();

看到这你可能就懵了,p2的类型指定为Person怎么能用Teacher实例化呢?

在java中这的确是可以的,因为Teacher是Person的子类,继承关系为:

Object => Person => Teacher

用Teacher类实例化却指定类型为Person,感觉是类向上转化了,这称为向上转型。子类的功能肯定是大于等于父类的,所以可以向上转化。那如果向下转型呢?答案是也可以,但是因为父类的方法是少于子类的,所以向下强制转化很可能失败。

class Person{

public void run(){

System.out.print("I am person, i am running.")

}

}

class Teacher extends Person{

@override

public void run(){

System.out.print("I am teacher, i am running.")

}

}

Person p1 = new Person();

Teacher t1 = (Teacher)p1; // 编译时会报错​

一般情况下会有比较复杂的继承树,怎么判断究竟能不能转型呢?

instanceof

这是instanceof就派上用场了。instanceof用来判断一个类是否为某种类型。返回值为布尔值,为true则可以转型,为false则不能。

Person p = new Student();

if (p instanceof Student) {

// 判断成功才会向下转型: Student s = (Student) p; // 一定成功}

本篇多有参考廖雪峰老师的教程,详情可见廖雪峰的官方网站

java面向编程封装继承多台_java面向对象——封装,继承,多态相关推荐

  1. java继承案例分析_Java面向对象_继承——基本概念以及管理化妆品实例分析

    一.继承的基本概念: 1.继承是面向对象三大特征之一 2.被继承的类成为父类(超类),继承父类的类成为子类(派生类) 3.继承是指一个对象直接使用另一个对象的属性和方法 4.通过继承可以实现代码重用 ...

  2. java面向对相取钱存钱_java面向对象(银行存款业务无客户)

    import java.util.*;//此为银行存款业务 public class Banking { public static void main(String[] args) { Accoun ...

  3. 笔记整理3----Java语言高级(三)11 综合练习+12 面向对象-static变量 与 代码块+13 面向对象-继承与抽象类+14 面向对象-接口与多态+15 面向对象-包修饰符

    11 综合练习+12 面向对象-static变量 与 代码块+13 面向对象-继承与抽象类+14 面向对象-接口与多态+15 面向对象-包&修饰符 第11天 综合练习 今日内容介绍 综合练习 ...

  4. java 面向对象继承的思想_Java面向对象思想!

    刚开始学习Java的时候,一个人跌跌撞撞摸索着往前走,很多东西理解的也懵懵懂懂,后来实践的多了,才慢慢清楚:许多东西虽然很基础但是却很重要,是需要反复思考和加深理解的.在此分享一些归纳总结后的技术干货 ...

  5. java继承的知识点_Java知识点梳理——继承

    1.定义:继承允许创建分等级层次的类,就是子类继承父类的特征行为,使得子类对象具有父类实例的方法, 使得子类具有父类相同的行为. 2.继承的特性: a.子类拥有父类非priavte的属性.方法: b. ...

  6. Java怎么用继承回复信息_JAVA面向对象-继承

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java继承: 1.继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解为一个对象从另一个对象获取属性的过程. 2.如果类 ...

  7. java里类得继承详细讲解_java中类的继承详解。

    前言 继承是面向对象的三大特征之一. 也是实现软件复用的重要手段. Java继承具有单继承的特点, 每个子类只有一个直接父类. 继承的特点 Java的继承通过extends关键字实现. 实现继承的类被 ...

  8. Java面对对象的核心是啥_Java面向对象核心技能

    1.封装 封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问. 封装的好处:隐藏类的实现细节:让使用者只能通过程序规 ...

  9. java并发编程:设计原则与模式_java编程设计模式一——策略模式

    定义: 策略模式定义了算法族,分别封装起来,让它们之间相互替代.此模式让算法的变化独立于使用算法的客户. 问题描述: 建立一个鸭子Duck的父类,它有很多子类,Duck都会游泳,但是有鸭子会飞,有的鸭 ...

最新文章

  1. xy苹果助手未受信任_手机畅销榜出炉:iPhone11销量第一,苹果是安卓无法逾越的大山...
  2. 全球富豪大洗牌!马斯克登顶世界首富,黄铮国内第三超马云
  3. 用Gmail备份多看的推送
  4. 【干货】Oracle数据库常用十一大操作指令
  5. 阿里巴巴成立云原生技术委员会,云原生升级为阿里技术新战略
  6. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
  7. Signals Slots(Qt5)
  8. python类继承实例_python类继承与子类实例初始化用法分析
  9. gprof 输出内容解释
  10. utf-8编码用于asp出现乱码的问题--从数据库调用的是乱码
  11. 使用Epoch-Based Reclamation(EBR,特定域回收的一种方法)修改 lazy-list
  12. Atitit.木马病毒的操作注册表原理 系统服务管理器 atiSysService
  13. xp母盘制作流程+QQDLL+系统文件DLL修改(转)
  14. 软件无法安装时怎么办
  15. 下载各种百度文库以及豆丁网文章的简便方法
  16. activemq_CVE-2015-5254_漏洞复现_源码分析
  17. mac 文档 只读修改
  18. Spring源码解析二之创建Bean(实例化)
  19. kafka日志清理策略,compact和delete
  20. 点击免费领取视频拍摄和剪辑教程

热门文章

  1. 汉服重现与中国的文艺复兴
  2. 偏最小二乘回归(partial least squares regression,PLSR)
  3. 全国各省份结婚离婚面板数据(2005-2019年)
  4. DKR-NT1医用注射针管(针)刚性测试仪
  5. linux下tomcat安装及配置教程
  6. 牛客练习赛 25 E题 定向 【桥 + 思维】 无向图定方向变强连通图
  7. iOS TestFlight
  8. HDU-用N个三角形最多可以把平面分成几个区域
  9. Office文件转化PDF实现预览功能
  10. 电商平台如何引流搜索引擎