Java笔记七(封装,继承与多态)

news2024/12/28 5:43:01

封装

该露的露,该藏的藏

程序设计追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用

封装(数据的隐藏)

通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问

属性私有

package com.oop.demo04;
//类 private:私有
public class Student {
    //属性私有
    private String name; //名字
    private int id;   //学号
    private char sex;    //性别
package com.oop.demo04;

public class Application {
    public static void main(String[] args) {
        Student s1=new Student();
        s1.name//错误代码
    }
}

此时如果直接调用s1.name则会报错,因为属性私有

正确方法:

package com.oop.demo04;
//类 private:私有
public class Student {
    //属性私有
    private String name; //名字
    private int id;   //学号
    private char sex;    //性别

    //提供一些可以操作这个属性的方法
    //提供一些public的get.set方法
    //get获得这个数据
    public  String getName(){
        return this.name;
    }
    //set给这个数据设置值
    public void setName(String name){
        this.name=name;
    }

}
package com.oop.demo04;

public class Application {
    public static void main(String[] args) {
        Student s1=new Student();
        s1.setName("佳伟");
        System.out.println(s1.getName());
    }
}

快捷键alt+ins快速生成get和set方法

对用户的输入进行限制,以年龄为例:

package com.oop.demo04;
//类 private:私有
public class Student {
    //属性私有
    private String name; //名字
    private int id;   //学号
    private char sex;//性别
    private int age;

    //提供一些可以操作这个属性的方法
    //提供一些public的get.set方法
    //get获得这个数据
    public  String getName(){
        return this.name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {//对输入不合法的年龄进行限制
        if (age>120||age<0){
            this.age=3;
        }else {
            this.age=age;
        }
    }

    //set给这个数据设置值
    public void setName(String name){
        this.name=name;


    }

}
package com.oop.demo04;

public class Application {
    public static void main(String[] args) {
        Student s1=new Student();
        s1.setName("佳伟");
        System.out.println(s1.getName());
        s1.setAge(999);
        System.out.println(s1.getAge());
    }
}

此时年龄便会输出不合法

封装的意义:

1.提高程序的安全性,保护数据

2.隐藏代码的实现细节

3.统一接口

4.系统可维护性

继承

继承的本质是对某一批类的抽象

extends的意思是“扩展”。子类是父类的扩展

JAVA中类只有单继承,没有多继承

继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。

假设Person是父类,Student与Teacher是子类

则可这样写

package com.oop.demo05;

public class Person {
}
package com.oop.demo05;

public class Student extends Person {
}
package com.oop.demo05;

public class Teacher extends Person {
}

子类继承父类,就会拥有父类的全部方法

package com.oop.demo05;

public class Person {
    public void say(){
        System.out.println("说了一句话");
    }
}
package com.oop.demo05;

public class Application {
    public static void main(String[] args) {
        Student student=new Student();
        student.say();
    }
}

但是拥有父类的所有方法不代表可以使用父类的所有方法,例如使用封装的关键词private

package com.oop.demo05;

public class Person {
    private int money=10_0000_0000;
    public void say() {
        System.out.println("说了一句话");
    }
        public int getMoney(){
            return money;
        }
        public void setMoney(int money){
            this.money=money;
        }
    }

则子类需使用父类设置的方法使用

package com.oop.demo05;

public class Application {
    public static void main(String[] args) {
        Student student=new Student();
        student.say();
        System.out.println(student.getMoney());
    }
}

IDEA快捷键:

ctrl+H:查看程序树

super

调用父类,如下

package com.oop.demo05;

public class Student extends Person {
    private String name="jiawei";
    public void print(){
        System.out.println("Student");
    }
    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);//调用父类

    }
}
package com.oop.demo05;

public class Person {
    protected String name="weiwei";
    public void print(){
        System.out.println("Person");
    }
}
package com.oop.demo05;
import com.oop.demo05.Person;
import com.oop.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student=new Student();
        student.test("佳伟");
    }
}

运行结果如下

调用父类方法:

package com.oop.demo05;

public class Person {
    protected String name="weiwei";
    public void print(){
        System.out.println("Person");
    }
}
package com.oop.demo05;

public class Student extends Person {
    private String name="jiawei";
    public void print(){
        System.out.println("Student");
    }
    public void test1(){
        print();//当前类
        this.print();//当前类
        super.print();//调用父类
    }
    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);//调用父类

    }

}
package com.oop.demo05;
import com.oop.demo05.Person;
import com.oop.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student=new Student();
        //student.test("佳伟");
        student.test1();
    }
}

运行结果如下

私有的东西同样无法被继承

注意调用父类的构造器必须放在子类构造器的第一行

super注意点

