Java学习笔记(11)

面向对象进阶

Static

静态变量

所有对象一起共享,就用static修饰

不属于对象,属于类的 可以用   类名.静态变量 = “”;赋值

但是  对象.静态变量也可以访问到内容

Static内存图

Student这个类的字节码文件加载到方法区,并在内存中创建了一个单独存放静态变量的空间,叫做静态区(JDK8之前是在方法区里的,之后就在堆内存中)。

静态区存放所有的静态变量。

此时,堆内存中还没有对象,因为没有new关键字出现。

所以,静态变量是随着类的加载而加载的,优先于对象出现的

对象空间里则存储所有非静态的成员变量。

静态方法

Javabean类 测试类 工具类

为什么要私有化?

为了不让创建对象,创建出来的对象没有意义,所以直接设为private

package exercise;import java.util.StringJoiner;public class ArrayUtil {private ArrayUtil() {}public static String printArr(int[] arr) {StringJoiner sj = new StringJoiner(", ", "[", "]");for (int i = 0; i < arr.length; i++) {sj.add(arr[i] + "");}return sj.toString();}public static double getAverage(double[] arr) {double sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}return sum / arr.length;}}

public static int getMaxAge(ArrayList<Student> arrayList) {int maxAge = arrayList.get(0).getAge();for (int i = 1; i < arrayList.size(); i++) {int age = arrayList.get(i).getAge();maxAge = maxAge > age ? maxAge : age;}return maxAge;}

静态方法中没有this

因为,静态方法中一般都是对象共享的,与某个对象是没有关系的

this表示当前方法调用者的地址值,而静态方法不能被对象调用(只能被类调用),所以静态方法中就不存在this

而非静态方法中,方法是通过对象来调用的,所以在方法的形参中会有一个隐藏的this来表示当前调用者的地址值,通常都会省略这个this不写。

静态中用this会报错,不知道是调用的谁的name

Main方法

继承

父类 子类

什么时候用?

继承特点

如果一个父类中的方法中使用了private,则子类就不能访问这个方法,只有在本类中才能用

所以,子类只能访问父类中非私有的成员

构造方法不能继承

成员变量都能继承,但是子类不能直接用

继承内存

方法区中加载该类的字节码文件,如果该类有父类,则要一同添加到方法区

创建新的类对象,如果该类是有继承父类的,则对象中会把空间分为两块

一块用来存父类的成员变量,一块存子类的成员变量

如果父类的成员变量变为私有private

能继承,但子类无法直接赋值

成员方法能否被继承

虚方法表:父类给子类的,包含经常用到的方法

只有虚方法才能被继承

Object有5个方法可以加载到虚方法表里

父类的private方法不能被继承

准确讲,父类中只有虚方法表中的成员方法能够被子类继承

继承中成员变量的特点

Name前面没有东西,就近原则

This.name 就是本类的成员变量name

Super.name 就是父类的成员变量name

子类中一次只能调用一个super,没有super.super.name

继承中成员方法的访问特点

一样是就近原则

This,super分别访问子类和父类的

重写父类的方法

方法重写的本质:子类覆盖了从父类继承的虚方法表里的方法

重写的时候,如果父类的方法比较多,可以直接super.eat();执行父类的方法

后面再写上子类的添加的重写内容

如果完全用不上父类的方法,就不用写super了,直接写上子类要重写的方法

方法重写总结

构造方法在继承中的访问方法

Super():默认调用父类的无参构造,一定要写在第一行,可以不写

Super(name,age):调用父类的有参构造,必须手写出来

This,super总结

This()同样要写在第一行,其实就是在调用空参构造时,给一个默认值,这样成员变量就不是空值了

练习

