「JavaSE」类和对象2

news2024/11/19 18:20:32

🎇个人主页:Ice_Sugar_7
🎇所属专栏:快来卷Java啦
🎇欢迎点赞收藏加关注哦!

类和对象2

  • 🍉匿名对象
  • 🍉关键字static
    • 🍌static修饰成员变量
    • 🍌static修饰成员方法
    • 🍌static成员变量初始化
  • 🍉代码块
    • 🍌普通代码块
    • 🍌构造代码块
    • 🍌静态块
  • 🍉继承
    • 🍌关键字extends
    • 🍌继承关系中的访问
    • 🍌关键字super
    • 🍌子类的构造方法
    • 🍌再谈初始化
    • 🍌继承关系中的访问权限
    • 🍌继承方式及关键字final
  • 🍉组合
  • 🍉写在最后

🍉匿名对象

特点:使用new来创建对象,但是不声明对象的引用变量
缺点:只能使用一次,不能重复使用

    System.out.println(new Student("sugar","male",21));

而数组也是一个对象,所以我们也可以采用匿名对象来打印数组:

    for (int i:array1) {
        System.out.print(i + " ");
    }
    System.out.println(" ");
    for(int i:new int[]{2,3,4,5,6}) {
        System.out.print(i + " ");
    }

在这里插入图片描述


🍉关键字static

之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量)
而被static修饰的成员,称为静态成员,也可以称为类成员,它不属于某个具体的对象,而是所有对象共享的

(注意:static不可以修饰局部变量,因为局部变量不属于类)

🍌static修饰成员变量

特性:
●存储在方法区当中,不存储在某个对象的空间中。不属于某个具体的对象,是类的属性,所有对象共享的
●既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
●生命周期伴随类的一生(就是随类的加载而创建,随类的卸载而销毁)

🍌static修饰成员方法

静态成员方法也不是某个对象所特有的
可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者

注意:
静态方法中不能调用非静态成员变量、非静态成员方法
因为调用非静态成员变量需要使用this来访问;调用非静态成员方法需要传一个this引用,而静态方法中不含this引用

🍌static成员变量初始化

静态成员变量的初始化分为两种:就地初始化静态代码块初始化
那什么是静态代码块呢?往下看~


🍉代码块

使用 {} 定义的一段代码称为代码块根据代码块定义的位置以及关键字,可以分为以下四种:
●普通代码块
●构造块
●静态块
●同步代码块(后续在多线程部分讲解)

🍌普通代码块

定义在方法中的代码块(这种用法较少见)

public class Main{
	public static void main(String[] args) {
		{ //直接使用{}定义,普通方法块
			int x = 10 ;
			System.out.println("x1 = " +x);
		}
		int x = 100 ;
		System.out.println("x2 = " +x);
	}
}

🍌构造代码块

构造代码块,又叫实例代码块。位于成员方法外、类里面,不用加修饰符,一般用于初始化成员变量,所以它只有在创建对象时才会执行

class Student {
    public String name;
    public String sex;
    public int age;
    
    //构造代码块
    {
        this.name = "zhangsan";
        this.sex = "male";
        this.age = 30;
    }
}

public class Test {
    public static void main(String[] args) {
        Student student1 = new Student();
        System.out.println(student1);
    }
}

在这里插入图片描述

🍌静态块

使用static修饰的代码块称为静态代码块,也是位于成员方法外、类里面,一般用于初始化静态成员变量
比如对于学生类,有一个classroom的静态成员,那就使用静态块进行初始化

    public static String classroom;  //上课的教室
    static {
        classroom = "C-501";
    }

注意:
●不管生成多少个对象,每个静态块都只会执行一次
先执行静态块,然后执行构造块,再执行对应的构造方法
●如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行


🍉继承

面向对象思想中提出了继承的概念,用来提取不同类的共性,实现代码复用
继承允许在保持原有类特性的基础上进行扩展增加新功能,这样产生新的类,称为派生类

例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用
在这里插入图片描述
在上图中,Dog类和Cat类都继承了Animal类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可

🍌关键字extends

Java中表示类之间的继承关系,需要用到关键字extends

//Animal.java
public class Animal {
    public String name;
    public int age;

    public void eat() {
        System.out.println(name+"在吃饭");
    }

    public void sleep() {
        System.out.println(name+"在睡觉");
    }
}

//Cat.java
public class Cat extends Animal{
    void Catch() {
        System.out.println(name+"在抓老鼠");
    }
}

