Java巅峰之路---进阶篇---面向对象(一)

static关键字

介绍

static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。

其中,被static修饰的成员变量,叫做静态变量;被static修饰的成员方法,叫做静态方法

静态变量

调用方式:类名调用(推荐)、对象调用

特点:

● 被该类所有对象共享

● 不属于对象,属于类

● 随着类的加载而加载,优先于对象存在

//所有对象的teacherName将会被赋值为“阿伟”Student.teacherName = "阿伟";Student s1 = new Student();s1.setName("小李");s1.setAge(18);System.out.println(s1.toString());//Student{name = 小李, age = 18, teacherName = 阿伟}Student s2 = new Student();System.out.println(s2.toString());//Student{name = null, age = 0, teacherName = 阿伟}

内存图

 注意:

静态区里边的变量是对象共享的,在内存当中只有一份,“谁要用谁去拿”;而非静态的变量是每一个对象独有的。

静态方法

调用方式:类名调用(推荐)、对象调用

特点:

● 多用在测试类和工具类中

● Javabean类中很少会用

拓展:工具类、测试类、Javabean类的区别

● Javabean类:用来描述一类事物的类。比如,Student,Teacher,Dog等

● 测试类:用来检查其他类是否书写正确,带有main方法的类,是程序的入口

● 工具类:不是用来描述一类事物的,而是帮我们做一些事情的类

书写工具类,需注意

● 类名见名只意(如StudentUtil)

● 私有化构造方法(不让外界创建它的对象)

● 方法定义为静态(方便调用)

练习

定义一个工具类求学生年龄最大值

工具类:

public class StudentUtil {//私有化构造方法private StudentUtil(){}public static int getMaxAge(List<Student> list){if(list.size() == 0)return -1;int max = list.get(0).getAge();for(int i = 1;i < list.size(); i++){int maxTemp = list.get(i).getAge();if(maxTemp > max){max = maxTemp;}}return max;}
}