1.super调用父类的构造方法,必须在构造方法的第一个

2.super必须只能出现在子类的方 法或者构造方法中

3.super和this不能同时调用构造方法

与this对比

代表的对象不同

this:本身调用者这个对象

super:代表父类对象的应用

前提

this:没有继承也可以使用

super:只能在继承条件才可以使用

this():本类的构造

super():父类的构造

方法的重写

静态方法:

package com.oop.demo05;

public class A extends B{
    public static void test() {
        System.out.println("A=>test()");
    }
}
package com.oop.demo05;

public class A extends B{
    public static void test() {
        System.out.println("A=>test()");
    }
}
package com.oop.demo05;

import com.oop.demo05.A;
import com.oop.demo05.B;

public class Application {
    public static void main(String[] args) {
        //方法的调用只和左边,定义的数据类型有关
        A a=new A();
        a.test();
        //父类的引用指向了子类
        B b=new A();
        b.test();

    }
}

运行结果如下:

可以发现方法的调用只和左边,定义的数据类型有关

非静态方法的重写:

A与B同时去掉static

package com.oop.demo05;

public class B {
    public void test() {
        System.out.println("B=>test()");
    }
}
package com.oop.demo05;

public class A extends B{
    public void test() {
        System.out.println("A=>test()");
    }
}
package com.oop.demo05;

import com.oop.demo05.A;
import com.oop.demo05.B;

public class Application {
    public static void main(String[] args) {
        //方法的调用只和左边,定义的数据类型有关
        A a=new A();
        a.test();
        //父类的引用指向了子类
        B b=new A();//子类重写了父类的方法
        b.test();

    }
}

运行结果如下

alt+ins快捷键:快速重写方法

静态的方法与非静态的方法区别很大

此时子类才重写了父类的方法,才算重写

重写的关键词只能是public

重写:需要有继承关系,子类重写父类的方法!

1.方法名必须相同

2.参数列表必须相同

3.修饰符:范围可以扩大:public>Protected>Default>private

4.抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException——>Exception(大)

重写,子类的方法和父类必要一致;方法体不同!

为什么需要重写:

父类的功能,子类不一定需要或者不一定满足

多态

package com.oop.demo06;

public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //new Student();
        //new Person();
        //可以指向的引用类型就不确定了
        //Student能调用的方法都是自己的或者继承父类的
        Student s1=new Student();
        //Person父类型,可以指向子类,但是不难调用子类独有的方法
        Person s2=new Student();//父类的引用指向子类
        //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
        s2.run();//子类重写了父类的方法,执行子类的方法
        s1.eat();
    }
}

.

package com.oop.demo06;

public class Student extends Person {
    @Override
    public void run() {
        System.out.println("son");
    }
    public void eat(){
        System.out.println("eat");
    }
}
package com.oop.demo06;

public class Person {
    public void run(){
        System.out.println("run");

    }
}

运行结果:

子类能调用的方法都是自己的或者继承父类的

父类型可以指向子类,但是不能调用子类独有的方法

可以强制类型转换把s2从父类转换成子类

((Student)s2).eat();

多态注意事项:

1.多态是方法的多态,属性没有多态

2.父类和子类有联系 否则有类型转换异常 ClassCastException

2.存在条件:继承关系,方法需要重写,父类引用指向子类对象

不能重写的关键词:

1.static 方法,属于类,它不属于实例

2.final 常量

2.private方法

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

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

相关文章

mysql面试题20:有哪些合适的分布式主键方案

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:有哪些合适的分布式主键方案? UUID:UUID通常是由一个二进制的128位整数表示,可以保证全局的唯一性。在Java中,可以通过UUID类生成一个UUID。例…

《计算机视觉中的多视图几何》笔记(13)

13 Scene planes and homographies 本章主要讲述两个摄像机和一个世界平面之间的射影几何关系。 我们假设空间有一平面 π \pi π&#xff0c;平面上的一点为 x π x_{\pi} xπ​。 x π x_{\pi} xπ​分别在两幅图像 P , P ′ P, P P,P′上形成了 x , x ′ x, x x,x′。 那…

基于Java的流浪动物救助平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

安卓教材学习

文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要&#xff1a;选了几本教材《第一行代码 Android 第3版》&#xff0c;记录一下跑案例遇到的问题&#xff0c;和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…

全志ARM926 Melis2.0系统的开发指引⑥

全志ARM926 Melis2.0系统的开发指引⑥ 编写目的9. 系统启动流程9.1. Shell 部分9.2.Orange 和 desktop 部分9.3. app_root 加载部分9.4. home 加载部分 10. 显示相关知识概述10.1. 总体结构10.2. 显示过程10.3. 显示宽高参数关系 -. 全志相关工具和资源-.1 全志固件镜像修改工具…

