【JAVA】类和对象,继承

news2025/2/23 3:26:43

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • 什么是类,对象
  • 类和类的实例化
    • 字段的初始化
    • 类中实现方法
    • static 静态关键字
  • 封装
    • private 封装
    • setter 和 getter 方法
    • 构造方法
    • this关键字
  • 继承
    • protected 关键字
    • java对于字段的方法的四种访问权限
    • final关键字

什么是类,对象

因为计算机并不能像我们人这样去理解世界上的东西,所以为了更好的编辑,就抽象出了类和对象。类就是把功能放在一起,然后由一个人去调用这个功能,然后再编辑对应的功能。调用者就是对象的实现者

类和类的实例化

类是一类对象的统称,对象就是这一类具体化的实例
创建类的关键字:class
举例:我们坐年糕的模子就是一个类,而通过这个模子可以做出月饼。在这个例子当中,类就是模具,年糕就是实例化的对象。一个类可以实例化很多对象。举例:

class Person {
    public String name;
    public int age;
}
public static void main1(String[] args) {
    Person person1 = new Person();
    Person person2 = new Person();
    Person person3 = null;
}

Person 就是一个类,里面的 name 和 int 就是类的成员(字段)。这里的 person1 就是引用,指向的是后面 new 的对象,因为是引用,所以也可以指向 null 。person3 就是指向空(null)引用。person1 person2 person3 就是实例化的对象。

字段的初始化

字段就是类里面的成员。在创建这些成员的时候就可以初始化。例如:

class Person {
    public String name = "Lockey";
    public int age = 10;
}

类中实现方法

class Person {
    public String name;
    public int age;
    public void print() {
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}
public static void main(String[] args) {
    Person person1 = new Person();
    person1.name = "Lockey";
    person1.age = 10;
    person1.print();
}

static 静态关键字

static 可以修饰方法,属性。要注意的是:static 修饰的变量通过类名访问。

class Person {
    public int a;
    public static int count;
}
public static void main(String[] args) {
    Person person1 = new Person();
    person1.a++;
    person1.count++;
    System.out.println(person1.a);
    System.out.println(Person.count);
    Person person2 = new Person();
    person2.a++;
    person2.count++;
    System.out.println(person2.a);
    System.out.println(person2.count);
}

在这里插入图片描述
如图,count 第二次输出为 2 。这是因为 conut 是被 static 修饰的变量,被 static 修饰之后就变成了常量,就在静态区了。所以每个引用当中调用的 count 没变。所以第二次改变 count 的值的时候,就变成 2 了。当 static 修饰方法的时候,无需再创建对象,直接拿类名调用就行了。举例:

class Person {
    public static int count;
    public static void change() {
        count = 100;
    }
}
public static void main(String[] args) {
    Person.change();
    System.out.println(Person.count);
}

在这里插入图片描述
通过类名的调用直接访问 static 修饰的变量。

封装

因为代码实现的软件很复杂,所以就出现了类,但是为了阅读性更高,就出现了封装。就是把一个类的内容实现为只剩一个或几个接口,方便类的调用者访问,这样就降低了代码的复杂程度。

private 封装

private 就是修饰成员变量或方法的关键字,被 private 修饰之后,就不能被类外的调用者访问了。所以就可以配合 public 来实现对外的接口。例如:

class Person {
    private String name = "Lockey";
    private int age = 10;
    public void print() {
        System.out.println("名字是:"+name+" 年龄:"+age);
    }
}
public static void main(String[] args) {
    Person person = new Person();
    person.print();
}

在这里插入图片描述
这里就是利用 private 封装属性,使其只能在类内被访问到。而提供的 public 接口,就让类的调用者在类外就可以访问到了。所以在类外直接调用 print 方法就好了。

setter 和 getter 方法

当我们把字段(name age)设置为 private 属性时,就无法在类外进行初始化了,所以就又出现了新的方法:

class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name1) {
        name = name1;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age1) {
        age = age1;
    }
    public void print() {
        System.out.println("名字是:"+name+" 年龄:"+age);
    }
}
public static void main(String[] args) {
    Person person = new Person();
    person.setName("Lockey");
    person.getName();
    person.setAge(10);
    person.getAge();
    person.print();
}

