当前位置: 首页 > news >正文

Java---类与对象

类与对象

  • 前言:
  • 一、面向对象
  • 二、类的定义
    • 1.类的定义格式
    • 2.访问修饰限定符
  • 三、类的实例化
  • 四、this引用
    • 1.this引用
    • 2.this引用的原因
  • 五、对象的构造和初始化
    • 1.初始化对象
    • 2.构造方法
      • (1).构造方法的概念:
      • (2).特性:
      • (3).this调用:
      • 3.就地初始化
      • 4.默认初始化
  • 六、封装
    • 1.访问限定符
    • 2.Java中的包
      • (1).包的概念
      • (2).导入包中的类
      • (3).自定义包
  • 七、static成员
    • 1.static修饰成员变量
    • 2.static修饰成员方法
    • 3.总结
  • 八、代码块使用
    • 1.代码块的分类
    • 2.普通代码块
    • 3.构造代码块
    • 4.静态代码块
    • 5.静态与构造的对比
  • 总结:

前言:

上节我们介绍了数组的详细操作,这期内容我为大家带来类与对象的讲解。

一、面向对象

关于面向对象的理解,我们或许都听过Java和C++是面向对象的编程语言,而Java是一门纯面向对象的语言,所以在面向对象的世界里,一切皆是对象,并且在生活有许多事物都可被看作是对象,如一个苹果,一个台洗衣机等这些都具有实体都可以被看作为对象,所以在面向对象的世界里,通过对象的交互来完成事情,这比较贴近于我们的生活,也更符合现在的对事物的认知。通过将对象划出了属性和行为,比如一名学生,那么它的属性就是成绩,姓名,年龄等这些,那么它的行为就是学习,考试,吃饭等。
在这里插入图片描述
这节我们先介绍封装,比如类就是一种把对象的属性与行为进行了封装,因此也可以把这个类理解为就是一个载体,比如计算机就是一种封装,内部具体的细节是如何实现的,我们并不会知道,但是我们仅知道如何去操作计算机,使用鼠标,开关机键等;
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互 ,在类与对象中我们主要研究的是封装性,关于另外两大特性,下节再为大家进行详细的讲解。

二、类的定义

1.类的定义格式

在Java中定义类需要用到class关键字

class ClassName {//类名一定要大驼峰的方式field;  // 字段(属性) 或者 成员变量method; // 行为 或者 成员方法}

上述中class是关键字,ClassName是类名,{} 中为类的主体
比如我们定义一个洗衣机类:

class WashMachine {//类名一定要大驼峰的方式//类具有属性,就可以简单的理解为洗衣机的参数//(成员)属性(有的书上会表示成员属性或者字段)// 特点 :是定义在类的里边,方法的外边public String brand;// 品牌public String type; // 型号public double weight; // 重量public double length; // 长public double width; // 宽public double height; // 高public String color; // 颜色//行为(也叫做成员方法)public void washColthes() {//洗衣服System.out.println("洗衣功能");}public void dryColthes() {//脱水System.out.println("脱水功能");}public void setTime() { //定时System.out.println("定时功能");}
}

注意事项:

