Java面向对象三大特性:继承、封装、多态

news2024/12/26 23:10:51

java封装、继承、多态笔记

1.包

1.包的命名规则

(1)只能包含数字、字母、下划线、小圆点.

(2)不能用数字开头,

(3)不能是关键字或保留字

例如:

demo.class.exec1 //错误class是关键字

demo.12a //错误,以数字开头

demo.ab12.oa // 对

命名规范实例:

一般是小写字母+小圆点(一般是com.公司名.项目名.业务模块名)

比如:

com.hspedu.oa.model;

com.hspedu.oa.controller;

举例:
com.sina.crm.user//用户模块

com.sina.crm.order//订单模块

com.sina.crm.utils //工具类


2.常用的包

一个包下,包含很多的类,java中常用的包有:

java.lang.* //lang包是基本包,默认引入,不需要再引入

java.util.* //util包,系统提供的工具包,工具类,使用 Scanner

java.net.* //网络包,网络开发

java.awt.* //是做java的界面开发,GUI


3.包引入的注意事项

一个类中最多只有一个package

package的作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一个package

2.访问修饰符

1.基本介绍

java提供四种访问控制修饰符号控制方法和属性(成员变量)的访问权限(范围)

1.公开级别:用public修饰,对外公开

2.受保护级别:用protected修饰,对子类和同一个包中的类公开

3.默认级别:没有修饰符号,向同一个包的类公开

4.私有级别:用private修饰,只有类本身可以访问,不对外公开

在这里插入图片描述

3.面向对象编程的三大特点:继承、封装和多态

1.封装

1.1 封装的定义

封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。

1.2 封装的实现步骤的三部曲

1)将属性进行私有化private【不能直接修改属性】

2)提供一个公共的(public)set方法,用于对属性判断并赋值

public void setXxx(类型参数名){
//set方法用来设置或者修改属性值
//加入数据验证的业务逻辑属性=参数名;
}

3)提供一个公共的get方法,用于获取属性的值

public XX getXxx(){//权限判断
return xx;
}

1.3封装快速入门案例

案例一:

不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。

年龄合理就设置,否则给默认‘年龄必须在1-120,年龄,工资不能直接查看,name的长度在2-6之间

package com.hspedu.encap;
//不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认
//年龄必须在1-120,年龄,工资不能直接查看,name的长度在2-6之间
public class Encapsulation {
    public static void main(String[] args) {
        Person person = new Person();
        person.name="li";
        person.setAge(10);
        person.setSalary(10000);
        System.out.println(person.info());
    }
}
class Person{
    public String name;
    private int age;
    private double  salary;

    public void  setName(String name){
        if(name.length() >=2 && name.length() <=10)
            this.name = name;
        System.out.println("不合法");
    }
    public void setAge(int age) {
        if(age < 1 || age > 120)
            System.out.println("年龄不符合条件");
        this.age = age;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public String getName(){
        return name ;
    }
    public int getAge() {
        return age;
    }
    public double getSalary() {
        return salary;
    }
    //写一个方法返回字符串
    public String  info(){
        return "信息为 name="+name+"age="+age+"salary="+salary;
    }
}

案例二:

创建程序,在其中定义两个类:Account和AccountTest类,体会Java的封装性。

1.Account类要求具有属性:姓名(长度为2位3位或4位)、余额(必须>20)、密码(必须是六位),如果不满足,则给出提示信息,并给默认值

2.通过setXxx的方法给Account的属性赋值。

3.在AccountTest中测试

提示知识点:
String name= “”;int len = name.length();

package com.hspedu.encap;

public class Account{
    String name;
    double salary;
    String pass;

    public Account() {
    }

    public Account(String name, double salary, String pass) {
        this.name = name;
        this.salary = salary;
        this.pass = pass;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }


    public void setName(String name) {
        if(name.length() == 2 || name.length() == 3 || name.length() == 4)
            this.name = name;
    }

    public void setSalary(double salary) {

        if(salary >= 20){
            this.salary = salary;
        }else {
            this.salary = 0;
        }


    }

    public void setPass(String pass) {
        if(pass.length() == 6)
            this.pass = pass;
        else {
            System.out.println("密码错误");
            this.pass = "000000";
        }

    }

    public String getPass() {
        return pass;
    }

    public void showInfo(){
        System.out.println("name =" + name + "salary =" + salary + "pwd =" + pass);
    }
}
package com.hspedu.encap;

public class AccountTest {
    public static void main(String[] args) {
        Account account = new Account();
        account.setName("ping");
        account.setSalary(13);
        account.setPass("123456");
        account.showInfo();

    }
}

2.继承

1.继承的基本介绍和示意图

继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父

类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。

画出继承的示意图

在这里插入图片描述

2.继承的基本语法

class 子类 extends 父类{}

1)子类就会自动拥有父类定义的属性和方法