//Dog.java
public class Dog extends Animal{
    void bark() {
        System.out.println(name+"在汪汪叫");
    }
}

子类会将父类中的成员变量成员方法继承到子类中
注意:被private修饰的成员变量,可以被子类继承,但是不能直接在子类中访问,要访问的话,需要在父类中写一个get方法间接访问

🍌继承关系中的访问

一、访问成员变量

①子类和父类不存在同名的成员变量
直接访问父类从父类继承下来的成员变量

②子类和父类存在同名的成员变量
优先访问子类的成员变量

不管是哪种情况,访问成员变量都遵循就近原则自己有就优先用自己的;如果没有再从父类中找


二、访问成员方法

①成员方法名字不同
成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,优先访问自己的,自己没有时,再到父类中找,如果父类中也没有则报错

public class Base {
	public void methodA(){
		System.out.println("Base中的methodA()方法");
	}
}

public class Derived extends Base{
	public void methodB(){
		System.out.println("Derived中的methodB()方法");
	}
	public void methodC(){
		methodB(); // 访问子类自己的methodB()
		methodA(); // 访问父类继承的methodA()
	}
}

②成员方法名字相同
通过子类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用的方法所传递的参数选择合适的方法访问,如果没有则报错

在了解这些访问顺序之后,有这样一个问题:如果子类中存在与父类相同的成员时,那该如何在子类中访问从父类中继承下来的同名的成员呢?
答案是:使用super关键字

🍌关键字super

使用super时需要注意它的使用场景:
●只能在非静态方法中使用
●在子类方法中,要访问父类的成员变量和方法的时候用

(当然,super还有其他用法,后面会讲)

public class Animal {
    public String name;
    public int age;
    public void method() {
        System.out.println("这是父类的method方法");
    }
}

public class Dog extends Animal{
    public String name;
    public int age;
    public String color;

    @Override
    public void method() {  //和父类的method方法构成重写
        System.out.println("这是子类的method方法");
    }
    
    public void method1() {
        method();
        super.method();  //用super访问父类的method方法
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.method1();
    }
}

在这里插入图片描述

🍌子类的构造方法

构造子类对象时,需要先调用父类的构造方法,然后再执行子类的构造方法

子类构造方法中默认会调用父类无参的构造方法,即super()。你没有写的时候编译器会帮你自动添加上去
所以,如果你在父类中写了含参的构造方法,那你在子代构造方法里面就要显式调用super了,因为此时父类中已经没有编译器默认生成的无参构造函数

而且super一定要放在第一句,否则会报错

