JAVASE之类和对象(2)

哪怕犯错,也不能什么都不做。

主页:趋早–Step
专栏:JAVASE
gitte:https://gitee.com/good-thg
接上部分,我们继续来学习JAVAEE类和对象。

在这里插入图片描述

引言:
这篇文章接上一篇,后半部分,结束类和对象

目录

  • 一、封装
    • 1、封装的概念
    • 2、访问限定符
      • 注意:
        • (1)我们在需要生成代码的地方点击鼠标右键,然后选择下面的Geneate
        • (2)然后就会出现下面的界面
        • (3)这时候我们选择图片中的选项
        • (4)点进来的界面是这样的
        • (5)我们按住Ctrl 或者 Shift 键,用鼠标点击需要生成的方法
        • (6)最后点击下面的OK,他就会自动生成了。
    • 3、包
      • (1)概念
      • (2)导入包中的类
      • (3)自定义包
        • <1> 选择src并且右键点击
        • <2> 选择new
        • <3> 选择Package并且点击
        • <4> 输入包的名称,这里我输入的是demo2(可以自己定义名字),然后回车,就创建好了一个包。我们来说一下创建包的基本原则:
          • 1.在文件的最上方加上一个 package 语句指定该代码在哪个包中
          • 2.包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式
          • 3.报名要和代码路径想匹配
          • 4.如果一个类没有package语句,则该类被放到一个默认包中。
      • (4)包的访问权限控制举例
  • 二、static成员
    • 1、再谈学生类
    • 2、static修饰成员变量
    • 3、static修饰成员方法
    • 4、static成员变量初始化
      • (1)就地初始化
      • (2)静态代码块初始化
  • 三、代码块
    • 1、代码块概念以及分类
    • 2、普通代码块
    • 3、构造代码块
    • 4、静态代码块
    • 拓展:
  • 四、内部类
    • 1、内部类的分类
    • 2、实例内部类
    • 3、静态内部类
    • 4、局部内部类
    • 5、匿名内部类
  • 五、对象的打印

一、封装

1、封装的概念

面向对象程序三大特性:封装、继承、多态。
而类和对象截断,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节。
比如我们使用的手机,我们可以给手机充电,可以开关机,可以调节手机音量的高低,可以看到手机内的应用,但是我们看不到手机内部的构造,这就是厂商将内部细节封装起来了,我们无法看到。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

2、访问限定符

JAVA中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用,JAVA提供了四种访问操作符:
在这里插入图片描述
当然,我们也是通过代码来学习封装的,我们看下面这个代码:

class Person{public String name;public int age;public void show(){System.out.println("姓名:" + name + "   年龄: " + age);}
}
public class Text {public static void main(String[] args) {Person person = new Person();person.name = "Tom";person.age = 12;person.show();}
}

运行结果如下:
在这里插入图片描述
上面的代码我们已经很熟悉了吧!但是,上面这个代码不够安全,容易被修改,所以,这时候封装的意义就体现出来了,我们将代码进行修改:
在这里插入图片描述
很明显,这个代码已经有错了,因为private修饰了属性和方法,private的权限是同一个包中的同一类,上面代码中不在同一个类,所以就会出错,再来看下面代码:
在这里插入图片描述
我们将它放在同一个类中就不会报错了,我们运行试试:
在这里插入图片描述
这就是运行结果了。
这时候,我们想,如果我们非要在类外面访问,该怎么办呢?
这也是有方法的,我们继续:

class Person{private String name;private int age;public void show(){System.out.println("姓名:" + name + "   年龄: " + 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 class Text {public static void main(String[] args) {Person person = new Person();//person.name = "Tom";//person.age = 12;person.setName("Sam");person.setAge(15);System.out.println(person.getName());System.out.println(person.getAge());}
}

看代码,我们运行一下试试:
在这里插入图片描述

这个代码就叫做封装。我们可以提供公开的方法进行访问,这就相当于我们的手机充电口,我们可以给手机充电,但是我们不知道他是实现的细节。

注意:

这时候,我们说一个小技巧,我们看到那么多方法,需要一个一个字母敲出来可真的太浪费时间了,为了提供我们的效率,我们就用快捷方式,我们的IDEA功能非常的强大,可以自动帮助我们生成,如何生成呢?让我来告诉你:
我们先把那些方法删除,现在的代码是这样:
在这里插入图片描述
然后就来生成吧!

(1)我们在需要生成代码的地方点击鼠标右键,然后选择下面的Geneate

在这里插入图片描述

(2)然后就会出现下面的界面

在这里插入图片描述

(3)这时候我们选择图片中的选项

在这里插入图片描述

(4)点进来的界面是这样的

在这里插入图片描述

(5)我们按住Ctrl 或者 Shift 键,用鼠标点击需要生成的方法

在这里插入图片描述

(6)最后点击下面的OK,他就会自动生成了。

在这里插入图片描述
我们看结果:
在这里插入图片描述
这就是我们编译器自动生成的方法,是不是和好用的,当然,我在这里写的比较繁琐,我们自己使用的时候完全不会这么麻烦的,同时,我们再告诉大家一个快捷键 Alt + Insert,他也能帮助我们生成上面的方法,至于他怎么使用,大家自己尝试一下就知道了,需要我们自己动手哦。

3、包

(1)概念

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类手机在一起成为一组。比如我们的一个文件夹,文件夹中的内容就是类,可以帮助我们更好的管理类。
在JAVA中,包是对类、接口等封装机制的体现,是一种类对接口等的很好的组织方式,比如一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的嘞,只要处在不同的包中即可。

(2)导入包中的类

我们使用import语句来导入包

我们看下面的代码:
在这里插入图片描述
这就是导入了包,运行结果如下:
在这里插入图片描述

(3)自定义包

我们如何自定义包呢?下面就来介绍一下:

<1> 选择src并且右键点击

在这里插入图片描述

<2> 选择new

在这里插入图片描述

<3> 选择Package并且点击

在这里插入图片描述

<4> 输入包的名称,这里我输入的是demo2(可以自己定义名字),然后回车,就创建好了一个包。我们来说一下创建包的基本原则:
1.在文件的最上方加上一个 package 语句指定该代码在哪个包中
2.包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式
3.报名要和代码路径想匹配
4.如果一个类没有package语句,则该类被放到一个默认包中。

在这里插入图片描述

(4)包的访问权限控制举例

我们在demo2中定义一个Date类:
在这里插入图片描述

然后我们在demo1中的Text中进行访问:
在这里插入图片描述

在这里插入图片描述
这样,我们就可以访问不同包中的类了。

二、static成员

1、再谈学生类

public class Student {public String name;public int age;public String gender;public double score;public Student(String name, int age, String gender, double score) {this.name = name;this.age = age;this.gender = gender;this.score = score;}public void print(){System.out.println(this.name + "今年" + this.age + "岁了,他是一个" + this.gender + "生,这次的考试成绩是" + this.score + "分");}public static void main(String[] args) {Student student1 = new Student("Tom",12,"男",66);Student student2 = new Student("XiaoHong",13,"女",76);Student student3 = new Student("Sam",12,"男",86);student1.print();student2.print();student3.print();}
}

运行结果如下:
在这里插入图片描述
好的,后面的操作我们都是在这个代码上提出问题并且在这个代码上修修改改。
这时候,我们有了第一个问题,假如他们三个人都在同一个班中,那么我们有必要都存一份吗?很明显是没有必要的,所以,这个时候我们的static就出马了。

在JAVA中,被static修饰的成员,称之为静态变量,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。

2、static修饰成员变量

static修饰的成员变量,称为静态变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
静态成员变量特性:
1.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
2.既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3.类变量存储在方法区中
4.生命周期伴随类的一生。(随类的加载而加载,随类的卸载而销毁)

在这里插入图片描述

在这里插入图片描述
运行结果如下:
在这里插入图片描述
上面的代码,我们是已经给班级赋值了,如果不赋值会是怎样呢?
我们看代码:
在这里插入图片描述
剩下的不改变,运行一下:
在这里插入图片描述
这里称为了null,至于为什么?咱们可以看看上一篇文章就懂啦!
我们也可以在类外赋值,如何赋值呢?看代码:
在这里插入图片描述
在这里插入图片描述

3、static修饰成员方法

在这里插入图片描述

成员方法同样也是使用类名进行访问的,在JAVA中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
静态方法特性:
1.不属于某个具体的对象,是类方法
2.可以通过对象调用,也可以通过类名调用,更推荐使用类名调用
3.不能在静态方法中访问任何非静态成员变量
4.静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法调用时候无法传递this引用。

我们用代码说明一下上面的特性3和4
在这里插入图片描述
在这里插入图片描述
这就是本部分的内容啦,但是还没有结束,咱们的思维导图还没有整理完哦。

4、static成员变量初始化

(1)就地初始化

就地初始化就是在定义时就直接给出初始值

在这里插入图片描述

(2)静态代码块初始化

还记得这张图吗?就让我们继续学习吧!
在这里插入图片描述

三、代码块

1、代码块概念以及分类

使用{}定义的一段代码称为代码块,根据代码块定义的位置以及关键字,又可分为以下四种:
1.普通代码块
2.构造块
3.静态块
4.同步代码块

2、普通代码块

定义在方法中的代码块

在这里插入图片描述
运行结果如下:
在这里插入图片描述

3、构造代码块

定义在类中的代码块,也叫实例代码块。构造代码块一般用于初始化实例成员变量。

在这里插入图片描述

4、静态代码块

使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量。

在这里插入图片描述
在这里插入图片描述

拓展:

在这里我们拓展一个点,我们先看代码:

public class Student {public String name;public int age;public static String classes;public Student(){System.out.println("不带参数的构造方法");}public Student(String name, int age) {System.out.println("带两个参数的构造方法");this.name = name;this.age = age;}{System.out.println("这是实例代码块/构造块");}// 类加载的时候就会执行static {System.out.println("这是静态代码块");}public void show(){System.out.println(this.name + "今年" + this.age + "岁了");}public static void main(String[] args) {Student student = new Student();}
}

我们运行一下看结果:
在这里插入图片描述
我们的静态代码块在类加载的时候就会执行了,我们把main方法改成下面这样并且运行试试:
在这里插入图片描述
这就证明了我们上面的答案。
这个时候,我们再看下面的代码:
在这里插入图片描述
我们发现再次实例化的时候,静态代码块就没有再执行了。

这就是因为静态的只会执行一次

注意:
1.静态代码块不管生成多少个对象,其只会执行一次
2.静态成员变量是类的属性,因此是在JVM加载嘞时开辟空间并且初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行
4.实例代码块只有在创建对象时才会执行

四、内部类

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。

在JAVA中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类,内部类也是封装的一种体现。

1、内部类的分类

实例内部类
静态内部类
局部内部类
匿名内部类
在这里插入图片描述

2、实例内部类

class Outer{public int data1;int data2;public static int data3;public void test(){System.out.println("Outer --> test()");}// 实例内部类 --> 未被static修饰class Inner{public int data4;int data5;public void func(){System.out.println("Inner --> func()");}}
}public class Test {}

我们已经写好了上面的代码,我们就慢慢来理解实例内部类吧!

如何获取内部类的对象
我们可以把内部类看做一个实例成员,使用外部类的对象来调用

在这里插入图片描述
使用上面的两种方法都是可以的。

注意:
1.外部类中的任何成员变量都可以在内部类方法中直接访问
2.实例内部类所处的位置与外部类成员位置相同,因此也受public,private等访问限定符的约束
3.在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员来访问
4.实例内部类对象必须在先有外部类对象的前提下才能创建
5.实例内部类的非静态方法中包含了一个指向外部类对象的引用
6.外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象

3、静态内部类

class Outer{public int data1 = 1;int data2 = 2;public static int data3 = 3;public void test(){System.out.println("Outer-->test()");}static class Inner{public int data4 = 4;int data5 = 5;public static int data6 = 6;public void func(){System.out.println("Inner-->func()");}}
}
public class Test {public static void main(String[] args) {}
}

如何获取静态内部类对象

在这里插入图片描述

注意:
1.在静态内部类中只能访问外部类中的静态成员
在这里插入图片描述
当然,如果我们非要访问也是有办法的:
在这里插入图片描述

2.创建静态内部类对象时,不需要先创建外部类对象。

4、局部内部类

定义在外部类的方法体或者{}中,该中内部类只能在其定义的位置使用,使用很少

public class Test {public void func(){// 局部内部类class Inner{}}public static void main(String[] args) {}
}

在这里插入图片描述

注意:
1.局部内部类只能在所定义的方法体内部使用
2.不能被public,static等修饰
3.编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
4.几乎不会使用

5、匿名内部类

class Person{public String name;public int age;
}public class Test {public static void main(String[] args) {// 匿名对象 只能使用一次new Person();System.out.println(new Person().name);System.out.println(new Person().age);// 匿名内部类new Person(){};}
}

在这里插入图片描述

五、对象的打印

class Person{public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}public void print(){System.out.println(this.name + "今年" + this.age + "岁了");}
}
public class Test {public static void main(String[] args) {Person person = new Person("Tom",12);person.print();}
}

运行结果如下:
在这里插入图片描述
我们可以看到,我们每次打印的时候需要调用print方法,当字段很多的时候,我们写print方法的时候会显得函麻烦,这时候我们就需要更简单的方法了。在我们JAVA中就有这样的方法,我们先看下面的代码:
在这里插入图片描述
我们看到红色方框中的是一堆看不懂的东西(它当然是有意义的,我们这里不说他是什么意思),我们想要把它变成打印里面的对象该怎么办呢?

这时候就需要用到我们所说的toString方法了

看代码:

class Person{public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}public void print(){System.out.println(this.name + "今年" + this.age + "岁了");}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Test {public static void main(String[] args) {Person person = new Person("Tom",12);person.print();System.out.println(person);}
}

运行结果如下:
在这里插入图片描述

我们同样是有快捷键来生成toString方法的,我们看下面的步骤
1.右键 --> Generate
在这里插入图片描述
2.找到toString()点击并选择就可以可以生成啦在这里插入图片描述
在这里插入图片描述
或者使用Alt + Insert ,剩下的步骤是完全一样的。

我们JAVASE之类和对象部分就全部学习完啦,但是我们还需要继续努力,继续加油!!!

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

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

相关文章

Spring Boot 3.0:未来企业应用开发的基石

文章目录 一、Spring Boot 3.0的核心特性二、Spring Boot 3.0的优势三、如何在项目中应用Spring Boot 3.01.更新项目依赖2.调整代码结构3.测试和部署 《学习Spring Boot 3.0》内容简介作者简介目录内容介绍 随着技术的飞速发展&#xff0c;企业应用开发的需求也在不断演变。Spr…

爽!AI手绘变插画,接单赚爆了!

我最近发现一款名叫Hyper-SD15-Scribble的AI项目&#xff0c;可以实现一键手绘变插画的功能&#xff0c;而且它搭载了字节出品的超快速生成图片的AI大模型Hyper-SD15&#xff0c;可以实现几乎实时生成图片&#xff0c;有了它&#xff0c;拿去接一些手绘商单分分钟出图&#xff…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

WPF学习日常篇(一)--开发界面视图布局

接下来开始日常篇&#xff0c;我在主线篇&#xff08;正文&#xff09;中说过要介绍一下我的界面排布&#xff0c;科学的排布才更科学更有效率的进行敲代码和开发。日常篇中主要记录我的一些小想法和所考虑的一些细节。 一、主界面设置 主界面分为左右两部分&#xff0c;分为…

有什么免费视频翻译软件?安利5款视频翻译软件给你

随着“跨文化交流”话题的热度不断攀升&#xff0c;越来越多的视频内容跨越国界&#xff0c;触及全球观众。 在这一趋势下&#xff0c;视频翻译行业迎来了巨大的发展机遇。然而&#xff0c;面对众多的视频翻译工具&#xff0c;如何挑选出最合心意的那款呢&#xff1f; 现在&a…

【C++】从零开始构建红黑树

送给大家一句话&#xff1a; 日子没劲&#xff0c;就过得特别慢&#xff0c;但凡有那么一点劲&#xff0c;就哗哗的跟瀑布似的拦不住。 – 巫哲 《撒野》 &#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b; ⛰️⛰️…

matlab使用教程(78)—控制颜色图范围

1.控制颜色图范围 对于您创建的许多类型的可视化图形&#xff0c;MATLAB 默认将完整的数据范围映射到颜色图上。数据中的最小值映射到颜色图中的第一行&#xff0c;最大值映射到颜色图中的最后一行。所有中间值线性映射到颜色图的中间行。 这种默认映射适用于大部分情况&#x…

auto关键字(C++11)

auto关键字&#xff08;C11&#xff09; 文章目录 auto关键字&#xff08;C11&#xff09;前言一、auto使用规则二、auto不适用的场景三、auto推荐适用的场景总结 前言 在C11中&#xff0c;auto关键字能够自动推导出变量的实际类型&#xff0c;可以帮助我们写出更加简洁、现代…

【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串

【LeetCode刷题】Day 7 题目1&#xff1a;209.长度最小的子数组思路分析&#xff1a;思路1&#xff1a;暴力枚举 O(N^2^)思路2&#xff1a;滑动窗口 O(N) 题目2&#xff1a;3. 无重复字符的最长子串题目分析&#xff1a;思想1&#xff1a;暴力枚举哈希表O(N^2^)思想2&#xff1…

【C语言】八进制、十六进制

前言 在我们日常生活中使用的数往往是十进制的&#xff0c;而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制&#xff08;尤其是2的幂相关的进制&#xff0c;因为这种计数系统比十进制更接近于计算机的二进制系统&#xff09;&#xff0…

【图解IO与Netty系列】IO的同步与异步、阻塞与非阻塞,Linux五种IO模型

IO的同步与异步、阻塞与非阻塞&#xff0c;Linux五种IO模型 IO的同步与异步&#xff0c;阻塞与非阻塞阻塞IO与非阻塞IO同步IO与异步IO Linux五种IO模型BIONIOIO多路复用信号驱动IOAIO IO的同步与异步&#xff0c;阻塞与非阻塞 我们有时会看到类似于同步阻塞式IO、同步非阻塞式…

(避坑)SpringSecurity关于使用.antMatchers放行接口不生效问题

问题 在使用SpringSecurity的时候发现放行指定接口一直没有生效&#xff0c;使用"/**"就可以生效的问题 关于securityConfig的配置代码 Beanprotected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf().disable() // 关闭csrf防护…

博客开始使用 Cache Master 缓存插件

明月在给大家推荐 Cache Master 插件的时候&#xff08;可参考【推荐个比较纯正的缓存插件——Cache Master】一文&#xff09;&#xff0c;仅仅是在其他站点上试用了一下&#xff0c;今天明月正式在博客上用上了 Cache Master&#xff0c;没有想到对 Dragon 主题的支持竟然是出…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

rtsp协议分析

rtsp概述 rtsp (real-time stream protocol)实时流媒体控制协议。RFC2326&#xff1a;这是RTSP的初始定义版本v1.0&#xff0c;由哥伦比亚大学、网景和RealNetworks公司提交给互联网工程任务组&#xff08;IETF&#xff09;作为RFC标准。RFC7826&#xff1a;这是RTSP的后续更新…

Java进阶学习笔记14——模板方法设计模式

面试和看源码。 谈到设计模式&#xff1a; 1、解决了什么问题&#xff1f; 2、怎么写&#xff1f; 模板方法设计模式解决了什么问题&#xff1f; 解决方法中存在重复代码的问题。 写法&#xff1a; 1&#xff09;定义一个抽象类&#xff1a; 2&#xff09;在里面定义两个方…

C# 控制台应用模板可生成顶级语句

C# 控制台应用模板可生成顶级语句 项目2024/01/0810 个参与者 反馈 本文内容 使用新的程序样式隐式 using 指令全局 using 指令使用旧程序样式 从 .NET 6 开始&#xff0c;新 C# 控制台应用的项目模板在 Program.cs 文件中生成以下代码&#xff1a; C#复制 // See https…

C++ prime 第五版 第14章 重载运算与类型转换

一、基本概念 重载的运算符是具有特殊名字的函数&#xff1a;它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样&#xff0c;重载的运算符也包含返回类型、参数列表以及函数体。 我们不能为内置类型的运算对象重定义运算符。对于一个运算符函数来说&…

某方protobuf闲谈

问题 当我们去看某方的时候,搜索了关键词svm,然后通过抓包查看,请求的Request Payload是一串看不懂的乱码,并且返回的数据也大部分是乱码 观察请求的Content-Type是application/grpc-web+proto,没错数据的传输是protobuf的形式了 protobuf的相关概念和原理,网上有很多教…

vulhub——Aria2、bash、catic

文章目录 一、Aria2 任意文件写入漏洞二、CVE-2014-6271&#xff08;Bash Shell 漏洞&#xff09;三、CVE-2022-46169&#xff08;Cacti 前台命令注入漏洞&#xff09; 一、Aria2 任意文件写入漏洞 Aria2是一个命令行下轻量级、多协议、多来源的下载工具&#xff08;支持 HTTP…