2)父类又叫超类,基类。

3)子类又叫派生类。

3.重点理解

1.子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问

拆分

(1)子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,除了父类中的私有方法继承后无法使用,其与方法都可以使用

父类

package com.hspedu.extend_.improve;
//父类,是pupil和graduate的父类
public class Student {
    //共有的属性
    public String name;
    private  double score;
    public int age;
	//共有的方法
    public void setScore(double score) {
        this.score = score;
    }
    public void showInfo(){
        System.out.println(age + "岁的" + name + "考试考了" + score);
    }
}

子类:假设只有显示的某个信息不一样,这个信息是子类特有的

package com.hspedu.extend_.improve;
public class Pupil extends Student {
    
    public void testInfo(){
        System.out.println("小学生" + name + "正在考小学数学");
    }
}
package com.hspedu.extend_.improve;

public class Graduate  extends Student{

    public void testInfo(){
        System.out.println("大学生"+ name + "正在考大学数学");
    }
}

测试

package com.hspedu.extend_.improve;

public class Test {
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.name="li";
        pupil.age = 10;
        pupil.setScore(100);
        pupil.testInfo();
        pupil.showInfo();
        System.out.println("==============");
        Graduate graduate = new Graduate();
        graduate.name = "ping";
        graduate.age = 20;
        graduate.setScore(98);
        graduate.testInfo();
        graduate.showInfo();
    }
}

(2)但是私有属性和方法不能在子类直接访问

刚才的年龄是共有属性

//如果把父类中年龄改成私有的
private int age;

//测试中的这一行代码会出错
  pupil.age = 10;

(3)解决上述问题:要通过公共的方法去访问

package com.hspedu.extend_;

public class Base {
    //不同的属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    //n4是私有的,Sub无法直接拿到
    private  int  n4 = 400;
    //父类中提供了一个public的方法,返回了n4,通过这个方法,Sub类中就可以拿到n4的参数
    public int getN4() {
        return n4;
    }
    //无参构造器
    public Base(){
        System.out.println("父类的无参构造器Base()被调用....");
    }
    //不同的属性
    public void Base1(){
        System.out.println("Base1()...");
    }
    void Base02(){
        System.out.println("Base2()...");
    }
    protected void  Base03(){
        System.out.println("Base03()...");
    }
    //在Sub中是无法获取的
    private void Base4(){
        System.out.println("Base4()....");
    }
    //可以通过这个方法来实现
    public void callBase4(){
        Base4();
    }
}

测试

package com.hspedu.extend_;

public class Sub extends  Base{
     public Sub(){
//         super();//默认调用父类的无参构造器,写不写都会被调用
         System.out.println("子类的无参构造器Sub()被调用...");
     }
     public void ok(){
         System.out.println("n1:"+ n1+ "\t n2:" + n2 + "\t n3:" + n3);
         //由于Base下的n4是私有的,因此无法直接拿到,但是可以将私有的属性通过共有的方法让继承后类中使用

         System.out.println("n4:"+getN4());
         Base1();
         Base02();
         Base03();
         //Base4的方法是私有的无法拿到,但是可以通过共有的方法那它在传到当前位置来
         //Base4();
         //在Base中使用了公共方法将其传入
         callBase4();

     }
}

2.子类必须调用父类的构造器,完成父类的初始化

 //尽管Sub类中的方法没有调用父类的无参构造器,但是也会显示父类无参构造器相关信息,然后显示子类的无参构造器相关信息
//上面代码的片段
public class Sub extends  Base{
     public Sub(){
//         super();//默认调用父类的无参构造器,写不写都会被调用
         System.out.println("子类的无参构造器Sub()被调用...");
     }

     public Sub(String name ){
         System.out.println("子类有参构造器Sub(String name )被调用");

     }
}

测试:
在这里插入图片描述

3.当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在

子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过[举例说明]

package com.hspedu.extend_;

public class Extendtail {
    public static void main(String[] args) {

        //尽管Sub类中的方法没有调用父类的无参构造器,但是也会显示父类无参构造器相关信息,然后显示子类的无参构造器相关信息
        Sub sub = new Sub();
        System.out.println("============");
        Sub sub1 = new Sub();
//       sub.ok();
    }
}

测试结果:默认父类无参构造器会被调用

在这里插入图片描述


指定调用构造器

public class Base {
    
