Java语言程序设计——篇七(2)

news2024/9/22 17:31:24

在这里插入图片描述

     🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

封装性与多态

  • 封装性与访问修饰符
    • 类的访问权限
    • 类成员的访问权限
  • 🌠防止类扩展和方法覆盖
      • 实战演练
  • 抽象类
      • 实战演练
  • 对象转换
      • 实战演练
  • instanceof运算符
  • 多态与动态绑定
      • 实战演练
      • 实战演练

封装性与访问修饰符

对象的封装

  • 通过包实现封装性
    包是JAVA中最大的封装单位,定义了成员的访问权限。
  • 通过类和类的成员访问权限实现
    比如:private

类的访问权限

类的访问权限通过修饰符public实现,若缺省访问修饰符的类仅能被同一个包的类使用

package com.demo;
public class Employee {
	public Employee(){
		System.out.println("创建Employee对象");
	}
}
package com.xxxxx;
import com.demo.Employee;
public class EmployeeTest {
	public static void main(String[] args){
		Employee emp = new Employee();
	}
}

不在同一个包中,需要import导入。若同一包中,则不需要

类成员的访问权限

类成员的访问权限包含成员变量和成员方法的访问权限
(1) private:私有成员,只能本类访问,最能体现封装性,实现隐藏
(2) protected:保护成员,可以被类本身访问;也可以被同一包中的类以及该类的子类访问
(3) public:公共成员,可以被任何其他类访问
(4) 缺省:包可访问的,成员被本类或同一个包中的类访问。
在这里插入图片描述

🌠防止类扩展和方法覆盖

  • 使用final修饰类,该类(public final class EmployeeTest {}
    该类为最终类,不能被继承)
    就成了最终类 (不能被继承)
  • 如果用final来修饰类的成员,则该成员为最终成员。
  • 若父类的成员不希望被子类的成员所覆盖,则可将它们声明为final。final成员可被继承,但不能被覆盖。
  • 成员变量若同时被static和final修饰,则表示常量,若没有初始化则按默认值初始化。
  • 仅用final不用static修饰则必须且只能赋值一次,不能默认。方式:定义时赋值;构造方法赋值。

实战演练

public final class Parent {}

在这里插入图片描述
在这里插入图片描述

public class Parent {
	public final void setXY(int x,int y){}
}
public class Child extends Parent{
	public void setXY(int x,int y){}		
}

出现错误在这里插入图片描述

public static final int Size = 10;	
	int data 
	public void add(){
		Size = Size + 1;
		data = data + Size;
	}

出现错误
在这里插入图片描述

抽象类

抽象类有点类似“模板”的作用,其目的是根据它的格式来创建和修改新的类。但是并不能直接由抽象类创建对象,只能通过抽象类派生出新的子类,再由其子类来创建对象。即,抽象类就是不能用new运算符来创建实例对象的类,它可以作为父类被它的所有子类所共享。

  • 抽象类的定义格式:
abstract class 类名
    {
        声明成员变量;
        返回值的数据类型 方法名(参数表)
          {
              ……
          } 
         abstract  返回值的数据类型 方法名(参数表);
     }

在抽象方法里,不能定义方法体。只需声明不需实现。
说明:
①抽象类的子类必须实现父类中的所有抽象方法,即抽象方法必须被子类的方法所覆盖,或将自己也声明成抽象方法。
②由于抽象类是需要被继承的,所以abstract类不能用final来修饰。也就说,一个类不能既是最终类,又是抽象类,即关键字abstract与final不能合用。
抽象类中不一定包含抽象方法,但包含抽象方法的类一定要声明为抽象类。
④抽象类可以有构造方法,且可被子类构造方法所调用,但构造方法不能被声明为抽象的。抽象类不能创建实例,一般情况,不会定义构造方法。

实战演练

【例】抽象类的应用举例,定义一个形状抽象类Shape,以该抽象类为父类派生出圆形子类Circle和矩形子类Rectangle。

abstract class Shape
{
  protected String name;
  public Shape(String xm)
  {
    name=xm;
    System.out.print("名称:"+name);
  }
  abstract public double getArea();
  abstract public double getLength();
}
class Circle extends Shape
{
  private final double PI=3.14;
  private double radius;
  public Circle(String shapeName, double r)
  {
    super(shapeName);
    radius=r;
  }
  public double getArea() 
  {  return PI*radius*radius; }
  public double getLength()
  {  return 2*PI*radius;  }
}
class Rectangle extends Shape
{
  private double width;
  private double height;
  public Rectangle(String shapeName,double width,double height)
  {
    super(shapeName);
    this.width=width;
    this.height=height;
  }
  public double getArea()
  {  return width*height;  }
  public double getLength()
  {  return 2*(width+height);  }
}
public class App {
  public static void main(String[] args){
    Shape rect =new Rectangle("长方形",6.5,10.3);
    System.out.print(";面积="+rect.getArea());
    System.out.println(";周长="+rect.getLength());
    Shape circle=new Circle("圆",10.2);
    System.out.print(";面积="+circle.getArea());
    System.out.println(";周长="+circle.getLength());
  }
}

