Java基础—封装继承多态(详细)

article/2025/9/18 13:45:03

文章目录

  • 面向对象三大特征 封装 继承 多态
  • 1.封装
  • 2.继承
    • 2.1注意事项
    • 参考文档
    • 2.2 this和super关键字
    • 2.3 重载和重写
  • 3.多态
    • 3.1方法的多态
    • 3.2对象的多态
    • 3.3多态转型
      • 3.3.1向上转型
      • 3.3.2向下转型
      • 3.3.3 instanceof 关键字

面向对象三大特征 封装 继承 多态

1.封装

定义:就是把事物封装成类,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

作用:尽可能地隐藏对象的内部实现细节、控制用户对类的修改和访问权限(体现:private属性) 提高代码的可维护性

package com.fengzhuang.kz;import sun.font.EAttribute;class Animal{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}private void eat() {System.out.println(name+"吃竹子");}public void publicEat() {eat();}   
}

总结: private 声明的属性需要生成public的get,set方法来从外部调用(方法也需要)

2.继承

关键字:extends

格式: class 子类 extends 父类{ }

定义:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力 俗称子类继承父类

注意:Java只支持单继承 ,一个子类只能继承一个父类,不能继承多个父类 但是可以多重继承

package com.fengzhuang.kz;
//不能多继承
//爷爷类
class A{}
// 父类
class B extends A{}
//多重继承   孙子类
class C extends B{}

2.1注意事项

1.成员变量(属性)

​ 公开的和默认的成员变量,子类是可以继承使用的

​ 私有的成员变量,子类是无法使用

2.成员方法

​ 公开的和默认的成员方法,子类是可以继承使用的

​ 私有的成员方法,子类是无法使用

3.构造器

​ 先执行父类的构造方法,然后再执行子类的构造方法

如果父类里面没有无参构造,子类就不能写无参构造