  1. 一般一个文件当中只定义一个类
  2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
  3. public修饰的类必须要和文件名相同
  4. 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改(给同学演示)。
  5. 要想去修改一般也是在一个java文件有一个类的情况去修改
    在这里插入图片描述
    鼠标右键点击类名,比如我的这个类名就是TestDemo,然后再按如图所操作。

2.访问修饰限定符

在这里插入图片描述
这节我们主要讲到的是private,default(默认),public,这些是现阶段类与对象中主要研究的,protected我下一节我会给大家带来详细的讲解;
public修饰的成员变量和方法均可以在类中和类外去直接访问,
private修饰的成员变量和方法只能在一个包中的一个类中去使用,其余的不行,
default是指没有修饰符,就是默认的情况,它只能在一个包中,可以在该包中所有的类去访问和使用

三、类的实例化

定义了一个类的这个过程,就相当于在计算机中定义了一种新的类型,所以他们可被称作为’类‘类型
用类类型创建对象的过程,被称之为类的实例化。
类就是好比于一个模板,通过这里面的成员属性和成员方法来进行对象的实例化

class Dog{public String name;public String color;public int age;public void eat(){System.out.println(name + "吃饭");}public void bark(){System.out.println(name + "狂吠");}
}
public class TestDemo {public static void main(String[] args) {Dog dog = new Dog();//对象的实例化dog.name = "初一";dog.age = 10;dog.color = "黄色";System.out.println(dog.name);System.out.println(dog.age);System.out.println(dog.color);dog.bark();dog.eat();//这时候就不需要用sout输出,//因为在Dog类中它们本身是行为(方法),所以这个时候也就相当于调用System.out.println("==============");Dog dog2 = new Dog();dog2.name = "初二";dog2.age = 13;dog2.color = "黑色";System.out.println(dog2.name);System.out.println(dog2.age);System.out.println(dog2.color);dog2.bark();dog2.eat();}
}	

在这里插入图片描述
通过一个new关键字来实例化了一个dog对象,Dog dog = new Dog()中的dog就是一个引用指向了dog对象
dog是一个局部变量,
在main方法中,那么就是在虚拟机栈上创建了一个空间,而我们已经知道了通过new关键字生成的对象(属性)都存储在堆上,所以也通过了上述的操作,dog也获得了Dog()对象(属性的)的地址,所以它指向了Dog()的对象(属性)。
所以在java中采用new关键字,配合类名来实例化对象;然后通过对象的引用来访问对象的属性即“ . “,
对象的成员属性在没有赋值的时候引用类型默认的是null,简单类型对应的为0,boolean被默认为false,
char默认为’\u0000’。
做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,
只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
总结:
1. 每次new了一个新的对象,都会去开辟一块新的内存
2. 通过new关键字可以实例化多个对象,但是每个对象都是独立的,互不干扰的
3. 同一个类可以创建多个实例(即使多个对象)
4.类是一种自定义的类型,所以可以能够来定义变量

四、this引用

1.this引用

this是对当前对象的引用,在成员方法中所有成员变量的操作,都是通过该引用去访问

public class Date {//属性public int year;public int month;public int day;//行为public void setDate1(/*Date this,*/int y,int m,int d){//建立日期this.year = y;this.month = m;this.day = d;}public void setDate2(int year,int month,int day){//建立日期year = year;month = month;day = day;}public void setDate3(int year,int month,int day){//建立日期this.year = year;this.month = month;this.day = day;}public void printDate(){//打印日期System.out.println(this.year+"年"+this.month+"月"+this.day+"日");}public static void main(String[] args) {Date date = new Date();date.setDate1(2005,12,19);date.printDate();System.out.println("==============");Date date2 = new Date();date2.setDate1(2000,01,20);date2.printDate();}
}

在这里插入图片描述
那么这个时候有多个set方法,那么这个时候谁调用了当前的setDate方法,那么谁就是使用this;并且编译器会帮我们隐藏一个变量叫做Date this,所以就会表明了这个this就是这个类的对象的

2.this引用的原因

public class Date {//属性public int year;public int month;public int day;//行为public void setDate2(int year,int month,int day){//建立日期year = year;month = month;day = day;}  public void printDate(){//打印日期System.out.println(year+"年"+month+"月"+day+"日");}public static void main(String[] args) {Date date = new Date();date.setDate2(2000,01,10);System.out.println("他的生日是:");date.printDate();//调用这个方法}
}

在这里插入图片描述
这个时候的打印结果就是0年0月0日;就近访问原则:在传参数的时候,如果同名,那么局部变量优先自己给自己赋值,那么也就是在虚拟机栈上中自己给自己赋值通过new关键字定义,我们明白date在虚拟机栈上来创建栈帧;实例化的对象被创建并储存在堆上。

public class Date {public int year;public int month;public int day;public void setDate3(int year,int month,int day){//建立日期this.year = year;this.month = month;this.day = day;}     public void printDate(){//打印日期System.out.println(this.year+"年"+this.month+"月"+this.day+"日");}  
}public static void main(String[] args) {Date date = new Date(); Date date2 = new Date();date2.setDate1(2000,01,20);date2.printDate();     }        

在这里插入图片描述
这个时候打印的就是我传的参数
结论:

  1. 当形参与成员变量名相同时,会造成局部变量优先赋值。
  2. this是对当前对象的引用,建议我们习惯使用this,所以让我们自己可以充分地了解的那一个方法是调用哪一个对象。
  3. this只能在"成员方法"中使用
  4. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
  5. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收

五、对象的构造和初始化

1.初始化对象

在学习Java中,我们都明白在Java方法内部定义一个局部变量,必须要初始化,否则会编译失败。

public class TestDemo {public static void main(String[] args) {Student student = new Student();student.name = "张三";student.age = 19;student.eat();student.show();}
}
class Student{//成员变量public String name;public int age;//成员方法public void eat(){System.out.println(this.name + "吃饭了");}public void show(){System.out.println("姓名:" + this.name + " 年龄:" + this.age);}
}

在这里插入图片描述
这种就是通过对象的实例化的同时赋予了值进行了初始化。

2.构造方法

(1).构造方法的概念:

  1. 方法名必须和类名相同
  2. 没有返回值
  3. 在整个对象的生命周期只有一次

(2).特性:

例如我有一个Student的类,那么它的构造方法就是Student,

    public Student(){System.out.println("打印一个不带参数的方法");}    

再通过对象的实例化的时候,就是可以调用了构造方法

class Student{//成员变量public String name;public int age;public Student(){System.out.println("不带参数的构造方法");}
}
public class TestDemo {public static void main(String[] args) { Student student = new Student();}
}       

在这里插入图片描述

注意:构造方法的作用就是对对象中的成员进行初始化,但并不负责给对象开辟空间

class Student{//成员变量public String name;public int age;public Student(String name,int age){this.name = name;this.age = age;System.out.println("带有2个参数的构造方法");}
}
public class TestDemo {public static void main(String[] args) {Student student1 = new Student("zhangfei" ,99);}
}    	

在这里插入图片描述
构造方法之间是可以构成方法的重载:

  1. 方法名相同
  2. 参数列表不同
    如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
    一旦用户显式定义编译器则不会再生成

(3).this调用:

class Student{//成员变量public String name;public int age;public Student(String name,int age){this.name = name;this.age = age;System.out.println("带有2个参数的构造方法");}public Student(){this("cc",19);System.out.println("不带参数的构造方法");}
}
public class TestDemo {public static void main(String[] args) {Student student = new Student();}
}    

this();是调用类当中的其他构造方法,比如这个时候就会调用了public Student(String name,int age)这个方法
只能在当前的构造方法内部来使用,并且只能在第一行
在这里插入图片描述
在这里插入图片描述
而这个时候我们看到了先打印的是带有两个构造参数的方法,因为我实例化没有参数,所以先去无参数寻找,发现了this(),然后再去调用有参数的构造方法,所以先打印了有参数的方法,再打印了无参数的方法。

class Student{//成员变量public String name;public int age;//成员方法public void eat(){System.out.println(this.name + "吃饭了");this.show();//这种调用的不是构造方法,那么this可以不是在第一行}public Student(String name,int age){this.name = name;this.age = age;System.out.println("带有2个参数的构造方法");}public void show(){System.out.println("姓名:" + this.name + "年龄" + this.age);}
}
public class TestDemo {public static void main(String[] args) {Student student = new Student("张三",19);student.eat() ;
}

在这里插入图片描述
this还可以调用其他的成员方法,但是此时便可以不用在第一行了
当然this调用还需要一些注意的地方,不能形成环

class Date(){public Date() {this(1991, 1, 1)}public Date(int year, int month, int day){this();}
}

构造方法的绝大多数情况下使用public来修饰,特殊场景下会被private修饰,被private修饰之后的构造方法只能在类中使用,关于这个情况我们后期会给大家进行讲解

3.就地初始化

在声明成员变量的同时,便直接给出了初始化的值

class Student{//成员变量public String name ="张三";public int age = 19;public Student(){System.out.println("不带参数的构造方法");}//成员方法public void eat(){System.out.println(this.name + "吃饭了");}public void show(){System.out.println("姓名:" + this.name + " 年龄:" + this.age);}public static void main(String[] args) {Student student = new Student();student.show();student.eat();}
}

在这里插入图片描述
当然我们还可以快速进行写出了带有参数构造方法,用IDEA
鼠标右键点击代码空白处,然后点击Generate,再点击
Constructor,选中你要的参数,点击就可以进行构造了在这里插入图片描述

在这里插入图片描述

4.默认初始化

class Date{public int year;public int month;public int day;public void setDate(int year,int month,int day){this.year = year;this.month = month;this.day = day;}public Date(){System.out.println("一个不带参数的构造方法");}public void printDate(){System.out.println(this.year+ "年" + this.month + "月" + this.day + "日");}public static void main(String[] args) {Date date = new Date();date.printDate();}
}

这时候我们没有进行赋值,那么成员变量便会自己赋值为0,或者null
在这里插入图片描述

六、封装

1.访问限定符

前面我们已经简单介绍过了封装的概念,那么接下来我就详细地介绍一下访问限定符中的private,
我们封装现阶段主要可以用它来进行,因为我们都知道private只能在当前的类中去使用,一但出了这个类就不能用了。

class Student{private String name;private int age;public void eat(){System.out.println(this.name + "吃饭了");this.show();//这种调用的不是构造方法,那么this可以不是在第一行}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName(){return this.name;}public void setName(String name){this.name = name;}public Student(String name, int age) {this.name = name;this.age = age;}public Student(){this("cc",19);System.out.println("不带参数的构造方法");}public void show(){System.out.println("姓名:" + this.name + "年龄" + this.age);}
}
public class TestDemo {public static void main(String[] args) {Student student = new Student();student.setName("why");System.out.println(student.getName());}

这个时候用private修饰name,那么这个时候只能在类中进行赋值和使用,一旦出了这个类,就报错;如果这个时候还想对name赋值和使用,那么我们就要在类中定义方法。比如我们有定义了getName和setName方法,这时候调用这两个方法就可以解决。
鼠标右键generate,选中Getter and Setter,就可以快速创建可以修改还可以赋值的方法,在封装的情况下(比如利用private来实现封装)
在这里插入图片描述
当然我们可以根据自己的需求来进行选择,Getter和Setter可以分别进行创建。

2.Java中的包

(1).包的概念

为了更好的管理类,把多个类收集在一起成为一组,称为软件包,
所以我们在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。

(2).导入包中的类

再Java中有许多现成的类,我们只要通过导入就可以实现让其我们使用,
比如日期Date类,我们就可以使用java.util.Date搭配入了java.util这个包中的Date类