运行结果:
在这里插入图片描述

对象转换

对象转换:子类对象与父类对象在一定条件下可以相互转换。
在这里插入图片描述
在这里插入图片描述

实战演练

【例】类的继承,创建Person类,再以该类为父类创建一个子类Employee。(回顾)

public class Person {
	public String name;
	public int age;
	public Person(){}
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public void sayHello(){
		System.out.println("My name is"+name);
	}
}
public class Employee extends Person {
	public double salary;
	public Employee(){}
	public Employee(double salary){
		this.salary = salary;
	}
	public Employee(String name,int age, double salary){
		super(name,age);
		this.salary = salary;
	}
	public double computeSalary(int hours, double rate){
		double salary = hours * rate;
		return this.salary + salary;
	}
}

【例】对象转换

public class EmployeeTest {
public static void main(String[] args){
	Employee emp = new Employee("李菲菲",23,5000);
	System.out.println(emp);
	Person p = emp;
	System.out.println(p);
	p.sayHello();
		
	Employee yy = (Employee)p;
	System.out.println(yy.computeSalary(10, 50.0));
	}
}

instanceof运算符

对象运算符instanceof
可利用对象运算符instanceof在运行时来测试一个指定对象是否是指定类或它的子类的实例,若是则返回true,否则返回false。

class Person { }
class Man extends Person{ }
Person p1 = new Person();
Person p2 = new Man();
Man m1 = new Man();
System.out.println(p1 instanceof Man);//false
System.out.println(p2 instanceof Man);//true
System.out.println(m1 instanceof Man);//true

多态与动态绑定

  • 多态 某种抽象的动作由特定的方式实现,特定的方式取决于执行该动作的对象。
  • 可以简单理解为多态就是“相同的表达式,不同的操作”或“相同的命令,不同的操作”
    多态分为:
        ①静态多态----重载实现
        ②动态多态----覆盖实现

实战演练

多态与动态绑定----动态多态

public class Person {
	public String name;
	public void sayHello(){
		System.out.println("My name is"+name);
	}
	public void sayHello(String s){
		System.out.println("My name is"+s);
	}
	public void sayHello(String s,int ss){
		for(int i = 0; i < ss; i++)
		System.out.println("My name is"+s);
	}
}

实战演练

多态与动态绑定----静态多态

