【JavaSE】面向对象——构造器

145 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情


构造器

学习面向对象的三条主线

  1. Java类及类的成员:属性,方法,构造器; 代码块、内部类
  2. 面向对象的三大特征:封装、继承、多态,(抽象性)
  3. 其他关键字:this,super,static,final,abstract,interface,package...

任何一个类都有构造器


构造器的作用:

  1. 创建对象

比如我们创建一个Person类,在主方法里我们要创建这个类的对象,比如Person p = new Perosn();

其实"="号右边的Person()就是一个构造器。 所以说我们创建类的对象格式其实是:new + 构造器

  1. 初始化对象的信息 👇举例
public class PersonTest {
	public static void main(String[] args) {
		//创建类的对象:new + 构造器
		Person p = new Person("Tom");
		System.out.println(p.name);
	}	
}

class Person{
	//属性
	String name;
	int age;
	
	//构造器
	public Person(String a) {
		name = a;
	}
	
	//方法
	public void eat() {
		System.out.println("吃饭");
	}
}

在Person类中创建了这个类的构造器,那么在主方法里我们创建对象的时候可以直接给属性进行初始化操作。比如这里我就直接让类中的name在创建对象的时候就初始化了,不必再通过先创建对象再用“对象.属性”进行赋值。

关于构造器的格式看下面的说明部分


说明

  1. 如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器。
  2. 定义构造器的格式:权限修饰符 类名(形参列表){} 👇下面是构造器的举例:
class Person{
	//属性
	String name;
	int age;
	
	//构造器
	public Person() {
		System.out.println("Person()...");
	}
	
	//方法
	public void eat() {
		System.out.println("吃饭");
	}
}

在Person类中创建了一个它的构造器,一定要与类同名,然后在主方法里,我们创建Person类的对象的时候,就会调用构造器。

public class PersonTest {
	public static void main(String[] args) {
		//创建类的对象:new + 构造器
		Person p = new Person();
		p.eat();
	}	
}

运行结果如下:

image.png

  1. 同一个类中可以定义多个构造器,只要形参列表不同就行,有点类似方法重载。我们这里就叫构造器重载。
  2. 一旦定义了类的构造器,系统不再提供默认空参构造器。也就是说以前我们没有在类里面写构造器,但是我们依然可以创建这个类的对象,其实这是系统提供的默认空参构造器。
  3. 一个类中至少会有一个构造器。

练习

  1. 定义一个Person类,并在其中添加构造器,利用构造器设置所有人的age属性初始值为18。
public class PersonTest {
	public static void main(String[] args) {
		Person b = new Person();		
		System.out.println("年龄为:" + b.getAge());
	}
}

class Person {
	private int age;
	
	public Person() {
		age = 18;
	}
	
	public int getAge() {
		return age;
	}
}
  1. 修改上题中类和构造器,增加name属性,使得每次创建Person对象的同时初始化对象的age属性值和name属性值。
public class PersonTest {
	public static void main(String[] args) {
		Person b = new Person("Tom",18);		
		System.out.println("姓名为:" + b.getName() + ",年龄为:" + b.getAge());
	}
}

class Person {
	private int age;
	private String name;
	
	public Person(String n, int a) {
		name = n;
		age = a;
	}
	
	public int getAge() {
		return age;
	}
	
	public String getName() {
		return name;
	}
}
  1. 编写两个类,TriAngle和TriAngleTest,其中TriAngle类中声明私有的底边长base和高height,同时声明公共方法访问私有变量。此外,提供类必要的构造器。另一个类使用这些公共方法,计算三角形的面积。

👇TriAngle类

public class TriAngle {
	private double base;
	private double height;
	
	public TriAngle() {
		
	}
	
	public TriAngle(double b,double h) {
		base = b;
		height = h;
	}
	
	public void setBase(double b) {
		base = b;
	}
	
	public double getBase() {
		return base;
	}
	
	public void setHeight(double h) {
		height = h;
	}
	
	public double getHeight() {
		return height;
	}
}

👇TriAngleTest类

public class TriAngleTest {
	public static void main(String[] args) {
		TriAngle t1 = new TriAngle();
		t1.setBase(2.1);
		t1.setHeight(3.2);
		System.out.println("base :" + t1.getBase() + ",height :" + t1.getHeight());
		
		TriAngle t2 = new TriAngle(6.6,8.8);
		System.out.println("base :" + t2.getBase() + ",height :" + t2.getHeight());
	}
}

属性赋值总结

可以赋值的位置:

  1. 默认初始化值
  2. 显式初始化(定义时初始化)
  3. 构造器中赋值
  4. 通过“对象.方法”或“对象.属性”的方式赋值

以上赋值的先后顺序: 1 -> 2 -> 3 -> 4


JavaBean

属于扩展类知识

🎈概念

JavaBean是一种Java语言写成的可重用组件。

✨所谓JavaBean,是指符合如下标准的Java类

  1. 类是公共的
  2. 有一个无参的公共的构造器
  3. 有属性,且有对于的get、set方法

用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。