public class Animal {
    public String name;
    public int age;
    Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

public class Dog extends Animal{
    public String color;
    Dog() {
        super("Zhangsan",15);  //显式调用super
        this.color = "white";
    }
}

最后来总结一下super和this的异同之处:
同:
①只能在类的非静态方法中使用,用来访问非静态成员方法和字段;
②在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

异:
●this是当前对象的引用;super相当于是子类对象中从父类继承下来部分成员的引用

在非静态成员方法中,this用来访问本类的方法和属性;super用来访问父类继承下来的方法和属性
在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现
构造方法中一定会存在super(…)的调用,你没有写编译器也会添加;但是this(…)你不写就没有

🍌再谈初始化

再回顾一下上面所说的代码块的执行顺序
静态代码块->实例代码块->构造方法

结合继承关系,那么顺序就是:
父类静态代码块->子类静态代码块->父类实例代码块->父类构造方法->子类的实例代码块->子类构造方法
注意:第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

🍌继承关系中的访问权限

前面我们认识了四个访问限定符,那么父类中不同访问权限的成员,在子类中的可见性如何呢?
在这里插入图片描述
public和private就不用多说了,它们代表两个极端。父类中public修饰的成员,同个包和不同包中的子类都能访问;而private则都不行
要重点来说的是protected,展示一下不同包中的子类和非子类权限的区别:

//包1
public class Base {
    public int a;
    protected int b;
}

//包2
//不同包中的子类
public class Derived extends Base{
    public void func() {
        super.a = 1;
        super.b = 666;  //正常访问
    }
}

//包3
public class A1 {
    public static void main(String[] args) {
        Base base = new Base();
        base.a = 1;
        base.b = 1;  //报错,因为b在A1中不可见
    }
}

我们了解访问权限是为了能让类尽量做到“封装”,即隐藏内部实现细节,只暴露出必要的信息给类的调用者
因此我们在使用时应尽可能使用比较严格的访问权限。比如:如果一个方法能用 private,就尽量不要用 public

(当然,还有一种简单粗暴的做法:将所有的成员变量都设为 private,将所有的成员方法设为 public。但是这种方式属于滥用权限,不太推荐)
总而言之,写代码的时候要思考这个类提供的成员变量、方法到底给“谁”用的(是类内部自己用,还是类的调用者使用,还是子类使用)

🍌继承方式及关键字final

Java支持单继承多层继承不同类继承同一个类这三种继承方式,如图:


在实际项目中,我们不希望类之间的继承层次太复杂,一般我们不希望出现超过三层的继承关系,如果继承层次太多,就需要考虑对代码进行重构了

如果想从语法上限制继承,可以使用关键字final
final可以用来修饰变量、成员方法以及类

①修饰局部变量或成员变量,表示常量,不能再修改了

final int a = 10;
a = 20; // 编译出错

②修饰类,表示这个类不能被继承
修饰方法,表示该方法不能被重写


🍉组合

和继承类似,组合也是一种表达类之间关系的方式,它也可以实现代码复用。但是组合并没有涉及到特殊的语法(比如 extends 这样的关键字),它是将一个类的对象作为另外一个类的成员变量

关于二者的区别,通俗来说
●继承表示的对象之间是is-a的关系,比如:狗是一种动物(dog is an animal)
●而组合表示对象之间是has-a的关系,比如:汽车有多种零件,汽车和轮胎、发动机、方向盘、车载系统等的关系就是组合,因为汽车是由这些部件组成的

public class Engine {
    //...
}

public class Tire {
    //...
}

public class car {
    private Tire tire; // 可以复用轮胎中的属性和方法
    private Engine engine; // 可以复用发动机中的属性和方法
}

// 奔驰是汽车
public class BenZ extends car{
    // 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
}

●组合相较于继承,整体类与局部类彼此相对独立,不会破坏封装
●而对于继承,由于子类与父类之间紧密耦合,子类依赖于父类的实现,缺乏独立性,所以继承会破坏封装

简而言之就是:能用组合就尽量使用组合

继承要慎用,其使用场合仅限于你确信使用该技术有效的情况。一个判断方法是,问一问自己是否需要从新类向基类进行向上转型。如果是必须的,则继承是必要的。反之则应该好好考虑是否需要继承。——《Java编程思想》
只有当子类真正是超类的子类型时,才适合用继承。换句话说,对于两个类A和B,只有当两者之间确实存在is-a关系的时候,类B才应该继承类A。——《Effective Java》


🍉写在最后

以上就是本篇文章的全部内容,如果你觉得本文对你有所帮助的话,那不妨点个小小的赞哦!(比心)

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

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

相关文章

springboot项目创建及采用本地tomcat打包发布

springboot项目发布 maven使用 解压maven安装包 修改配置文件settings.xml 更改镜像(使用maven添加依赖时&#xff0c;选择下载的地址&#xff0c;百度云已提供) <mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyu…

天津Java开发培训哪家好?选Java培训班要考虑

在当今社会&#xff0c;Java语言在软件开发领域具有举足轻重的地位&#xff0c;Java是一门面向对象编程语言&#xff0c;Java语言集合了C的优点&#xff0c;丢弃了缺点&#xff0c;所以Java语言表现的功能强大而简单易用&#xff0c;已经得到越来越多的应届毕业生和职场新人的认…

Vue Axios——前端技术栈

文章目录 基本介绍Vue是什么&#xff1f; MVVMVue的使用快速入门注意事项和使用细节 Vue 数据绑定机制分析数据单向渲染注意事项和细节 双向数据绑定事件绑定示例&#xff1a;注意事项和使用细节课后作业1课后作业2 修饰符示例 条件渲染/控制: v-if v-showv-if VS v-show课后作…

ART-Adversarial Robustness Toolbox检测AI模型及对抗攻击的工具

一、工具简介 Adversarial Robustness Toolbox 是 IBM 研究团队开源的用于检测模型及对抗攻击的工具箱&#xff0c;为开发人员加强 AI模型被误导的防御性&#xff0c;让 AI 系统变得更加安全&#xff0c;ART支持所有流行的机器学习框架 &#xff08;TensorFlow&#xff0c;Ker…

外贸建站是什么意思?海洋建站需要多少钱?

外贸建站与独立站的区别&#xff1f;新人如何玩转外贸自建站&#xff1f; 在当今数字化时代&#xff0c;随着全球市场的不断融合&#xff0c;外贸建站成为了许多企业扩大业务的关键一环。那么&#xff0c;究竟什么是外贸建站&#xff1f;海洋建站将深入探讨这个问题&#xff0…

AIGC ChatGPT 4 Prompt 万能提示词公式

最近大家都在使用ChatGPT来帮助自己完成相应的工作。很多时候大家提出的问题得不到很清晰,很明确的答案。 我们应该怎么样来和ChatGPT进行有效的沟通呢? 例如我们先来问一问ChatGPT: 要获得最准确的回复,请确保遵循以下建议: 明确性:请尽量明确描述您的问题。确保提供足…

leetcode 17 电话号码字母组合

题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xf…

目标检测应用场景—数据集【NO.25】牛行为检测数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

【AIGC】美丽自然风光的一组绝美高清图提示词解析

好的&#xff0c;我可以帮你提取关键信息并整理到表格中。以下是根据你提供的描述&#xff0c;整理的表格&#xff1a; 关键信息描述场景夜晚的海滩风格奇幻色彩蓝色和绿色的荧光光源巨大的月亮、精灵般的光芒、星星、星斑海面泛着荧光沙滩金色&#xff0c;闪烁着光芒夜空繁星…

Odrive 学习系列二:将烧录工具从ST-Link V2修改为JLink

一、背景: 通过观察odrive解压后的内容,可以看到在下面配置文件及makefile文件中的配置设置的均为openOCD + stlink v2,例如makefile中: # This is only a stub for various commands. # Tup is used for the actual compilation.BUILD_DIR = build FIRMWARE = $(BUILD_DI…

Camtasia2024最新版本如何进行电脑录制屏幕?

在现在的网络互联网时代&#xff0c;越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频&#xff0c;也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音&#xff0c;做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

酷开系统 | 酷开科技挖掘与消费者深度链接的价值共鸣

市场的变化更迭速度日新月异&#xff0c;随着OTT行业的迅速发展&#xff0c;以及品牌方对于营销水准要求的逐步提高&#xff0c;以大屏为主的营销方向已成为目前营销发展的主要趋势。在互联网信息化发展的大趋势下&#xff0c;酷开科技不拘泥于现有格局&#xff0c;不断提升自身…

LeetCode 589. N 叉树的前序遍历

589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,nul…

打破效率瓶颈:运用Excel提升文秘与行政工作质量

文章目录 一、数据整理二、数据分析三、报表制作四、图表展示五、模板应用六、宏编程七、安全与隐私《Excel高效办公&#xff1a;文秘与行政办公&#xff08;AI版&#xff09;》编辑推荐内容简介作者简介目录获取方式 在现代企业中&#xff0c;文秘与行政办公人员的工作内容繁杂…

智慧公厕!高科技手段提升城市品质与形象

近年来&#xff0c;随着科技的不断进步&#xff0c;智慧公厕正以其独特的功能和对公共厕所全方位的信息化和数字化&#xff0c;成为智慧城市建设中的重要一环&#xff0c;悄然崭露头角。如广州中期科技有限公司自主研发的智慧公厕管理系统&#xff0c;借助于厕位监测、环境监测…

linux命令太多记不住吗?怎么办 ?于是推出了这样一套教程。

1.帮助命令 1.1 help命令 #语法格式&#xff1a; 命令 --help #作用: 查看某个命令的帮助信息 # 示例: # ls --help 查看ls命令的帮助信息# netstat --help 查看netstat命令的帮助信息1.2 man命令 #语法格式&#xff1a; man 命令 #作用: 查看某个命令的帮助手册 # 示例: …

数据结构期末复习(C语言版)

一、绪论 1.数据结构的术语 数据&#xff1a;所有能输入计算机并被计算机程序处理的符号的总称&#xff1b;数据元素&#xff1a;数据的基本单位&#xff1b;数据项&#xff1a;组成数据元素的、有独立含义的、不可分割的最小单位&#xff1b;数据对象&#xff1a;是性质相同…

WEB前端人机交互导论实验-实训6 表格与表格页面布局

1.项目1 设计《网络主题研讨会》日程表&#xff1a; A.题目要求&#xff1a; 使用表格标记和标记属性设计《网络主题研讨会》日程表。效果图如下&#xff1a; B.思路&#xff1a; 【1】CSS 样式: #div0&#xff1a;为主容器设置背景图片&#xff08;images61-4.png&#x…

生成式对抗网络GAN

Generative Adversarial Nets由伊恩古德费洛&#xff08;Ian J.Goodfellow&#xff09;等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…