package exercise2;public class Test {public static void main(String[] args) {Lecturer lecturer = new Lecturer();lecturer.work();String name = lecturer.getName();System.out.println(name);}
}package exercise2;public class Employee {private String id;private String name;public Employee() {}public Employee(String id, String name) {this.id = id;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void work(){System.out.println("员工在工作!");}
}package exercise2;public class Teacher extends Employee{public Teacher() {}public Teacher(String id, String name) {super(id, name);}}package exercise2;public class AdminStaff extends Employee{public AdminStaff() {}public AdminStaff(String id, String name) {super(id, name);}
}package exercise2;public class Lecturer extends Teacher{public Lecturer() {this(null,"zhansan");System.out.println("1111");}public Lecturer(String id, String name) {super(id, name);}@Overridepublic void work() {super.work();System.out.println("讲师在教书");}
}package exercise2;public class Tutor extends Employee{public Tutor() {}public Tutor(String id, String name) {super(id, name);}@Overridepublic void work() {super.work();System.out.println("助教在准备ppt");}
}package exercise2;public class Maintainer extends AdminStaff{public Maintainer() {}public Maintainer(String id, String name) {super(id, name);}@Overridepublic void work() {super.work();System.out.println("维护专员在维护");}
}package exercise2;public class Buyer extends AdminStaff{public Buyer() {}public Buyer(String id, String name) {super(id, name);}@Overridepublic void work() {super.work();System.out.println("采购员工在采购");}
}

多态

没有继承就没有多态

创建子类的对象赋值给父类的类型

多态

调用成员变量:编译看左边,运行也看左边

调用成员方法:编译看左边,运行看右边

多态

方法区在加载字节码文件,都是先加载父类的字节码文件,再加载子类的字节码文件

多态的优势

多态的弊端

不能调用子类的特有方法

如果要用,就要转换子类类型

A instanceof B:判断A是不是B类型的,返回true/false

JDK14之后

A instanceof B d:判断A是不是B类型的,如果是则转换为B类型,转换之后变量名为d,返回true/false

总结

根据需求完成代码:

1.定义狗类

属性:

年龄,颜色

行为:

eat(String something)(something表示吃的东西)

看家lookHome方法(无参数)

2.定义猫类

属性:

年龄,颜色

行为:

eat(String something)方法(something表示吃的东西)

逮老鼠catchMouse方法(无参数)

3.定义Person类//饲养员

属性:

姓名,年龄

行为:

keepPet(Dog dog,String something)方法

功能:喂养宠物狗,something表示喂养的东西

行为:

keepPet(Cat cat,String something)方法

功能:喂养宠物猫,something表示喂养的东西

生成空参有参构造,set和get方法  

4.定义测试类(完成以下打印效果):

keepPet(Dog dog,String somethind)方法打印内容如下:

年龄为30岁的老王养了一只黑颜色的2岁的狗

2岁的黑颜色的狗两只前腿死死的抱住骨头猛吃

keepPet(Cat cat,String somethind)方法打印内容如下:

年龄为25岁的老李养了一只灰颜色的3岁的猫

3岁的灰颜色的猫眯着眼睛侧着头吃鱼

5.思考:

1.Dog和Cat都是Animal的子类,以上案例中针对不同的动物,定义了不同的keepPet方法,过于繁琐,能否简化,并体会简化后的好处?

2.Dog和Cat虽然都是Animal的子类,但是都有其特有方法,能否想办法在keepPet中调用特有方法?

package exercise;public class Test {public static void main(String[] args) {Person keeper1 = new Person("老王", 30);Person keeper2 = new Person("老李", 25);//        Cat cat = new Cat(3,"灰");
//        Dog dog = new Dog(2,"黑");Animal cat = new Cat(3, "灰");Animal dog = new Dog(2, "黑");keeper1.keepPet(dog, "骨头");keeper2.keepPet(cat, "鱼");}
}package exercise;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}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 void keepPet(Dog dog, String something) {System.out.println("年龄为" + getAge() + "岁的" + getName() + "养了一只" + dog.getColor() + "颜色的" + dog.getAge() + "岁的狗");System.out.println(dog.getAge() + "岁的" + dog.getColor() + "颜色的狗两只前腿死死的抱住" + something + "猛吃");}public void keepPet(Cat cat, String something) {System.out.println("年龄为" + getAge() + "岁的" + getName() + "养了一只" + cat.getColor() + "颜色的" + cat.getAge() + "岁的猫");System.out.println(cat.getAge() + "岁的" + cat.getColor() + "颜色的眯着眼睛侧着头吃" + something);}public void keepPet(Animal animal, String something){System.out.println("年龄为" + getAge() + "岁的" + getName() + "养了一只" + animal.getColor() + "颜色的" + animal.getAge() + "岁的猫");System.out.print(animal.getAge() + "岁的" + animal.getColor());if (animal instanceof Cat cat){cat.eat("鱼");cat.catchMouse();} else if (animal instanceof Dog dog) {dog.eat("骨头");dog.lookHome();}}
}package exercise;public class Animal {private int age;private String color;public Animal() {}public Animal(int age, String color) {this.age = age;this.color = color;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public void eat(String something){}
}package exercise;public class Cat extends Animal {public Cat() {}public Cat(int age, String color) {super(age, color);}public void eat(String something) {System.out.println("颜色的眯着眼睛侧着头吃" + something);}public void catchMouse() {System.out.println("猫在抓老鼠");}
}package exercise;public class Dog extends Animal {public Dog() {}public Dog(int age, String color) {super(age, color);}public void eat(String something) {System.out.println("颜色的狗两只前腿死死的抱住" + something + "猛吃");}public void lookHome() {System.out.println("狗在看家");}
}

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

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

相关文章

“人工智能+”成国策,天翼云如何打造大模型时代的驱动力样板?

文 | 智能相对论 作者 | 叶远风 两会政府工作报告中明确指出要制定支持数字经济高质量发展政策&#xff0c;开展“人工智能”行动&#xff0c;这意味着&#xff0c;“人工智能”已经成为国策。 在这种大背景下&#xff0c;大模型的重要性无疑被抬到了新的高度。 此时&#…

FPGA - 单总线协议(one-wire)

1&#xff0c;简介 单总线&#xff08;one-wire&#xff09;是美国 DALLAS 公司推出的外围串行扩展总线技术&#xff0c;与 SPI、I2C 等串行数据通信方式不同&#xff0c;它采用单根信号线&#xff0c;既传输时钟又传输数据&#xff0c;而且数据传输是双向的。它具有节省 I/O口…

【机器人控制 Robot Control】非线性控制(Non-linear Control)建模举例【新加坡南洋理工大学 NTU Singapore】

Non-linear Control Method Example: Non-linear Mechanical System Modelling of the System using Control Law Partitioning (Handwritten)

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理 一、安装OpenCV-3.4.161.下载OpenCV-3.4.16安装包2.将安装包放到/home&#xff0c;并解压3.使用 cmake 安装 opencv4.配置环境5.查看 opencv 的版本信息 二、处理图片&#xff08;一&#xff09;创建文件夹 code &#…

Ansible管理主机的清单------------inventory

一、 Ansible组成 INVENTORY&#xff1a;Ansible管理主机的清单 /etc/ansible/hosts 需要管理的服务清单,(将你需要管理的主机 、地址 或者名字 写入此文件) MODULES&#xff1a;Ansible执行命令的功能模块&#xff0c;多数为内置核心模块&#xff0c;也可自定义 PLUGINS&…

观测云在 .NET 业务中分析性能问题的最佳实践

背景 某药业集团是一家以创新技术驱动的线下医疗数据 SaaS 平台建设和运营公司&#xff0c;其主营的某智慧医疗平台产品&#xff0c;围绕线下医疗场景痛点提供一体化服务解决方案。近期集团对其生物检材在线递检系统进行功能升级开发及 IaaS 平台迁移。在针对新系统和新基础设…

vue3/vue2若依框架对比,点击新增编辑跳转到新页面(新增编辑共用代码)

vue2若依框架&#xff1a; router里面定义好&#xff0c;编辑里面添加一个id {path: /filmManagement,component: Layout,hidden: true,redirect: noredirect,children: [{path: editFilmDetail,component: () > import(/views/filmManagement/editFilmDetail),name: editFi…

旅游景区公共广播 园区广播 公路服务区广播

旅游景区公共广播 园区广播 公路服务区广播 旅游景区公共广播 旅游景区公共广播(又称背景音乐)简称BGM&#xff0c;它的主要作用是掩盖噪声并创造一种轻松和谐的气氛&#xff0c;是一种创造轻松愉快环境气氛的音乐。掩盖环境噪声&#xff0c;创造与旅游景区相适应的气氛&#…

报错:Nginx 部署后刷新页面 404 问题

文章目录 问题分析解决 问题 在部署完项目后 刷新页面&#xff0c;页面进入了404 分析 加载单页应用后路由改变均由浏览器处理&#xff0c;而刷新时将会请求当前的链接&#xff0c;而Nginx无法找到对应的页面 关键代码try_files,剩下俩如果其他地方配置了则可以省略。 在这…

GPT实战系列-LangChain构建自定义Agent

GPT实战系列-LangChain构建自定义Agent LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT…

ArmSoM Rockchip系列产品 通用教程 之 RTC 使用

1. RTC 简介​ RTC&#xff1a;(Real_Time Clock)&#xff1a;实时时钟 HYM8563是一种低功耗实时时钟&#xff08;RTC&#xff09;芯片&#xff0c;用于提供精确的时间和日期信息。它提供一个可编程的时钟输出&#xff0c;一个中断输出和一个掉电检测器&#xff0c;所有的地址…

新装 mysql 需注意配置的项

一 时区配置 mysql 安装后默认是使用系统时间&#xff0c;如果是linux系统就要注意系统时区是否配置正确 1 配置centos系统时区 # 查看当前系统时区 timedatectl status# 如果需要更改时区&#xff0c;比如设置为北京时间&#xff08;中国标准时间&#xff09; sudo timeda…

【Python使用】嘿马头条完整开发md笔记第1篇:课程简介,ToutiaoWeb虚拟机使用说明【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;课程简介&#xff0c;ToutiaoWeb虚拟机使用说明&#xff0c;Pycharm远程开发&#xff0c;产品与开发&#xff0c;数据库1 产品介绍,2 原型图与UI图,3 技术架构,4 开发。OS…

STM32第七节:GPIO输入——按键检测(包含带参宏)

目录 前言 STM32第七节&#xff1a;GPIO输入——按键检测&#xff08;包含带参宏&#xff09; 带参宏 代码替换展示 定义带参宏 GPIO输入——按键检测 硬件部分 端口输入数据寄存器&#xff08;GPIOx_IDR&#xff09; 编写程序 配置以及编写bsp_key文件 main函数编程…

SpringBoot(Lombok + Spring Initailizr + yaml)

1.Lombok 1.基本介绍 2.应用实例 1.pom.xml 引入Lombok&#xff0c;使用版本仲裁 <!--导入springboot父工程--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version&g…

arcgis在GIS滑坡易发性分析中的应用技术研究

我国是地质灾害多发国家&#xff0c;地质灾害的发生无论是对于地质环境还是人类生命财产的安全都会带来较大的威胁&#xff0c;因此需要开展地质灾害风险普查。利用遥感&#xff08;RS&#xff09;技术进行地质灾害调查工作具有宏观、快速、准确的特点&#xff0c;能反映出地质…

空调 USACO2021

题目描述&#xff1a; 思路&#xff1a; 此题非常有技巧&#xff0c;我们首先可以先把希望温度和实际温度做差&#xff0c; 问题就转化成&#xff0c;把这个温度差如何去全都变为0&#xff0c;相对应的变成希望温度 也就是 去给温度差数组去做差分&#xff0c;因为&#xff0…

【正则表达式】正则表达式里使用变量

码 const shuai No My Name Is ShuaiGe.match(new RegExp(shuai, gi)); //↑↑↑↑↑↑↑↑ //等同于 //↓↓↓↓↓↓↓↓ /No/.test(My Name Is ShuaiGe)用作领域 搜索的字符动态改变&#xff0c;例如↓模糊搜索例&#xff1a; 一个文本宽&#xff0c;输入文本模糊搜索用户…

SpringCloud Gateway 新一代网关

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第六篇&#xff0c;即介绍 Gateway 新一代网关。 二、概述 2.1 Gateway 是什么 Gateway 是在 Spring 生…

基于SSM的协同过滤算法的电影推荐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的协同过滤算法的电影推荐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通…