public class Animal{
	public abstract void eat(){}
}
public class Dog extends Animal{
	public void eat(){
		System.out.println(“eat bone!");
	}
}
public class Cat extends Animal{
	public void eat(){
		System.out.println(“eat fish!");
	}
}

博主用心写,读者点关注,互动传真情,知识不迷路

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

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

相关文章

github的Codespaces是什么

目录 github的Codespaces是什么 一、定义与功能 二、特点与优势 三、工作原理 四、使用场景与限制 github的Codespaces是什么 GitHub的Codespaces是一个基于云的即时开发环境,它利用容器技术为开发者提供一个完全配置好的开发环境,以便他们能够直接在浏览器或通过Visua…

《中国数据库前世今生》观影——认识1980年起步阶段

引出 中国数据库的前世今生观影——认识1980年的起步阶段 20 世纪 60 年代国外就有了商业数据库&#xff0c;20 世纪 80 年代我国才有了第一批数据库专业人才。不要小看这 20 年的差距&#xff0c;它可能需要几代数据库人用一生去追。2024 年了&#xff0c;中国跨过数据库这座大…

【Android】Fragment的数据传递

碎片和活动之间的通信 Activity向Fragment 通过方法传递 构造方法 将碎片动态地加载到活动当中&#xff0c;先得到一个碎片&#xff0c;再将其放到活动当中。就想到碎片的替代方法&#xff0c;将我们所要传输的数据直接放到新创建的碎片里面&#xff0c;替换到原来的碎片。…

【C++】C++应用案例-大整数相加

实际应用中&#xff0c;有时会遇到非常大的整数&#xff0c;可能会超过long、甚至long long的范围。这时就需要用不限长度的字符串保存数据&#xff0c;然后进行计算。 最简单的需求就是“大整数相加”&#xff0c;即给定两个字符串形式的非负大整数 num1 和num2 &#xff0c;计…

深入理解SQL中的INNER JOIN操作

本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较。INNER JOIN是关系数据库中常用的操作&#xff0c;用于返回两个表中匹配的行&#xff0c;只有在连接条件满足时才返回数据。本文详细解释了INNER JOIN的语法及其在一对多、多对多关系中的应用&#xff0c;通…

【YOLOv5/v7改进系列】引入中心化特征金字塔的EVC模块

一、导言 现有的特征金字塔方法过于关注层间特征交互而忽视了层内特征的调控。尽管有些方法尝试通过注意力机制或视觉变换器来学习紧凑的层内特征表示&#xff0c;但这些方法往往忽略了对密集预测任务非常重要的被忽视的角落区域。 为了解决这个问题&#xff0c;作者提出了CF…

day05 Router、vuex、axios

配置 router和vuex需要在创建vue项目的时候&#xff0c;开始的时候选择Manually select features&#xff0c;于是就可以在下一个创建配置讯问中选择router和vuex。 axios则需要执行命令行&#xff1a; npm install axios -S 之后再在需要发送请求的view导入即可。 router…

Pytorch基础:Tensor的squeeze和unsqueeze方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;squeeze和unsqueeze是Tensor的一个重要方法&#xff0c;同时它们也是torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.…

堆的基本实现

一、堆的概念 在提出堆的概念之前&#xff0c;首先要了解二叉树的基本概念 一颗二叉树是节点的有限集合&#xff0c;该集合&#xff1a; 1、或者为空&#xff1b; 2、或者由一个根节点加上两颗分别称为左子树和右子树的两颗子树构成&#xff1b; 堆就是一颗完全二叉树&…

Python学习笔记45:游戏篇之外星人入侵(六)

前言 飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。 子弹模块 子弹和飞船模块&#xff0c;在游戏逻辑中有一种生成与被生成的表面关系&#xff0c;因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中&#xff0c;飞船与子弹并不是is的关系&#xff0…

【机器学习】机器学习之多变量线性回归-Multiple_Variable_Soln

引言 扩展数据结构和之前开发的例程&#xff0c;以支持多个特征。有几个例程被更新&#xff0c;使得实验看起来有些冗长&#xff0c;但实际上只是对之前的例程进行了小的调整&#xff0c;因此快速回顾是可行的 文章目录 引言一、多变量线性回归1.1 目标1.2 工具 二、问题陈述2.…

2024年【山东省安全员C证】考试题及山东省安全员C证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员C证考试题为正在备考山东省安全员C证操作证的学员准备的理论考试专题&#xff0c;每个月更新的山东省安全员C证复审考试祝您顺利通过山东省安全员C证考试。 1、【多选题】.以下属于建设单位的质量行…

【SpringBoot教程:从入门到精通】掌握Springboot开发技巧和窍门(四)-Vue项目配置环境、导航栏

主要写前端页面&#xff0c;采用vue框架写页面的导航栏&#xff01;&#xff01;&#xff01; 文章目录 前言 Vue项目配置环境 安装依赖 创建菜单 总结 前言 主要写前端页面&#xff0c;采用vue框架写页面的导航栏&#xff01;&#xff01;&#xff01; Vue项目配置环境 安装…

[练习]如何使用递归算法?

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 递归概述 2.汉诺塔问题 题目描述​编辑 题解 代码实现 3…

扫雷小游戏纯后端版

package com.wind;import java.util.Random; import java.util.Scanner;public class ResultLei {static Random random new Random();public static void main(String[] args) {boolean end true;while (end) {System.out.println("请输入你选择的难度对应的数字&#…

虚拟机centos9搭建wordpress

目录 1. 更换yum源更新系统软件包&#xff1a; 1.1备份yum源 1.1.1创建备份目录&#xff1a; 1.1.2移动现有仓库配置文件到备份目录&#xff1a; 1.1.3验证备份&#xff1a; 1.2更换yum源 1.2.1添加yum源 1.2.2删除和建立yum缓存 1.3更新系统软件包 1.4 yum与dnf介绍…

springboot使用Gateway做网关并且配置全局拦截器

一、为什么要用网关 统一入口&#xff1a; 作用&#xff1a;作为所有客户端请求的统一入口。说明&#xff1a;所有客户端请求都通过网关进行路由&#xff0c;网关负责将请求转发到后端的微服务 路由转发&#xff1a; 作用&#xff1a;根据请求的URL、方法等信息将请求路由到…

线程池的理解以及实现线程池

线程池可以干什么&#xff1a; 帮助我们减少线程的创建和销毁提高系统资源的利用率&#xff0c;同时控制并发执行的线程数量便于管理且提高响应速度 线程池的工作流程&#xff1a; 1.创建线程池 线程池的创建是通过 Executors 工厂方法或直接使用 ThreadPoolExecutor 构造函…

遇到Websocket就不会测了?别慌,学会这个Jmeter插件轻松解决....

websocket 是一种双向通信协议&#xff0c;在建立连接后&#xff0c;websocket服务端和客户端都能主动向对方发送或者接收数据&#xff0c;而在http协议中&#xff0c;一个request只能有一个response&#xff0c;而且这个response也是被动的&#xff0c;不能主动发起。 websoc…

C语言 ——— 数组指针的定义 数组指针的使用

目录 前言 数组指针的定义 数组指针的使用 前言 之前有编写过关于 指针数组 的相关知识 C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 指针数组 顾名思义就是 存放指针的数组 那什么是数组指针呢&#xff1f; 数组指针的定义 何为数组指针&#xf…