    //无参构造器
//    public Base(){
//        System.out.println("父类的无参构造器Base()被调用....");
//    }
    public  Base(String name, int age){
        System.out.println("用的是父类第二个Base(String name, int age)");
    }
}
public class Sub extends  Base{
     public Sub(){
//         super();//默认调用父类的无参构造器,写不写都会被调用
         //当父类的无参构造器被覆盖时,需要指定
         //super在使用时,必须放在构造器的第一行
         //super()和this()都只能放在构造器的第一行,因此这两个方法不能共存在一个构造器里面,第一行写了super(),就不能写this()
         super("li",10);
         System.out.println("子类的无参构造器Sub()被调用...");
     }

     public Sub(String name ){
           //当父类的无参构造器被覆盖时,需要指定
         super("chen",24);
         System.out.println("子类有参构造器Sub(String name )被调用");

     }

在这里插入图片描述

4.如果希望指定去调用父类的某个构造器,则显式的调用一下: super(参数列表)

5.super在使用时,必须放在构造器第一行(super)

6.super()和 this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器

7.java所有类都是Object类的子类,Object是所有类的基类.

8.父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis学习笔记(三)

Jedis java语言连接redis工具准备工作 下载地址&#xff1a;https://mvnrepository.com/artifact/redis.clients/jedis基于maven <dependency> <groupId> redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</versi…

【面试题】面试官:你能自己实现一个async await吗?

开启掘金成长之旅&#xff01;这是我参与「掘金日新计划 12 月更文挑战」的第3天(点击查看活动详情) 相信大家对于Promise都不再陌生了&#xff0c;简易版的Promise对象源码我们也手撕过一次了&#xff0c;那接下来我们聊聊Promise的语法糖async-await&#xff0c;那让我们从…

【JavaWeb】第六章 xml

文章目录1、XML简介2、xml语法3、xml解析4、Dom4j类库的使用5、dom4j解析xml1、XML简介 xml是可扩展的标记性语言&#xff0c;xml的主要作用有&#xff1a; 用来保存数据&#xff0c;而且这些数据具有自我描述性 做为项目或者模块的配置文件做为网络传输数据的格式&#xff0…

QML 如何显示文本?Text可以有多少功能?

目录1.如何显示文本&#xff1f;2. Text有哪些主要功能&#xff1f;2.1 基本属性示例2.2 字重属性2.3 字体样式2.4 字体上标下标支持2.5 富文本2.6 文字换行 缩略1.如何显示文本&#xff1f; Text {font.pixelSize: 20; text: "这是20普通文字"} //一行即可以上代码…

12.2排序

目录 0.做题的失误 1.引用传值和传址 1.斐波那契数列 一.快速排序 1.挖坑法 2.优化 2.1 随机取数法 2.2 三数取中法 2.3把基准值相同的值移到基准旁边 2.4引用直接插入排序 3.Hoare 法: 4.非递归法 5.总结 二,归并排序 1.原理 2.代码实现 3.分析 4.非递归 5…

Git(第一篇)——Git的下载与安装(史上最全最详细)

Git&#xff08;第一篇&#xff09;——Git的下载与安装&#xff08;史上最全最详细&#xff09; 目录Git&#xff08;第一篇&#xff09;——Git的下载与安装&#xff08;史上最全最详细&#xff09;git的下载git的安装git的下载 如果你还没有下载Git&#xff0c;可直接到git…

什么是数据管理能力成熟度评估(DCMM)

GB/T 36073-2018 《数据管理能力成熟度评估模型》&#xff08;Data Management Capability Maturity Assessment Model&#xff0c;简称&#xff1a;DCMM&#xff09;是我国数据管理领域首个国家标准。该标准将组织对象的数据管理划分为八大能力域&#xff08;数据战略、数据治…

【Hbase】第一章——从原理剖析

文章目录1. HBase的实现原理1.1 HBase功能组件1.2 表和Region1.3 Region的定位2. HBase运行机制2.1 HBase系统架构2.2 Region服务器工作原理2.3 Store工作原理2.4 HLog工作原理3. HBase应用方案3.1 HBase实际应用中的性能优化方法3.2 HBase性能监视3.3 在HBase之上构建SQL引擎3…

【图像压缩】DCT图像无损压缩【含GUI Matlab源码 726期】

⛄一、DCT图像无损压缩简介 1 图像压缩 图像压缩按照压缩过程中是否有信息的损失以及解压后与原始图像是否有误差可以分为无损压缩和有损压缩两大类。无损压缩是指不损失图像质量的压缩&#xff0c;它是对文件的存储方式进行优化&#xff0c;采用某种算法表示重复的数据信息&a…

关于Jetpack Compose的初步使用、学习和总结

初步使用和学习ComposeJetpack Compose简要介绍创建一个Jetpack Compose项目自定义组合函数MessageCard通过修饰符&#xff0c;进一步改善布局为什么使用ComposeCompose 与 XML总结与期望Jetpack Compose 简要介绍 根据developers上的介绍&#xff0c;Jetpack Compose 是推荐…

【3D目标检测】Rethinking Pseudo-LiDAR Representation

目录概述细节证明基于伪点云的3D目标检测算法效果好的原因并不是伪点云这种数据表示基于深度图的图像表示的算法PatchNet证明基于伪点云的3D目标检测算法效果好的原因是从图像到点云坐标系转换的过程概述 本文是基于图像的3D目标检测算法。 贡献&#xff1a; 作者认为基于伪点…

开放式运动耳机排行榜,排行靠前的五款高性能耳机分享

智能产品的发展迅猛&#xff0c;作为生活必需品的耳机&#xff0c;更是在不断的更新&#xff0c;尤其是对于运动爱好者而言&#xff0c;以往的入耳式蓝牙耳机存在汗渍入耳等问题。而为了有效解决这一些列问题&#xff0c;新型的骨传导耳机随之诞生了&#xff0c;相比入耳式的蓝…

一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; Python3◉技能提升系列&#xff1a;https://www.showmeai.tech/tutorials/56 &#x1f4d8; 计算机视觉实战系列&#xff1a;https://www.showmeai.tech/tutorials/46 &#x1f4d8; 本文地址&#xff1a;https://…

直播 | 数据仓库?数据湖?停止纠结,流批融合的极速 Lakehouse来了!

万物皆数据的时代&#xff0c;各行各业对数据分析架构的要求日益拔高&#xff0c;打破传统的数据湖应需而生。企业得以用更低廉的成本、更完善的 ACID 支持、更实时的方式&#xff0c;导入并存储所有结构化、半结构化和非结构化数据。得益于数据湖良好的伸缩性和灵活性&#xf…

jQuery 安装

网页中添加 jQuery 可以通过多种方法在网页中添加 jQuery。 您可以使用以下方法&#xff1a; 从 jquery.com 下载 jQuery 库从 CDN 中载入 jQuery, 如从 Google 中加载 jQuery下载 jQuery 有两个版本的 jQuery 可供下载&#xff1a; Production version - 用于实际的网站中…

渲染时间过长?这些参数设置学起来

渲染时间 为了契合创作者的需求&#xff0c;V-Ray渲染器近年来迭代迅速&#xff0c;新版本的上线&#xff0c;便利了更多用户。但也有小伙伴在使用后反馈&#xff1a; 我的渲染器明明已经升级到最高版本了&#xff0c;为什么渲染时间还这么慢&#xff1f; 实际上&#xff0c;出…

如何通过一个项目征服Java

Java早已经不是高大山的稀世珍品了&#xff0c;程序员也不再是高科技工作者&#xff0c;而被称为码农 &#xff0c;为什么呢&#xff1f;因为Java后台的很多基础技术都已经固定了&#xff0c;也就是说主要你从头到尾学一遍就能会 &#xff0c;淘宝双十一搞不定&#xff0c;但是…

2022年12月深圳/珠海/佛山/东莞数据分析CPDA认证报名

2022年12月深圳/珠海/佛山/东莞数据分析CPDA认证报名 CPDA数据分析师认证是中国大数据领域有一定权威度的中高端人才认证&#xff0c;它不仅是中国较早大数据专业技术人才认证、更是中国大数据时代先行者&#xff0c;具有广泛的社会认知度和权威性。 无论是地方政府引进人才、…

HAL库(STM32CubeMX)之看门狗学习及实操(STM32F767IGTX)

系列文章目录 HAL库&#xff08;STM32CubeMX&#xff09;——ADC学习总结&#xff08;包含单次/连续模式下的轮询/中断/DMA&#xff09;&#xff08;蓝桥杯STM32G431RBT6&#xff09; HAL库(STM32CubeMX)——DAC学习&#xff08;STM32G431RBT6&#xff09; HAL库(STM32CubeM…

Innodb如何实现表--上篇

Innodb如何实现表--上篇数据是如何被管理起来的表空间段区页行行记录格式Compact记录行格式Redundant行记录格式行溢出数据Compressed和Dynamic行记录格式Char的行存储结构小结数据是如何被管理起来的 从InnoDB存储引擎的逻辑存储结构看&#xff0c;所有数据都被逻辑地存放在一…