package com.fengzhuang.kz;import sun.font.EAttribute;
//父类
class Animal{private String name;private int age;private char sex;//创建子类对象会调用父类构造器 父类早于子类public Animal() {System.out.println("我是父类无参构造器");}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;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}private void eat() {System.out.println(name+"吃竹子");}public void publicEat() {eat();}   
}
//子类
class Panda extends Animal{@Overridepublic void publicEat() {//重写父类的方法System.out.println("重写");}//方法的重载public void eat() {}public void eat(String name) {}
}public class Demo01 {public static void main(String[] args) {//通过子类对象调用父类属性 方法Panda panda=new Panda();panda.setName("国宝");panda.publicEat();}}

练习:编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功能

package com.fengzhuang.kz;class Vehicle{private int wheels;//车轮private double weight;//车重public Vehicle() {}public int getWheels() {return wheels;}public void setWheels(int wheels) {this.wheels = wheels;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}}
class Car1 extends Vehicle{private int loader;//有载人数public Car1() {}public int getLoader() {return loader;}public void setLoader(int loader) {this.loader = loader;}}
class Truck extends Car1{private int payload;//载重量public void Truck() {}public int getPayload() {return payload;}public void setPayload(int payload) {this.payload = payload;}public void Info(Truck truck) {System.out.println("卡车重量:"+truck.getWeight()+"吨");System.out.println("卡车载重:"+truck.getPayload()+"kg");System.out.println("有载人数:"+truck.getLoader()+"人");System.out.println("车轮有: "+truck.getWheels()+"个");}
}public class Demo07 {public static void main(String[] args) {Truck truck=new Truck();truck.setWeight(5);truck.setPayload(200);truck.setLoader(2);truck.setWheels(8);truck.Info(truck);
}
}

输出结果:

在这里插入图片描述

参考文档

2.2 this和super关键字

详细请看:this和super的作用

2.3 重载和重写

详细请看:Java重载和重写

3.多态

多态:是多种状态,是面向对象的三大特性之一,多态建立在封装和继承之上

3.1方法的多态

package com.duot.k;class Person{public void run() {}
}
//方法的多态
class Man extends Person{//重写@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();}
}

3.2对象的多态

1.父类的引用执行子类的对象

2.编译看左 运行看右

3.一定要有继承和重写

//父类            子类
//编译看左      执行看右
Person person=new Man();

案例

编写程序实现比萨制作。需求说明编写程序,可供选择的比萨有:培根比萨和海鲜比萨。

实现思路及关键代码

  1. 分析培根比萨和海鲜比萨

  2. 定义比萨类

  3. 属性:名称、价格、大小

  4. 方法:展示

  5. 定义培根比萨和海鲜比萨继承自比萨类

  6. 定义比萨工厂类,根据输入信息产生具体的比萨对象
    PizzaFactory {
    createPizza(Pizza);//如果传的参数培根披萨就是生产培根披萨 如果传的是海鲜披萨就是生产的海鲜披萨
    }

披萨类

class Pizza{private String name;private double price;private int size;public Pizza(String name, double price, int size) {this.name = name;this.price = price;this.size = size;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getSize() {return size;}public void setSize(int size) {this.size = size;} public void show() {System.out.println("我是:"+name+" 价格:"+price+" 大小:"+size+"寸");}
}

培根披萨类

//培根披萨
class BaconPizza extends Pizza{public BaconPizza(String name, double price, int size) {super(name,price,size);}@Overridepublic void show() {// TODO Auto-generated method stubSystem.out.println("我是:"+getName()+" 价格:"+getPrice()+" 大小:"+getSize()+"寸");}}

海鲜披萨类

//海鲜披萨
class SeafoodPizza extends Pizza{public SeafoodPizza(String name, double price, int size) {super(name,price,size);}@Overridepublic void show() {// TODO Auto-generated method stubSystem.out.println("我是:"+getName()+" 价格:"+getPrice()+" 大小:"+getSize()+"寸");}	
}

披萨工厂类:

class PizzaFactory {//如果传的参数培根披萨就是生产培根披萨  如果传的是海鲜披萨就是生产的海鲜披萨public void createPizza(Pizza pizza) {pizza.show();            }
}

实现类:

public class Demo02 {public static void main(String[] args) {PizzaFactory pizzaFactory=new PizzaFactory();Pizza baconPizza=new BaconPizza("培根披萨",200,5);Pizza seafoodPizza=new SeafoodPizza("海鲜披萨",300,6);pizzaFactory.createPizza(baconPizza);pizzaFactory.createPizza(seafoodPizza);
}
}

在这里插入图片描述

3.3多态转型

3.3.1向上转型

本质就是:父类的引用指向子类的对象

语法格式:父类的对象 变量 = new 子类对象;

class Person {public void eat () {System.out.println("父类吃饭");}
}
class Student extends Person{@Overridepublic void eat() {System.out.println("子类吃饭");}//子类独有的方法public void sleep () {System.out.println("子类睡觉");}
}
public class Demo1 {public static void main(String[] args) {//父类的引用指向子类的对象Person person = new Student();person.eat();//子类的方法//父类的引用不能执行子类的独有的方法//person.sleep();//如果多态中的父类引用指向子类的对象的时候必须得有继承和重写}
}

3.3.2向下转型

语法格式:

父类类型 父类的引用 = new 父类();
子类类型 引用变量 = 父类的引用;

大转小 需要强制类型转换

经典案例:

class Monkey {//Object 是所有类的父类 public void Test (Object obj) {//向下转型String str = (String)obj;System.out.println(str);}
}
public class Demo {public static void main(String[] args) {Monkey monkey = new Monkey();monkey.Test("test");}
}

总结:向下转型的时候,先向上转型

3.3.3 instanceof 关键字

instanceof : 比较操作符,返回值是一个布尔类型的数据 目的是在强转的时候不会出现异常

语法格式

注意对象的引用必须是运行类本类的对象,或者是子类的对象

对象的引用 instanceof 运行类型
Object obj = new object()
obj instanceof String   false

案例:

/** 编写程序实现软料购买:编写程序,接收用户输入的信息,* 选择购买的饮料。可供选择的饮料有:咖啡、矿泉水和可乐。* 其中,购买咖啡时可以选择 :加糖、加奶还是什么都不加。* 购买可乐时可以选择:买可口可乐还是百事可乐。*/
class Drink{Scanner scanner;public void word(Drink drink) {}
}
//咖啡
class Coffee extends Drink{
@Override
public void word(Drink drink) {if (drink instanceof Coffee) {Coffee coffee=(Coffee)drink;scanner=new Scanner(System.in);System.out.println("您要的咖啡加糖还是加奶,还是什么都不加");String string=scanner.nextLine();if ("加糖".equals(string)) {System.out.println("您要的咖啡加糖");}else if ("加奶".equals(string)) {System.out.println("您要的咖啡加奶");}else {System.out.println("你什么都不要");}}
}}
//矿泉水
class  Water extends Drink{@Overridepublic void word(Drink drink) {if (drink instanceof Water) {Water water=(Water)drink;System.out.println("您买矿泉水");}}
}
//可乐
class Coke extends Drink{@Overridepublic void word(Drink drink) {if (drink instanceof Coke) {Coke coke=(Coke)drink;Scanner scanner1=new Scanner(System.in);System.out.println("买可口可乐还是百事可乐");String string1=scanner1.nextLine();if ("可口可乐".equals(string1)) {System.out.println("您要的可口可乐");}else {System.out.println("您要的百事可乐");}}}
}
public class Demo04 {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("你要咖啡还是可乐还是矿泉水:");String string=scanner.nextLine();if ("咖啡".equals(string)) {Drink drink=new Coffee();drink.word(drink);}if ("可乐".equals(string)) {Drink coke=new Coke();coke.word(coke);}if ("矿泉水".equals(string)) {Drink drink=new Water();drink.word(drink);}}
}class Demo04 {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("你要咖啡还是可乐还是矿泉水:");String string=scanner.nextLine();if ("咖啡".equals(string)) {Drink drink=new Coffee();drink.word(drink);}if ("可乐".equals(string)) {Drink coke=new Coke();coke.word(coke);}if ("矿泉水".equals(string)) {Drink drink=new Water();drink.word(drink);}}}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/5Anh4YVY.shtml

相关文章

Java中的封装,继承和多态(详解)

目录 封装继承多态接口 一些建议和小结写在最后的话 封装 所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的成员变量和成员方法都使用private修饰了,我们现在来使用一…

封装、继承、多态

目录 访问限定符 封装 继承 super关键字 super和this的比较 继承在内存中的情况 重写override 重写和重载的比较 多态 JAVA中的动态绑定机制 JAVA面向对象程序三大特性:封装、继承、多态。在类和对象阶段,主要研究的就是封装特性。 在了…

【Java基础】 ⾯向对象编程三⼤特性 --封装、继承、多态

文章目录 封装继承多态 封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 通俗的说,一个类就是一个封装了数…

Java基础知识之封装+继承+多态详解

前言 这篇博客是基于Java类和对象的基础之上的相关知识点。因为特别重要且语法规则较多,所以想单独总结方便之后复习。 本篇博客涉及知识点思维导图: 目录 1.封装 2.继承 3.多态 1.封装 生活中有很多东西我们并不想让其它人知道,比如我的身…

封装、继承和多态

目录 前言一、什么是封装?二、什么是继承?三、什么是多态? 前言 其实封装、继承和多态不仅仅是java的特性,而是所有面向对象程序的三大特性。 一、什么是封装? 封装就是对类内部的实现细节进行隐藏,然后…

封装、继承、多态 详解

面向对象的三个基本特征:封装、继承、多态 1.封装 (1)封装是实现面向对象的第一步,封装就是将数据或函数等集合在一个单元中(类)。被封装的对象通常被称为抽象数据类型。 (2)类具…

面向对象编程三大特性------封装、继承、多态

一、封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节&am…

人脸识别API接口 活体检测 人证比对 人身核验

技术原理 l通过自拍获得自拍照,或者通过活体SDK获得活体照片; l通过姓名、身份证号获得公安带网纹照片,通过去网纹技术得到清晰照片; l自拍照或者活体照片与公安照片进行比对; l确认用户与比对证件为同一人。 适用…

浅谈私有云端的人脸识别与人证比对

人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。 而私有云人脸识别人证对比系统是一款基于…

论文精读|大规模双样学习用于人证比对

点击上方“AI公园”,关注公众号 之前分享过Docface,Docface,这篇是在Docface之前的一篇文章,也是专门处理人证比对问题,也是用到了imprint的技术,Docface就是参考了这篇文章中的imprint。 Large-scale Bisample Learni…

基于人脸识别开发人证比对访客系统

2019独角兽企业重金招聘Python工程师标准>>> 原作者 panmingzhi 最近有个小区用到了虹软的人脸识别,效果还不错。又有一个项目要用人证访客对比,分享一下项目,希望可以帮到有需要的。 码字前先上项目地址:https://gite…

人脸识别技术开发人证比对访客系统

原作者 panmingzhi 最近有个小区用到了虹软的人脸识别,效果还不错。又有一个项目要用人证访客对比,分享一下项目,希望可以帮到有需要的。 码字前先上项目地址:https://gitee.com/panmingzhi/IdCardFaceIdentifier 首先是读证的问题…

人脸识别、人证比对核验数据特点

一、人证合一验证系统产品简介: 人证合一验证系统是一套利用专业证件扫描设备和身份证阅读机具,实现采集持证人相片与所持证件人相关信息发送至公安部身份证副本库进行生物特征比对,验证人与证是否一致的软硬件结合系统。 从技术上基本解决了这两个主要问题:利用经公安部…

双目活体检测摄像头|离线式人证比对|人脸识别SDK

产品概述 中安未来双目防伪人证核验设备(TH-DE300)是一款基于中安未来自主独立研 发的双目多光谱生物识别技术,打造的一体化终端产品,主要适用于需要进行人证合一验证 的业务场景,对被验证人员身份进行验证。如防止冒用他人办理业务、刷脸控制…

人脸识别人证比对技术SDK

人脸识别人证比对技术SDK 人脸识别人证比对技术SDK 一、人脸识别人证比对技术1:1及1:N概念 人脸识别人证比对技术1:1如我们现在在宾馆、网吧、机场安检等的人与身份证上的照片进行比对的应用,用来证明自己是自己。想想,目前我们在…

人证比对的解决方案

人证比对的解决方案 目前,人证比对应用的场景很多:机场、高铁站过安检;P2P的软件注册;酒店、网吧、手机营业厅、银行开户;以及政府单位的一些柜台。1:1人脸比对有着用户量大、行业广、比对速度快、精准、使用方便、成本…

PockerFace 离线版人证比对 SDK 编程指南

深圳市喜汇信息科技有限公司(PockerFace)是一家通过深度学习框架打造新一代人脸识别技术的科技创新公司,具有完全自主知识产权的核心技术,在人脸检测、人脸识别、人脸属性检测、活体检测、人脸搜索等多个领域均有原创性创新。检出率、错检率、误检率、检…

人脸识别算法源码SDK开发包人证比对二次开发检测核验开发包

人脸识别算法源码SDK开发包人证比对二次开发检测核验开发包 ID:89120059902830359120170116926

人脸识别|人证比对《DocFace+: ID Document to Selfie Matching》论文解读

请点击上方“AI公园”,关注公众号 【导读】这是之前那篇DocFace的后续,作者在原来的基础上进行了升级,效果更佳,而且开源了代码。 代码:https://github.com/seasonSH/DocFace 摘要:日常生活中需要大量的出示…

利用人脸识别SDK实现人证比对全过程

人证比对在如今的社会中随处可见,如高铁、飞机、酒店入住、甚至景区入口都可以看到各种各样的人证应用,人脸识别SDK的也如雨后春笋一般层出不穷,如百度、商汤、Face++、虹软等。在尝试使用各家的SDK之后,最让我青睐的要数虹软科技的SDK了,最直接的一个原因就是虹软承诺永久…