在这里插入图片描述
这里就是调用 getter 和 setter 方法,在类外进行访问,因为 private 对 name 和 age 做了封装。

构造方法

方法名和类名是相同的,且构造方法没有返回值。调用完构造方法之后,对象才会产生。

一个对象的产生:
1 为对象分配内存。
2 调用合适的构造方法。

class Person {
    public Person() {
        System.out.println("Person 不带参数的构造方法");
    }
}
public static void main(String[] args) {
    Person person = new Person();
}

在这里插入图片描述
这里就是实例化类的对象的时候调用的构造方法,因为我们自己写了构造方法,所以这里就调用我i们写过的。就输出了如图所示的内容。需要注意的是:如果没有实现如何的构造方法,编译器会帮我们默认生成有个不带参数的构造方法。也就是说,一个类,至少会有一个构造方法。
除了上面这种构造方法,我们还能写带有参数的构造方法。例如:

class Person {
    private String name;
    public Person(String name1) {
        name = name1;
        System.out.println("Person(String) 带一个参数的构造方法");
    }
}
public static void main(String[] args) {
    Person person = new Person("Lockey");
}

在这里插入图片描述
如图:在类初始化的时候,传入参数 “Lockey” 在类实例化的时候就是调用有参数的构造方法。既然能传参数,那是否可以传多个参数呢?答案是可以的。例如:

class Person {
    private String name;
    private int age;
    public Person(String name1, int age1) {
        name = name1;
        age = age1;
        System.out.println("Person(String, int) 带两个参数的构造方法");
    }
}
public static void main(String[] args) {
    Person person = new Person("Lockey",10);
}

在这里插入图片描述
如图,调用的就是传了两个参数的构造方法。通过观察上面的例子,我们可以发现:构造方法也是支持重载的。

this关键字

在类当中,this 表示当前对象的引用(不是当前对象),可以通过 this 来访问类当中的字段和方法。用 this 的话,会降低出现 bug 的概率,并且增加代码的可读性。例如使用 getter 和 setter 的时候,就可以用 this ,能多用 this 就多用 this 。

class Person {
    private String name;
    private int 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;
    }
}

继承

在创建的类当中,是为了给一些抽象的事物提供一些方法。如果一些类、一些食物有共同的属性,那么就可以把这些属性封装为一个类。然后其它事物有这个属性的时候,就去继承这个类。通过 extends 关键字去继承。就比如说:猫和鸟,它们的共同特点都有名字和吃。所以就可以把名字和吃放在一个类里面。然后让它们去继承,降低代码量。把被继承的这个类叫做 Animal 可以发现猫和鸟对于 Animal 都是一种 is-a 的关系。在继承的时候,也会继承父类(Animal)的字段和方法。

class Animal {
    public String name;
    public Animal(String name) {
        this.name = name;
    }
    public void eat(String food) {
        System.out.println(this.name + "正在吃" + food);
    }
}
class Cat extends Animal {
    public Cat(String name) {
        // 使用 super 调用父类的构造方法.
        super(name);
    }
}
class Bird extends Animal {
    public Bird(String name) {
        super(name);
    }
    public void fly() {
        System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");
    }
}
public class Test4 {
    public static void main(String[] args) {
        Cat cat = new Cat("小黑");
        cat.eat("猫粮");
        Bird bird = new Bird("圆圆");
        bird.fly();
    }
}

子类在调用父类的构造方法的时候,要用到 super 关键字。用 super 关键字去把参数传进去。运行结果如下:
在这里插入图片描述
bird 就是在 Animal 继承的基础上又扩展出了 fly 方法。
如果把 name 的 public 改成 private 那么子类就访问不到了:

class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
    }
    public void eat(String food) {
        System.out.println(this.name + "正在吃" + food);
    }
}

在这里插入图片描述

protected 关键字

因为把访问权限设置为 private 就会导致子类不能访问。如果是 public 就会导致失去封装的意义。所以就可以使用 protected 。因为对于类的子类和同一个包的其他类来说,protected 修饰的字段是可以访问的。

class Animal {
    protected String name;
    public Animal(String name) {
        this.name = name;
    }
    public void eat(String food) {
        System.out.println(this.name + "正在吃" + food);
    }
}
class Cat extends Animal {
    public Cat(String name) {
        // 使用 super 调用父类的构造方法.
        super(name);
    }
}
class Bird extends Animal {
    public Bird(String name) {
        super(name);
    }
    public void fly() {
        System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");
    }
}
public class Test4 {
    public static void main(String[] args) {
        System.out.println("保护权限下的访问");
        Cat cat = new Cat("小黑");
        cat.eat("猫粮");
        Bird bird = new Bird("圆圆");
        bird.fly();
    }
}

在这里插入图片描述

java对于字段的方法的四种访问权限

private: 类内部能访问, 类外部不能访问
默认(也叫包访问权限): 类内部能访问, 同一个包中的类可以访问, 其他类不能访问.
protected: 类内部能访问, 子类和同一个包中的类可以访问, 其他类不能访问.
public : 类内部和类的调用者都能访问

在这里插入图片描述

final关键字

之前学过,用 final 来修饰常数的时候,这个数不能被修改。所以用 final 来修饰类的时候,此时被修饰的类就不能被继承。

final class Animal {
    public String name;
    public Animal(String name) {
        this.name = name;
    }
    public void eat(String food) {
        System.out.println(this.name + "正在吃" + food);
    }
}
class Cat extends Animal {
    public Cat(String name) {
        // 使用 super 调用父类的构造方法.
        super(name);
    }
}
class Bird extends Animal {
    public Bird(String name) {
        super(name);
    }
    public void fly() {
        System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");
    }
}
public class Test4 {
    public static void main(String[] args) {
        Cat cat = new Cat("小黑");
        cat.eat("猫粮");
        Bird bird = new Bird("圆圆");
        bird.fly();
    }
}

在这里插入图片描述


♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

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

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

相关文章

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(二)

三、拖动手势(PanGesture) .PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number}) 拖动手势用于触发拖动手势事件,滑动达到最小滑动距离(默认值为5vp)时拖动手势识别成功&am…

IP初学习

1.IP报文 首部长度指的是报头长度,用于分离报头和有效载荷 2.网段划分 IP地址 目标网络 目标主机 3.例子 4.特殊的IP地址 5.真正的网络环境 6.调制解调器 “猫”,学名叫宽带无线猫 7.NAT 源IP在内网环境不断被替换 8.私有IP不能出现在公网上 因…

Python学习之三 变量与数据类型深度学习

本部分内容参考自以下书。 在学习之二中说道,所有的数据类型都是类,那么变量以及对应的值都是对象。为了后续更容易理解,我们先来看一下内置函数id的帮助文档。 它用于返回对象的标识。此标识在生命周期内必须是唯一且恒定的。 在Python中,变量只是名称,赋值操作并不会复…

做西班牙语翻译好不好?西班牙语薪酬如何?

众所周知,西班牙语作为全球应用广泛的“小语种”,市场对它的翻译需求极为庞大。西班牙语翻译是你寻求优秀事业的新赛道!那么,西班牙语翻译薪酬如何,北京西语翻译哪家好? 美国的调查数据告诉你,西…

Linux下的系统编程——进程(七)

前言: 程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程的学…

spring6详细讲解

Spring6 1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单…

粉丝经验分享:13:00 开始的面试,13:06 就结束了,问题真是变态

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

hdfs滚动升级(rollingUpgrade )

最近对hdfs的升级过程很感兴趣,所以准备研究下其升级的过程,本篇文章是依据官网文档进行的升级过程(地址:Apache Hadoop 2.10.2 – HDFS Rolling Upgrade),该文章中还有关于降低的介绍,感兴趣的…