	public static void main(String[] args) {java.util.Date date = new java.util.Date();//所以我们在代码中的Date前直接加上java.util.  不在前面声明    }           

我们可能觉得这种方法是会比较麻烦,所以我们可以在类前面通过import语句来进行导入这个包

import java.util.Date;
public class TestDemo {public static void main(String[] args) {Date date = new Date();}           
}    

比如我们在前面数组中讲过用数组的快速操作,那么也是通过导入这个包中的类,比如我们还想调用数组;
所以这时候我们还需要写java.util.Arrays但是这也是这个包中的类,所以我们可以用**通配符“ * ”**这个可以适配所有的这个包中的类,让它自己寻找,比如有Arrays和Date的情况下,那么它调用Arrays时,那么这个通配符就会是Arrays,同理Date时,那么通配符就是Date。

import java.util.*;
public class TestDemo {public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};String ret = Arrays.toString(array);System.out.println(ret);Date date = new Date();System.out.println(date.getTime());}
}   

在这里插入图片描述
当然这里有个情况也要注意一下:

import java.util.*;
import java.sql.*;                        
public class TestDemo {public static void main(String[] args) {Date date = new Date();System.out.println(date.getTime());}
}            

在这里插入图片描述
因为sql这个包也是有Date类,编译器无法识别,是哪一个中的,所以我们更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.为了更好的显示,所以我们在代码中直接加上,不在前面声明

import java.util.*;
//import java.util.Date;
import java.sql.*;
public class TestDemo {public static void main(String[] args) {java.util.Date date = new java.util.Date();System.out.println(date.getTime());}
}                   

在这里插入图片描述
我们还可以进行静态导入:

import static java.lang.Math.*;//静态导入public class TestDemo {public static void main(String[] args) {double x = 30;double y = 40;//double result1 = Math.sqrt(Math.pow(x,2)) + Math.pow(y,2));//正常写一个double result = sqrt(pow(x,2)) + (pow(y,2));//静态导入System.out.println(result);}
} 

在这里插入图片描述

(3).自定义包

自定义包名全是英文字母要小写
包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式
比如xx网址:com.xx.www
那么这个时候我创建了一个包,该包有三个文件夹 ,所以我们可以在每个文件夹去建立类
其实src也是一种包
操作步骤:在IDEA中新建一个包:右键src,按如图操作
在这里插入图片描述
然后写好包名即可,然后再创建类即可
包名要和代码路径相匹配. 例如创建 com.xx.demo1 的包, 那么会存在一个对应的路径 com/xx/demo1 来存储代码.
如果一个类没有 package 语句, 则该类被放到一个默认包中.
还有就是包权限就是default的访问权限,在一个包中不同类可以进行访问
我们常见的包,有这些:

  1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
  2. java.lang.reflect:java 反射编程包;
  3. java.net:进行网络编程开发包。
  4. java.sql:进行数据库开发的支持包。
  5. java.util:是java提供的工具程序包。(集合类等) 非常重要
  6. java.io:I/O编程开发包。

七、static成员

1.static修饰成员变量

static修饰的成员变量被称之为静态成员变量,静态成员变量最大特性是:不属于某个对象,是所有的对象是共有的
举个例子:一个学校里有师生,但是师生都在教室里上课,那么这个教室就是师生所共有的。

class Student{//成员变量private String name;private int age;public String classRoom;//构造方法public Student(){}public Student(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 eat(){System.out.println(this.name + "正在吃饭");}public void show(){System.out.println("姓名" + this.name + "年龄" + this.age );}
}
public class Test {public static void main(String[] args) {Student student1 = new Student("A",10);student1.classRoom = "109";Student student2 = new Student("B",3);student2.classRoom = "109";Student student3 = new Student("C",15);student3.classRoom = "109";}
}

在这里插图片描述
这个时候我们通过调试可以看到classRoom是共有的
如果我们将classRoom进行static的修饰,这时候我们再看,

class Student{//成员变量private String name;private int age;public static String classRoom;//构造方法public Student(){}public Student(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 eat(){System.out.println(this.name + "正在吃饭");}public void show(){System.out.println("姓名" + this.name + "年龄" + this.age );}
}
public class Test {public static void main(String[] args) {Student student1 = new Student("A",10);Student student2 = new Student("B",3);Student student3 = new Student("C",15);Student.classRoom = "109";//因为它被static修饰完之后,就不再对象的里面,所以说我们就不需要对象的引用了System.out.println(Student.classRoom);}
}

在这里插入图片描述
当使用static时候,我们通过调试来进行,可以发现对象实例化出并没有classRoom;所以当把classRoom使用static修饰之后,就不存在与对象之中了;那么此时的classRoom被拿到了方法区(虚拟机栈)并被赋值 “109”;那么此时的所有的对象都会共用了classRoom这个成员变量。
静态成员变量的实现不需要类的对象的引用(不依赖于对象),仅需要类名的调用即可

2.static修饰成员方法

与之静态成员变量非常之类似,在Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的

class Student{//成员变量private String name;private int age;public static String classRoom;//构造方法public Student(){}public Student(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 eat(){System.out.println(this.name + "正在吃饭");}public void show(){System.out.println("姓名" + this.name + "年龄" + this.age );}public static void func(){System.out.println("这是一个静态的方法");}
}
public class Test {public static void main(String[] args){Student.func();}
}

在这里插入图片描述
静态方法的调用也是用类名来进行调用。
当然也可以用对象的实例化,都是可以的
例如:

public class TestDemo {public static void main(String[] args){Student student = new Student();student.func();//对象的实例化}
}
public class TestDemo {public static void main(String[] args){Student student = null;//表示student这个引用不指向任何对象。所以此处可以正常访问。student.func();}
}

但是我们需要牢记,静态方法的正确访问方式应该是用类类型来访问

静态方法不能直接调用非静态的成员方法或者调用成员变量 我们可以看接下来进行的例子

class Student{//成员变量private String name;private int age;public static String classRoom;//构造方法public Student(){}public Student(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 eat(){System.out.println(this.name + "正在吃饭");}public void show(){System.out.println("姓名" + this.name + "年龄" + this.age );}public static void func(){System.out.println("这是一个静态的方法");//show();//这么直接去调用的类中的非静态方法,会直接报错//所以在静态方法内部不能直接调用非静态方法//必须要通过类进行引用Student student = new Student();student.setName("A");student.setAge(19);student.show();}
}
public class Test {public static void main(String[] args){Student.func();}
}

在这里插入图片描述
总结: 静态方法不能直接调用非静态的成员方法或者调用成员变量,static方法中不能使用this
一个非静态方法可以调用静态方法,因为静态方法的调用不需要对象的引用,但是我们也可以让其强制依赖

3.总结

静态成员:

  1. 不属于某个具体的对象,是类的方法和变量,类变量是所有对象共享的,不存储在某个对象的空间中
  2. 可以通过对象调用,也可以通过类名,我们更推荐后者
  3. 类变量存储在方法区当中,生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁),就执行一次
  4. 不能在静态方法中直接访问任何非静态成员变量,需要类的对象的引用
  5. 静态方法中不能直接调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用,我们可以用对象的引用来进行间接调用
    比如这样:
	public static void func(){System.out.println("这是一个静态的方法");Student student = new Student();student.show();}

static成员变量也可以进行初始化,前面已经展现一种通过赋值,另一个本地初始化,还有一种就是代码块来进行初始化

八、代码块使用

{} 定义的一段代码称为代码块。

1.代码块的分类

普通代码块
构造块
静态块
同步代码块(这个我们到多线程的部分再进行详细的讲解)

2.普通代码块

定义在方法中的代码块

 public static void main(String[] args) {{int x = 10;System.out.println(x);}System.out.println(x);//上述大括号中x的生命的周期是在{}中,所以出了作用域就用不了了}

在这里插入图片描述

	public static void main(String[] args) {{int x = 10;System.out.println(x);}int m = 12;System.out.println(m);}

3.构造代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。

class Student{private String name;private int age;//静态成员变量public static String classRoom = "109";//就地初始化//构造方法public Student(){System.out.println("不带参数的构造方法");}//构造代码块//在方法的外面,类的里面{this.name = "WHY";this.age = 19;System.out.println("实例代码块");}public Student(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 eat(){System.out.println(this.name + "正在吃饭");}public void show(){System.out.println("姓名:" + this.name + " " + "年龄:" + this.age );}public static void func(){System.out.println("这是一个静态的方法");Student student = new Student();student.show();}
}
public class Test {public static void main(String[] args) {//调用不带参数的构造方法Student student = new Student();student.show();}
}    

在这里插入图片描述
通过打印结果可知,最先执行的是构造代码块,其次是构造方法,最后调用了show方法

4.静态代码块

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

class Student{private String name;private int age;//静态成员变量public static String classRoom = "109";//就地初始化//构造方法public Student(){System.out.println("不带参数的构造方法");}//静态代码块static{classRoom = "120";System.out.println("这是一个静态代码块!");}public Student(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 eat(){System.out.println(this.name + "正在吃饭");}public void show(){System.out.println("姓名:" + this.name + " " + "年龄:" + this.age );}public static void func(){System.out.println("这是一个静态的方法");Student student = new Student();student.show();}
}
public class Test {public static void main(String[] args) {//调用不带参数的构造方法Student student = new Student();student.show();}
}   

在这里插入图片描述

5.静态与构造的对比

class Student{private String name;private int age;//静态成员变量public static String classRoom = "109";//就地初始化//构造方法public Student(){System.out.println("不带参数的构造方法");}//(2).构造代码块//在方法的外面,类的里面{this.name = "ZS";this.age = 19;System.out.println("实例代码块");}//(3).静态代码块static{classRoom = "110";System.out.println("这是一个静态代码块!2");}static{classRoom = "111";System.out.println("这是一个静态代码块!1");}public Student(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 eat(){System.out.println(this.name + "正在吃饭");}public void show(){System.out.println("姓名:" + this.name + " " + "年龄:" + this.age );}public static void func(){System.out.println("这是一个静态的方法");Student student = new Student();student.show();}
}
public class Test {public static void main(String[] args) {Student student = new Student();student.show();}
}    

在这里插入图片描述
通过这个结果对比,我们发现了当静态和实例都有的时候,首先打印的是静态,然后实例,构造方法,最后再执行成员方法,但是我们发现了这里面有两个静态代码块,
然而它是按顺序执行的。可以把它们两个静态代码块看成一个

	static{classRoom = "110";System.out.println("这是一个静态代码块!2");classRoom = "111";System.out.println("这是一个静态代码块!1");}

那么静态代码块会一直都执行吗?我们前面讲到过静态变量会执行一次,那么我们按这个操作一下

//类还是上述的那个
public static void main(String[] args) {Student student1 = new Student();System.out.println("=============");Student student2 = new Student();
}

在这里插入图片描述
仅有一次,原因:
是因为静态成员是类的属性,仅仅在JVM加载类的时候并开辟空间才初始化
还有一点:实例代码块只有在创建对象时才会执行

//类还是上述的那个
public static void main(String[] args) {System.out.println(Student.classRoom);
}

在这里插入图片描述
所以只有类进行实例化之后构造代码块才能被执行。而静态代码块:
只要类被加载,那么它就会被执行

总结:

这篇文章很长,建议大家可以仔细阅读,获取自己有需要的知识,可以对你们大家有所帮助,如果还有哪些地方的不足,欢迎大家在评论区留言,下期为大家带来继承与多态的内容。

相关文章:

Java---类与对象

类与对象 前言:一、面向对象二、类的定义1.类的定义格式2.访问修饰限定符 三、类的实例化四、this引用1.this引用2.this引用的原因 五、对象的构造和初始化1.初始化对象2.构造方法(1).构造方法的概念:(2).特性:(3).this调用:3.就地初始化4.默…...

告别桌面杂乱与充电焦虑,移速165W百变桌面充电站首发体验

告别桌面杂乱与充电焦虑,移速165W百变桌面充电站首发体验 哈喽小伙伴们好,我是Stark-C~ 先如今,家里的电子产品越来越多,手机、平板、电脑三件套已经是基础配置,还有相机、Switch、智能手表等,这些产品用…...

基于springboot+vue的农产品电商平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

dom0运行android_kernel: do_serror of panic----failed to stop secondary CPUs 0

问题描述: 从日志看出,dom0运行android_kernel,刚开始运行就会crash,引发panic 解决及其原因分析: 最终问题得到解决,发现是前期在调试汇编阶段代码时,增加了汇编打印的指令,注释掉这些指令,问题得到解决。…...

MySQL 语句

MySQL 语句教程博客 MySQL 是目前广泛应用的关系型数据库管理系统,本文将详细介绍 MySQL 中常用的 SQL 语句及其应用,内容主要涵盖以下部分: DDL(数据定义语言) DML(数据操作语言) DQL&#…...

MySQL General Log

MySQL General Log MySQL General Log General Log 的开启General Log 的用法log_output 参数 MySQL主从复制:https://blog.csdn.net/a18792721831/article/details/146117935 MySQL Binlog:https://blog.csdn.net/a18792721831/article/details/146606…...

自动关机监控器软件 - 您的电脑节能助手

## 自动关机监控器 - 您的电脑节能助手 自动关机监控器是一款基于Python开发的实用工具,旨在帮助用户节省电力资源并延长电脑使用寿命。该程序通过监控用户的鼠标和键盘活动,在设定的无活动时间后自动关闭计算机,特别适合需要长时间离开电脑但…...

基于改进粒子群算法的多目标分布式电源选址定容规划(附带Matlab代码)

通过分析分布式电源对配电网的影响,以有功功率损耗、电压质量及分布式电源总容量为优化目标,基于模糊理论建立了分布式电源在配电网中选址定容的多目标优化模型,并提出了一种改进粒子群算法进行求解。在算例仿真中,基于IEEE-14标准…...

解锁健康密码:拥抱多元养生新方式

在追求高质量生活的当下,健康养生不再是一句空洞的口号,而是融入到日常生活的方方面面。它不仅关乎我们的身体健康,更与心理状态和生活品质息息相关。下面,就为大家介绍一些实用的养生知识,帮助大家开启健康生活之旅。…...

@Slf4j注解

Slf4j注解是Lombok库提供的一个注解,用于简化日志记录器的创建。使用该注解后,无需手动创建Logger实例,编译器会自动帮你完成这一步。以下是使用Slf4j注解打印日志的步骤和示例: 使用步骤 1. 引入依赖:在项目中引入SL…...

firewall-cmd添加访问规则

若要使用 **firewall-cmd** 允许 192.168.3.0/24 网段访问本地的 8088 端口,你可以按照以下步骤操作。 临时允许访问 如果你仅需临时允许该网段访问 8088 端口,可使用如下命令: firewall-cmd --add-rich-rulerule family"ipv4" …...

【Linux网络与网络编程】02.初识Socket编程

1. 数据传输的目的 前一篇文章中我们讲解了网络传输的流程,那么网络传输的目的是什么呢?难道我们只是将数据从一台主机传输到另一台主机吗? 当然不是的!因为数据是给人用的。比如:聊天是人在聊天,下载是人…...

Python库()

1.概念 Matplotlib 库:是一款用于数据可视化的 Python 软件包,支持跨平台运行,它能够根据 NumPy ndarray 数组来绘制 2D 图像,它使用简单、代码清晰易懂 Matplotlib 图形组成: Figure:指整个图形&#xf…...

CVPR-2025 | 南洋理工基于图表示的具身导航统一框架!UniGoal:通用零样本目标导航方法

作者:Hang Yin 1 ^{1} 1, Xiuwei Xu 1 ^{1} 1, Linqing Zhao 1 ^{1} 1, Ziwei Wang 2 ^{2} 2, Jie Zhou 1 ^{1} 1, Jiwen Lu 1 ^{1} 1单位: 1 ^{1} 1南洋理工大学, 2 ^{2} 2清华大学论文标题:UniGoal: Towards Universal Zero-sho…...

Banner区域

div下 justify-content:space-between 左侧测导航left 在这里插入图片描述 在这里插入图片描述...

【C++】C++11介绍列表初始化右值引用和移动语义

个人主页 : zxctscl 如有转载请先通知 文章目录 1. C11简介2. 统一的列表初始化2.1{}初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype3.3 nullptr 4. 范围for循环4.1 范围for的语法4.2 范围for的使用条件 5. STL中一些变化6. 右…...

基于Spring Boot的高校普法系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…...

GPT-4o 原生图像生成技术解析:从模型架构到吉卜力梦境的实现

最近不少 AI 爱好者、设计师、Vlogger 在社交平台晒出了 GPT-4o 生成的梦幻图像,尤其是吉卜力风格的作品——柔和光影、日系构图、治愈色彩、富有情感的角色表达,一下子击中了无数人的“童年回忆 审美舒适区”。 🎨 下面是一些 GPT-4o 实际生…...

无线通信技术(二):ITU、3GPP及传统波段对无线频谱的划分

本文介绍国际标准组织ITU、3GPP和传统波段对无线频谱的划分 。 一.ITU波段划分 国际电信联盟(ITU)将无线电频谱划分为多个频段,并根据频率范围和业务需求分配用途。 ITU对无线频谱的划分 带号频带名称频率范围波长范围波段名称典型应用…...

[Python学习日记-88] 并发编程之多进程 —— 队列与生产者消费者模型

[Python学习日记-88] 并发编程之多进程 —— 队列与生产者消费者模型 简介 队列 一、队列的介绍 二、队列的使用 生产者消费者模型 一、为什么要使用生产者消费者模型 二、什么是生产者消费者模型 三、生产者消费者模型的优势 四、生产者消费者模型的实现 JoinableQ…...

Vue学习笔记集--computed

computed 在 Vue 3 的 Composition API 中,computed 用于定义响应式计算属性 它的核心特性是自动追踪依赖、缓存计算结果(依赖未变化时不会重新计算) 基本用法 1. 定义只读计算属性 import { ref, computed } from vue;const count ref(…...

python之多线程,多进程理解

目录 一,什么是多线程多进程 1,1 多线程 1.2 多进程 二,多线程 2.1 使用threading模块 三,多进程 3.1 使用multiprocessing模块 3.2 多进程的优势 3.3 进程间的通信 四,如何选择多进程还是多线程 五,异步编程的替代方案(协程) 在开发过程中,提升程序的并…...

3月29日星期六今日早报简报微语报早读

3月29日星期六,农历三月初一,早报#微语早读。 1、全国公立医疗机构自3月31日起全面停止收取门诊预交金; 2、永辉超市“胖东来调改店”已达47家店 一线员工薪酬涨幅50%以上; 3、两孩家庭补10万,三孩家庭补20万&#…...

栈:隐匿于计算机科学长卷的璀璨明珠

目录 🚀前言🌟栈的概念🤔栈的两种实现形式💯数组栈实现💯链表栈实现 ⚙️数组栈与链表栈对比🐧递归与栈💻总结 🚀前言 大家好!我是 EnigmaCoder。 在计算机科学的宏大版图…...

【万字总结】前端全方位性能优化指南(七)——按需加载、虚拟列表、状态管理

现代框架高阶优化——突破复杂场景的性能临界点 当Web应用进入「十万级组件、百万级数据」的复杂场景时,传统优化手段开始触及框架底层瓶颈:Redux的单一Store引发级联渲染风暴、全量加载的首屏资源阻塞关键交互、长列表滚动导致内存飙升直至页面崩溃……这些痛点正在倒逼框架…...

合并石子 | 第十四届蓝桥杯省赛JavaB组

在桌面从左至右横向摆放着 N 堆石子。 每一堆石子都有着相同的颜色,颜色可能是颜色 0,颜色 1 或者颜色 2 中的其中一种。 现在要对石子进行合并,规定每次只能选择位置相邻并且颜色相同的两堆石子进行合并。 合并后新堆的相对位置保持不变&…...

【商城实战(94)】构建高并发的负载均衡与集群架构

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配&#xf…...

鸿蒙开发:了解Canvas绘制

前言 本文基于Api13 系统的组件无法满足我们的需求,这种情况下就不得不自己自定义组件,除了自定义组合组件,拓展组件,还有一种方式,那就是完全的自绘制组件,这种情况,常见的场景有,比…...

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务: (1)终端输入: sudo apt-get install vsftpd(2)安装完成后: 终端输入: /etc 是 Linux 系统的全局配置文件目录,存储系统和应用程序的配置信息…...

dav_pg8_vacuum

一、VACUUM基础概念 1.1 VACUUM的作用 在PostgreSQL中,当数据被更新或删除时,系统并不会立即释放物理空间,而是将其标记为 “可重用”。 随着时间推移,表中的死元组(已删除或已被新版本覆盖的数据)会越来越…...

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR(恒州博智)的统计及预测,2024年全球汽车无线紧急呼叫(eCall)设备市场销售额达到了25.17亿美元,预计2031年将达到44.97亿美元,年复合增长率(CAGR 2025-2031)为8.8%…...

Ubuntu桌面环境下网络设置选项缺失问题解决

一、问题现象 在Ubuntu桌面环境中,网络设置界面中仅显示VPN设置,未显示常规网络配置选项,导致无法通过图形界面修改网络配置。但通过命令行工具可正常设置网络。 二、解决方案 (一)检查网络设备状态 nmcli d 发现…...

GitHub绑定本地计算机以及仓库创建跟推送指南

GitHub绑定到本地计算机 要在本地计算机上连接到你的GitHub账户,可以通过以下步骤实现: 1. 检查和安装Git 确保你的计算机上已经安装了Git。如果还没有安装,可以从Git官网下载并安装。 2. 配置Git 打开终端(macOS或Linux&…...

【数据结构】导航

【数据结构】-CSDN博客 【数据结构】next数组、nextval数组-CSDN博客...

Java内存中的Heap(堆)的作用

Java内存中的Heap(堆)的作用 在 Java 的内存模型中,Heap(堆) 是 JVM(Java Virtual Machine)管理的运行时数据区域之一,主要用于存储程序运行过程中动态分配的对象和数据。它是 Java…...

Python控制结构详解

前言 一、控制结构概述 二、顺序结构 三、选择结构(分支结构) 1. 单分支 if 2. 双分支 if-else 3. 多分支 if-elif-else 4.实际应用: 四、循环结构 1. for循环 2. while循环 3. 循环控制语句 五、异常处理(try-except&#xff09…...

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢,结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但,又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 一、子2023-&#xff…...

JVM介绍

JVM类加载器 栈指令重排序 类的JVM内存分配 堆内存GC模型...

HTML输出流

HTML 输出流 JavaScript 中**「直接写入 HTML 输出流」**的核心是通过 document.write() 方法向浏览器渲染过程中的数据流动态插入内容。以下是详细解释&#xff1a; 一、HTML 输出流的概念 1. 动态渲染过程 HTML 文档的加载是自上而下逐行解析的。当浏览器遇到 <script&…...

Kafka 的高可用性

Kafka 的高可用性主要通过副本机制、ISR&#xff08;In-Sync Replicas&#xff09;列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行&#xff0c;数据不会丢失&#xff0c;并且服务不会中断。 1. 副本机制 Kafka 的副本机制是其高…...

Centos7,tar包方式部署rabbitmq-3.7.6

1. 环境准备 安装编译工具和依赖包 yum -y install make gcc gcc-c glibc-devel m4 perl openssl openssl-devel ncurses-devel ncurses-devel xz xmlto perl 2. Erlang环境搭建 版本对应&#xff1a;https://www.rabbitmq.com/docs/which-erlang 解压到指定目录 tar -xv…...

RISC-V AIA学习3---APLIC 第二部分(APLIC 中断域的内存映射控制区域)

每个中断域都有一个专用的内存映射控制区域&#xff0c;用来处理该中断域的中断。 控制区域的大小是 4KB 的倍数&#xff0c;对齐到 4KB 边界。最小的有效控制区域是 16KB。 1. 控制区域的基本结构&#xff1a;部门文件柜 每个中断域就像公司的一个部门&#xff0c;有自己的 …...

顶刊【遥感目标检测】【TGRS】FFCA-YOLO遥感图像小目标检测

FFCA-YOLO for Small Object Detection in Remote Sensing Images FFCA-YOLO遥感图像小目标检测 0.论文摘要 摘要——特征表征不足、背景干扰等问题使得遥感图像中的小目标检测任务极具挑战性。尤其在算法需部署于星载设备进行实时处理时&#xff0c;需在有限计算资源下对精度…...

【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...

【PCB工艺】时序图(Timing Diagram)

时序图&#xff08;Timing Diagram&#xff09;是描述数字电路信号随时间变化的图示&#xff0c;广泛用于分析和设计时序逻辑电路&#xff0c;如锁存器&#xff08;Latch&#xff09;、触发器&#xff08;Flip-Flop&#xff09;、计数器、状态机等。这篇文章从时序图的原理、构…...

MATLAB 中,并行池(Parallel Pool)自动关闭的情况

在 MATLAB 中&#xff0c;并行池&#xff08;Parallel Pool&#xff09;的行为可以通过设置进行控制&#xff0c;但默认情况下&#xff0c;并行池不会自动关闭&#xff0c;除非满足某些条件或显式调用关闭命令。以下是关于并行池自动关闭机制的详细说明&#xff1a; 自动关闭的…...

[网安工具] SQL 注入自动探测工具 —— SQLMAP 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网安工具库 —— 工具管理手册 https://github.com/sqlmapproject/sqlmaphttps://github.com/sqlmapproject/sqlmap用法 | sqlmap 用户手册https://sqlmap.highlight.ink/usage 0x01&#xff1a;S…...

Python数据结构与算法-基础预热篇

目录 语言基础 1.内置函数 1.1math库 1.2collections 1.2.1Counter&#xff1a;计数器 1.2.2deque双端对列 1.2.3defaultdict有默认值的字典 1.3heapq堆&#xff08;完全二叉树&#xff09; 1.4functool 1.5itertools 1.5.1无限迭代器 1.5.2有限迭代器 1.5.3排列组合迭代器 2.序…...

构建可扩展、可靠的网络抓取、监控和自动化应用程序的终极指南

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 无论您是企业主、营销人员还是软件开发人员&#xff0c;您都很有可能在某个时候使用过 Web 自动化工具。每个人都希望更聪明地工作&#xf…...