【网站】让自己的个人主页能被Google检索

参考&#xff1a; https://zhuanlan.zhihu.com/p/129022264

计算机毕业设计 基Javaweb的校园订餐系统的设计与实现Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

C++设计模式-生成器(Builder)

目录 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二、…

全志ARM926 Melis2.0系统的开发指引⑤

全志ARM926 Melis2.0系统的开发指引⑤ 编写目的8. 固件修改工具(ImageModify)使用8.1.界面说明8.2.操作步骤8.2.1. 配置平台8.2.2. 选择固件8.2.3. 选择要替换的文件8.2.4. 替换文件8.2.5. 保存固件 8.3.注意事项8.4.增加固件修改权限设置8.4.1. 概述8.4.2. 操作说明8.4.2.1.打…

字符串函数的模拟实现

引言&#xff1a;对于字符串来说&#xff0c;我们通常想要对其完成各种各样的目的&#xff0c;不管是排序还是查找都是最普遍的功能&#xff0c;而我们的C语言中也包含着一系列函数是为了实现对字符串的一些功能&#xff0c;今天我们就来介绍他们。 strlen函数&#xff1a; 求字…

基于SpringBoot的车辆管理系统

目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 证件信息管理 车辆信息管理 事故登记管理 事故登记 保养登记 违章登记 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

C++设计模式-原型(Prototype)

目录 C设计模式-原型&#xff08;Prototype&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-原型&#xff08;Prototype&#xff09; 一、意图 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 二、适用性 当…

@ConfigurationProperties配置绑定~

ConfigurationProperties注解是Spring Boot中的一个注解&#xff0c;用于将配置文件中的属性值绑定到Java类中的字段上。 ConfigurationProperties注解的作用包括&#xff1a; 实现配置文件属性和Java类字段的映射&#xff0c;简化了读取配置文件的操作。 可以指定配置文件中…

1.3.OpenCV技能树--第一单元--图像的基础操作(基础篇)

文章目录 1.文章内容来源2.图像的基本操作2.1.图像加载2.2.图像显示2.3.数据读取2.4.截取图像2.5.颜色通道提取2.5.1.保留红色处理2.5.2.保留绿色处理2.5.3.保留蓝色处理 3.易错点总结与反思 1.文章内容来源 1.题目来源: 2.资料来源:https://edu.csdn.net/skill/opencv/opencv…

ALSA pcm接口的概念解释

PCM(数字音频)接口 PCM缩写: Pulse Code Modulation脉冲调制编码,我们理解为通过一定连续时间周期产生数字音频并带有音量样本的处理过程. 模拟信号被记录通过模拟到数字转换器,数字值(也就是某个特定时刻的音量值)获得来自ADC可以进一步处理,接下的图片展示的是个sine wavefor…

【BBC新闻文章分类】使用 TF 2.0和 LSTM 的文本分类

一、说明 NLP上的许多创新是如何将上下文添加到词向量中。常见的方法之一是使用递归神经网络

【user_key_payload、msg_msg、pipe_buffer】再探RWCTF2023-Digging-into-kernel-3

前言 在之前的文章中&#xff0c;我利用 ldt_struct 去泄漏的内核基地址&#xff0c;但是在内核中还存在着一些结构体可以去泄漏内核基地址。 user_key_payload 越界读泄漏内核基地址 本题并没有开启 slab_freelist_random 保护&#xff0c;并且可以可以同时控制两个堆块&am…

[图论]哈尔滨工业大学(哈工大 HIT)学习笔记16-22

视频来源&#xff1a;2.7.1 补图_哔哩哔哩_bilibili 目录 1. 补图 1.1. 补图 2. 双图 2.1. 双图定理 3. 图兰定理/托兰定理 4. 极图理论 5. 欧拉图 5.1. 欧拉迹 5.2. 欧拉闭迹 5.3. 欧拉图 5.4. 欧拉定理 5.5. 伪图 1. 补图 1.1. 补图 &#xff08;1&#xff09;…

使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面

使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面 使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面 使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面什么是图形视图框架(Graphics View Framework)&#xff1f;…

MATLAB算法实战应用案例精讲-【优化算法】沙丁鱼优化算法(SOA)(附MATLAB代码实现)

前言 沙丁鱼优化算法(Sardine optimization algorithm,SOA)由Zhang HongGuang等人于2023年提出,该算法模拟沙丁鱼的生存策略,具有搜索能力强,求解精度高等特点。 沙丁鱼主要以浮游生物为食,这些生物包括细菌、腔肠动物、软体动物、原生动物、十足目、幼小藤壶、鱼卵、甲藻…