【快手小玩法-弹幕游戏】开发者功能测试报告提交模板

背景 快手有明确的要求,准入和准出更加严格,要求有明确的测试报告。格式如下: *本文参考字节wiki:CP侧测试报告模板(复制填写轻雀文档) 其他文章推荐:【抖音小玩法-弹幕游戏】开发者功能测试报告提交模板 一、前言…

Lesson03---类与对象(中篇)

lesson5: 一、类的6个默认成员函数(2:29:10) 1.什么是空类?(2:29:40) a.空类中真的什么都没有吗?(2:29:50)…

学习MATLAB

今日,在大学慕课上找了一门关于MATLAB学习的网课,MATLAB对于我们这种自动化的学生应该是很重要的,之前也是在大三的寒假做自控的课程设计时候用到过,画一些奈奎斯特图,根轨迹图以及伯德图,但那之后也就没怎…

网络协议三要素

计算机语言作为程序员控制一台计算机工作的协议,具备了协议的三要素。 语法,就是这一段内容要符合一定的规则和格式。例如,括号要成对,结束要使用分号等。语义,就是这一段内容要代表某种意义。例如数字减去数字是有意…

单目标追踪——【Transformer】Autoregressive Visual Tracking

目录 文章侧重点网络结构Encoder(特征提取与融合得到Vision Features)Decoder(Vision FeatureMotion Feature 特征融合与输出)运动特征生成特征融合与输出 消融实验N与VocabularyBins 论文链接:https://paperswithcode…

CocosCreator3.8研究笔记(三)CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目,来演示CocosCreator 的项目结构。 等待创建完成后,会得到以下项目工程: 一、assets文件夹 assets文件夹:为资源目录,用来存储所有的本地资源,如各种图片,脚本…

一文快速了解代理https和sock5协议的区别

一、什么是https协议 HTTPS 协议全称:HyperText Transfer Protocol Secure(超文本传输安全协议),是一种通过计算机网络进行安全通信的传输协议。 作用于应用层(application layer)中。 HTTPS 是在HTTP 的…

[C++]学习中的一个问题

#include<iostream> #include<string> #include<cstring> using namespace std;int main(){char str[31];cout << "----" << sizeof(str) << endl;// 给了memset(str, 0, sizeof(str));for (size_t i 0; i < 31; i){cout &l…

打造高权重店铺的秘密,详解Shopee平台权重评估机制(测评补单)

很多虾皮卖家经常提到的"权重"是指商品或店铺在Shopee平台上的重要性程度。权重评估了商品或店铺是否符合用户需求&#xff0c;并且能否促进订单转化率&#xff0c;为平台带来收益。说白了权重就是给商品和店铺打分的机制&#xff0c;得分越高&#xff0c;权重越高&a…

C语言——函数的使用

无参无返回值 语法格式如下&#xff1a; // 函数定义 void 函数名() {函数体 }// 函数调用 函数名();函数名是标识符的一种&#xff0c;需要遵循规则函数只需要定义一次&#xff0c;反复调用只定义函数, 不调用函数, 函数永远不会被执行案例需求&#xff1a; 编写一个函数&am…

python爬虫-Selenium

一、Selenium简介 Selenium是一个用于Web应用程序测试的工具&#xff0c;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。模拟浏览器功能&#xff0c;自动执行网页中的js代码&#xff0c;实现动态加载。 二、环境配置 1、查看本机电脑谷歌浏览器的版…

Idea安装免注册版ChatGPT

文章目录 一、前期准备二、开始使用 一、前期准备 1.准备Idea开发软件并打开&#xff08;VS Code同理&#xff09;! 2.【CtrlAltS】快捷键调出Settings窗口&#xff0c;如图 3.找到NexChatGPT 此插件不需要注册&#xff0c;可以直接使用&#xff08;高级一些的需要会员收费限…