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.rhkb.cn/news/275382.html

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

相关文章

【C语言】Windows下的C语言线程编程详解

文章目录 1. 头文件1.1 windows.h1.2 process.h 2. 创建线程3. 线程同步3.1 线程同步方式3.1 互斥量&#xff08;Mutex&#xff09;3.2 事件&#xff08;Event&#xff09; 4. 线程的结束与资源管理5.线程池&#xff08;简要&#xff09; 在Windows平台下&#xff0c;C语言提供…

如何“使用Docker快速安装Jenkins,在CentOS7”?

1、运行 docker run -d --namejenkins -p 8080:8080 jenkins/jenkins 2、查看日志 &#xff0c;使用 "docker logs -f jenkins",可以持续刷新日志 docker logs jenkins 3、通过命令查看密码 docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminP…

VUE内盘期货配资软件源码国际外盘二合一

开发一个Vue内盘期货配资软件源码&#xff0c;同时兼容国际外盘二合一的功能&#xff0c;是一个复杂且专业的任务&#xff0c;涉及前端Vue.js框架的使用、后端服务器处理、数据库管理、实时交易接口对接等多个方面。下面是一些关于开发此类软件的基本指导和考虑因素&#xff1a…

FFmpeg工作流程及视频文件分析

FFmpeg工作流程: 解封装(Demuxing)--->解码(Decoding)--->编码(Encoding)--->封装(Muxing) FFmpeg转码工作流程: 读取输入流--->音视频解封装--->解码音视频帧--->编码音视频帧--->音视频封装--->输出目标流 可简单理解为如下流程: 读文件-->解…

程序员的三重境界:码农,高级码农、程序员!

见字如面&#xff0c;我是军哥&#xff01; 掐指一算&#xff0c;我在 IT 行业摸爬滚打 19 年了&#xff0c;见过的程序员至少大好几千&#xff0c;然后真正能称上程序员不到 10% &#xff0c;绝大部分都是高级码农而已。 今天和你聊聊程序员的三个境界的差异&#xff0c;文章不…

【BFS二叉树】113路径总和II

113路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 思路&#xff1a; 题目最终输出的是路径&#xff0c;因此用BFS遍历的时候&#xff0c;需要记录走到每个节点的路径&#xff1…

排序算法之快速排序算法介绍

目录 快速排序介绍 时间复杂度和稳定性 代码实现 C语言实现 c实现 java实现 快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是&#xff1a;选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据…

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

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

Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)

任务一&#xff1a;用户登录 登录系统通常分为普通用户与管理员权限&#xff0c;在用户登录系统时&#xff0c;可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序&#xff0c;该程序分为管理员用户与普通用户&#xff0c;其中管理员账号密码在程序中设定&#…

云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践

导语 随着云计算技术的日益成熟&#xff0c;云原生应用已逐渐成为企业数字化转型的核心驱动力。在这一大背景下&#xff0c;高效、稳定、可扩展的消息流系统显得尤为重要。腾讯云高级开发工程师李伟先生&#xff0c;凭借其深厚的技术功底和丰富的实战经验&#xff0c;为我们带…

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量&#xff0c;或将一个普通变量导出为环境变量&#xff0c;并且在这个过程中&#xff0c;可以给该环境变量赋值。 下面…

2024春秋蓝桥杯reverse——crackme01

尝试了下输入没有任何反应 查看——32位——IDA打开 我之前没怎么写过win32&#xff0c;所以我开始在string里面找flag,wrong,right什么的字符&#xff0c;都不行 然后我又在函数里面找main&#xff0c;也什么收获的没有,OK废话完了 在win32里面 关于弹窗的函数&#xff1a;…

C++Qt学习——添加资源文件

目录 1、创建好了文件之后&#xff0c;在左边空白处按下CtrlN&#xff0c;创建Qt 以及Qt Resource File 2、写入名称&#xff0c;点击下一步 3、可以发现已经创建好啦。 4、点击Add Prefix 5、写上前缀&#xff0c;最好加上斜杠 6、选择提前放好的图片或者icon 7、发…

【C语言】字符串函数上

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是字符串函数上篇&#xff0c;主要是关于长度不受限制的字符串函数&#xff08;strlen,strcpy,strcat,strcm…

详解Postman使用

简介&#xff1a; 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求的历史记录 可以使用测试集Collections有效管理组织接口 可以在团队之间同步接口数据 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求…

解决vue2+elementUI的下拉框出现自动校验的问题

问题&#xff1a; 总结原因是因为新增的时候&#xff0c;传了空值进去 可以这样子解决 this.formData.value && this.$set(this.model, this.formData.key, this.formData.value)这种是只有值存在的时候才会给他赋值&#xff0c;但是这只解决单选下拉框&#xff0c;…

数据结构:7、队列

一、队列的概念与结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头…

Android Studio下运行java main 方法

方法一 修改项目的.idea中的gradle.xml文件&#xff0c;在GradleProjectSettings标签下添加一行代码 <option name"delegatedBuild" value"false" />方法二 main方法上右键选择Run ‘xxx’ with Coverage

【LeetCode: 2864. 最大二进制奇数 + 模拟 + 位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Elastic Stack--05--聚合、映射mapping

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.聚合(aggregations)基本概念桶&#xff08;bucket&#xff09;度量&#xff08;metrics&#xff09; 案例 11. 接下来按price字段进行分组&#xff1a;2. 若想对所…