测试类: 

    public static void main(String[] args) {List<Student> list = new ArrayList<>();Student stu1 = new Student("张三",15,"男");Student stu2 = new Student("李四",16,"男");Student stu3 = new Student("王五",13,"女");list.add(stu1);list.add(stu2);list.add(stu3);//用工具类当中的方法获取集合中最大学生的年龄int maxAge = StudentUtil.getMaxAge(list);System.out.println(maxAge);//16}

static的注意事项

● 静态方法只能访问静态变量和静态方法(静态方法只能访问静态)

● 非静态方法可以访问静态变量或静态方法,也可以访问非静态的成员变量和非静态的成员方法(非静态可以访问所以)

● 静态方法中是没有this关键字

public class Student {String name;int age;static String teacherName;public void show1(){System.out.println(name + ", " + age + ", " + teacherName);//非静态方法调用静态方法和非静态方法(this可省略不写)//this:表示当前方法调用者的地址值//这个this:是由虚拟机赋值的this.method();this.show2();}public void show2(){System.out.println("成功调用此方法");}public static void method(){System.out.println("静态方法");//不能用this调用静态方法(只能直接调用),也不能调用非静态方法method1();}public static void method1(){//只能输出静态成员变量,非静态不行System.out.println(teacherName);}
}

继承

继承的概述

java中提供了一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系

public class Student extends person{}

其中,Student称为子类(派生类),Person称为父类(基类或超类)

使用继承的好处

● 可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性。

● 子类可以在父类的基础上,增加其他的功能,使子类更加强大。

什么时候用继承?

当类与类之间,存在相同(共性)的内容,并满足子类是父类的一种,就可以考虑使用继承,来优化代码

 继承的特点

● Java只支持单继承,不支持多继承(一个儿子只能有一个父亲,不能有多个)、但支持多层继承

多层继承:子类A继承父类B,父类B可以继承父类C(B是A的直接父类,C是A的间接父类)

● Java中所有的类都直接或者间接继承于Object类。

练习

 所作图:

 代码如下:

六个Javabean类:

public class Animal {public void eat(){System.out.println("吃饭");}public void drink(){System.out.println("喝水");}
}
public class Cat extends Animal{public void catchMouse(){System.out.println("猫抓老鼠");}
}
public class Dog extends Animal{public void lookHome(){System.out.println("狗在看家");}
}
public class Ragdoll extends Cat{
}
public class LiHua extends Cat{
}
public class Husky extends Dog{public void breakHome(){System.out.println("哈士奇正在拆家!!");}
}
public class Teddy extends Dog{public void touch(){System.out.println("泰迪正在蹭我的腿~");}
}

测试类:

public class Text {public static void main(String[] args) {//1.创建布偶猫对象Ragdoll r = new Ragdoll();r.eat();//吃饭r.drink();//喝水r.catchMouse();//猫抓老鼠//2.创建哈士奇对象Husky h = new Husky();h.eat();//吃饭h.drink();//喝水h.lookHome();//狗在看家h.breakHome();//哈士奇正在拆家!!}
}

继承的注意事项

子类到底能继承父类中的哪些内容

即构造方法不能被继承,成员变量都能被继承,成员方法只继承虚方法表中的方法

对于成员变量:

● 私有的确实可以继承,但得用set/get方法进行赋值和访问

● 静态成员变量可以直接赋值和访问

public class Fu {public String name;public static int age;//静态成员变量private String gender;//私有变量public void setGender(String gender){this.gender = gender;}public String getGender(){return this.gender;}
}public class Zi extends Fu{public int score;
}

测试类: 

public class Text {public static void main(String[] args) {Zi z = new Zi();z.name = "张三";z.score = 100;z.age = 15;//age为父类静态成员变量z.setGender("男");System.out.println(z.name + ", " + z.score + ", " + z.age + ", " + z.getGender());//张三, 100, 15, 男}
}
 对于成员方法:

从最顶级的父类开始设立了一个虚方法表,一代一代传给自己的子类,大大提高程序的性能

如果子类对象调用的方法不在虚方法表中,则会在上代中一代一代去找

内存图演示:

继承中成员变量、方法和构造方法的访问特点

对于成员变量:

就近原则:谁离我近,我就用谁(先在局部位置找,本类成员位置找,父类成员位置找,逐级往上)

● 出现重名需要用this、super关键字来指定访问

public class Fu {String name = "Fu";
}
public class Zi extends Fu{String name = "Zi";public void ziShow(){String name = "ziShow";System.out.println(name);//ziShowSystem.out.println(this.name);//ZiSystem.out.println(super.name);//Fu}
}
public class Text {public static void main(String[] args) {Zi zi = new Zi();zi.ziShow();/*
ziShow
Zi
Fu*/}
}
对于成员方法:

● 直接调用满足就近原则:谁离我近,我就用谁

● super调用,直接访问父类

public class Fu {public void eat(){System.out.println("吃米饭");}public void drink(){System.out.println("喝水");}
}
public class Zi extends Fu{public void lunch(){//先在本类中查看eat和drink方法,就会调用子类的,如果没有,就会调用父类中继承下来的eat和drink方法eat();drink();//直接调用父类的eat和drink方法super.eat();super.drink();}@Overridepublic void eat(){System.out.println("吃意大利面");}@Overridepublic void drink(){System.out.println("喝奶茶");}
}
public class Text {public static void main(String[] args) {Zi zi = new Zi();zi.lunch();/*
吃意大利面
喝奶茶
吃米饭
喝水*/}
}
补充说明:方法的重写

当父类的方法不能满足子类现在的需求时,需要进行方法重写

书写格式

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法

@Override重写注解

其是放在重写后的方法上,校验子类重写时语法是否正确

方法重写的本质

子类覆盖了从父类中继承下来的虚方法表里面的方法

方法重写注意事项和要求

● 重写方法的名称、形参列表必须与父类中的一致

● 子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)

● 子类重写父类方法时,返回值类型子类必须小于等于父类

● 只有被添加到虚方法表中的方法才能被重写 

重写方法尽量和父类保持一致

练习

 所作图:

代码如下: 

public class Dog {public void eat(){System.out.println("狗在吃狗粮");}public void drink(){System.out.println("狗在喝水");}public void lookHome(){System.out.println("狗在看家");}
}public class Husky extends Dog{public void breakHome(){System.out.println("狗在拆家");}
}public class SharPei extends Dog{@Overridepublic void eat(){super.eat();System.out.println("吃骨头");}
}public class ChineseDog extends Dog{@Overridepublic void eat(){System.out.println("狗在吃剩饭");}
}
public class Text {public static void main(String[] args) {Husky h = new Husky();h.eat();h.drink();h.lookHome();h.breakHome();ChineseDog cd = new ChineseDog();cd.eat();cd.drink();cd.lookHome();}/** 狗在吃狗粮
狗在喝水
狗在看家
狗在拆家
狗在吃剩饭
狗在喝水
狗在看家*/
}
总结

对于构造方法: 

● 子类构造方法的第一行,有一个默认的super();

● 默认先访问父类中无参的构造方法,再执行自己。

● 子类不能继承父类的构造方法,但是可以通过super调用

● 如果想要方法文父类有参构造,必须手动书写。

 this、super使用总结

● this:理解为一个变量,表示当前方法调用者的地址值;

● super:代表父类存储空间。

测试

带有继承结构的标准Javabean类

答案:

父类:

public class Employee {private String id;private String name;private double salary;//ptg生成javabeanpublic Employee() {}public Employee(String id, String name, double salary) {this.id = id;this.name = name;this.salary = salary;}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 double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public String toString() {return "Employee{id = " + id + ", name = " + name + ", salary = " + salary + "}";}public void work(){System.out.println("正在工作");}public void eat(){System.out.println("吃米饭");}
}

两个子类: 

public class Manage extends Employee{private double bouns;//alt+insert重造构造器public Manage() {}public Manage(String id, String name, double salary, double bouns) {//调用了父类的有参构造器super(id, name, salary);this.bouns = bouns;}//ptgpublic double getBouns() {return bouns;}public void setBouns(double bouns) {this.bouns = bouns;}public String toString() {return "Manage{bouns = " + bouns + "}";}//方法的重写@Overridepublic void work() {System.out.println("经理正在管理其他人");}
}public class Cooker extends Employee{//alt+insertpublic Cooker() {}public Cooker(String id, String name, double salary) {super(id, name, salary);}@Overridepublic void work() {System.out.println("厨师正在炒菜");}
}

测试类:

public class Text {public static void main(String[] args) {Manage m = new Manage("001","zhangsan", 7843.5, 213.5);System.out.println(m.toString());m.eat();m.work();Cooker c = new Cooker();c.setId("002");c.setName("lisi");c.setSalary(6743);System.out.println(c.toString());c.eat();c.work();}
//    Manage{bouns = 213.5}
//    吃米饭
//    经理正在管理其他人
//    Employee{id = 002, name = lisi, salary = 6743.0}
//    吃米饭
//    厨师正在炒菜
}

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

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

相关文章

牛客面经学习笔记(四)

这种拨码开关在PLC里面很是常用&#xff1a; 这种弧型线就很漂亮&#xff1a; 这个白色按键很漂亮&#xff1a; 快恢复保险丝&#xff1a; 继电器电路&#xff1a; 这里的续流二极管很重要&#xff0c;因为继电器是感性元件&#xff1a; 【【必考】5招搞清楚&#xff01;单点接…

【轻松拿捏】Java中ArrayList 和 LinkedList 的区别是什么?

ArrayList 和 LinkedList 的区别是什么&#xff1f; 1. ArrayList 2. LinkedList 3.总结 &#x1f388;边走、边悟&#x1f388;迟早会好 ArrayList 和 LinkedList 都是 Java 中常用的 List 接口的实现类&#xff0c;但它们在内部结构和操作性能上有所不同。 1. ArrayLis…

SpringBoot+Vue实现大文件上传(分片上传)

SpringBootVue实现大文件上传&#xff08;分片上传&#xff09; 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 问题 前几篇文章&#xff0c;可以用于较小文件的上传&#xff0c;对于较大文件来说&#xff0c;为了提高上传效率和可靠性&#xff0c;可以采…

【1-4】设计模式概述

目录 一.设计模式产生背景 二.软件设计模式的概念 三.学习设计模式的必要性 四.设计模式分类 一.设计模式产生背景 二.软件设计模式的概念 软件设计模式&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多人知晓的、经过分类编目的、代码设计经验的总结。它描述了…

Python爬虫使用实例

IDE&#xff1a;大部分是在PyCharm上面写的 解释器装的多 → 环境错乱 → error&#xff1a;没有配置&#xff0c;no model 爬虫可以做什么&#xff1f; 下载数据【文本/二进制数据&#xff08;视频、音频、图片&#xff09;】、自动化脚本【自动抢票、答题、采数据、评论、点…

深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)

目录 &#x1f354; 前言 &#x1f354; 图像基础知识 1. 像素和通道的理解 2. 小节 &#x1f354; 卷积层 1. 卷积计算 2. Padding 3. Stride 4. 多通道卷积计算 5. 多卷积核卷积计算 6. 特征图大小 7. PyTorch 卷积层 API 7. 小节 &#x1f354; 池化层 1. 池…

代码随想录算法训练营第十六天(二叉树 四)

力扣题部分: 513.找树左下角的值 题目链接:. - 力扣&#xff08;LeetCode&#xff09; 题面: 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路(层序遍历): 应该是这道题最简单的方法了&#xff0…

C++ 设计模式——建造者模式

建造者模式 建造者模式组成部分建造者模式使用步骤1. 定义产品类2. 创建具体产品类3. 创建建造者接口4. 实现具体建造者5. 创建指挥者类6. 客户端代码 建造者模式 UML 图建造者模式 UML 图解析建造者模式的优缺点建造者模式的适用场景完整代码 建造者模式 建造者模式&#xff…

C语言—指针(1)

目录 一、内存和地址 &#xff08;1.1&#xff09;内存 &#xff08;1.2&#xff09;编址的理解 二、指针变量和地址 &#xff08;2.1&#xff09;取地址操作符&#xff08;&&#xff09; &#xff08;2.2&#xff09;指针变量和解引用操作符 &#xff08;2.2.1&…

XSS复现

目录 XSS简单介绍 一、反射型 1、漏洞逻辑&#xff1a; 为什么有些标签可以触发&#xff0c;有些标签不能触发 可以触发的标签 不能触发的标签 为什么某些标签能触发而某些不能 二、DOM型 1、Ma Spaghet! 要求&#xff1a; 分析&#xff1a; 结果&#xff1a; 2、J…

Unity项目优化记录

背景&#xff1a;测试反馈项目组游戏存在内存泄露&#xff0c;来找到中台这边协调排查。好家伙&#xff0c;跑了两次看了内存快照&#xff0c;再看资源组织和管理方式&#xff0c;存在的问题确实比较多。 1、修复内存泄露&#xff1a;结算界面由于资源引用丢失导致整个面板不会…

44.【C语言】指针(重难点)(G)

目录 19.字符指针变量 *定义 *简单说明 *如果是字符串 *像数组一样指定访问常量字符串的字符 *练习 20.数组指针变量 *定义 *格式 *例子 问题1 问题2 *利用指针打印 21.二维数组传参的本质 *回顾 往期推荐 19.字符指针变量 *定义 指向字符的指针变量&#xff0c;用于存储字符…

使用Python实现B站自动答题机器人

文章目录 1. 写在前面2. 接口分析3. 点选验证分析4. Python程序实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…

什么是OpenTiny?

OpenTiny 是一套企业级的 Web 前端开发解决方案&#xff0c;提供跨端、跨框架的 UI 组件库和低代码引擎&#xff0c;帮助开发者高效构建 Web 应用 。企业运用开发中&#xff0c;可以利用 OpenTiny 的以下核心组件和优势&#xff1a; TinyVue 组件库&#xff1a;一个丰富的组件库…

C/C++实现蓝屏2.0

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 前…

【机器学习-监督学习】逻辑斯谛回归

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

使用Python制作贪吃蛇小游戏

引言 贪吃蛇游戏是一款经典的电子游戏&#xff0c;玩家通过控制一条不断增长的蛇在格子内移动&#xff0c;并吃掉随机出现的食物来获得分数。随着分数的增加&#xff0c;蛇的身体也会越来越长&#xff0c;游戏的难度也随之提升。在本文中&#xff0c;我们将详细介绍如何使用Py…

基于django的双选宠物托管服务平台/python宠物托管系统

摘 要 伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;系统管理这一名词已不陌生&#xff0c;越来越多的双选宠物托管服务等机构都会定制一款属于…

使用 AWS CLI 自动在 Amazon EC2 实例上部署 Apache Web 服务器

“使用 AWS CLI 节省时间” 欢迎来到雲闪世界。今天&#xff0c;我们将利用 AWS CLI 的实际用途来提高效率并自动执行在 Amazon EC2 实例上部署 Apache Web 服务器的步骤。完成“使用 AWS CLI 节省时间”任务后&#xff0c;最后有一个非常有趣的秘密步骤&#xff0c;敬请…

UCOSIII内存管理机制详解

目录 前言 1. 内存管理概述 2. 内存区域&#xff08;存储区&#xff09;和内存块 3. 存储区控制块&#xff08;OS_MEM&#xff09; 4. 内存管理函数 5. 内存碎片问题 6. 注意事项 7.代码实现 7.1创建内存区域 7.2申请内存 7.3释放内存 前言 UCOSIII&#xff08;即Mi…