为了完成本次学习,我们需要掌握:
类的构造方法;
对象的创建与使用。
构造方法
实战1.求椭圆面积:
已知椭圆的短半轴长为 15.50,长半轴的长为 20.00,计算椭圆面积。椭圆的面积公式为S=πab,其中a、b分别为椭圆的短半轴长和长半轴长。
/**
* 任务:已知椭圆的短半轴长为20.00,长半轴的长为15.50,计算椭圆面积。
* 类名为:EllipseArea
*/
// 创建一个名为 EllipseArea 的公开类
public class EllipseArea{
// 定义椭圆的两个属性 :短半轴长和长半轴长
double a;
double b;
// 定义一个显示有参构造方法,携带两个参数,分别表示为传来的短半轴的值和长半轴传来的值
// 该方法实现将短半轴长和长半轴长分别初始化为携带的两个参数的值。
public EllipseArea(double a,double b)
{
this.a = a;
this.b = b;
}
// 定义一个方法,该方法实现计算椭圆的面积,并将其返回,返回值类型为double
public double area()
{
double pi = 3.1415926;
double s= pi*a*b;
return s;
}
// 定义主方法
public static void main(String[] args)
{
// 在主方法中通过有参构造方法实例化一个对象,将椭圆的短半轴的值和长半轴的值传入其中
EllipseArea ellipseArea = new EllipseArea(15.50,20.00);
// 调用计算椭圆的面积的方法,计算该椭圆的面积
double s = ellipseArea.area();
// 将计算后的结果四舍五入保留两位小数后输出,输出格式为:椭圆形的面积为xx
System.out.printf("椭圆形的面积为%.2f",s);
}
}
实战2.计算数学中的分数值:
跟据键盘输入的分子和分母求出该分数的值。其中第一次输入的值为分子的值,第二次输入的值为分母的值,两次的值均为 int 型。
/**
* 任务:跟据键盘输入的分子和分母求出该分数的值。其中第一次输入的值为分子的值,第二次输入的值为分母的值,两次的值均为 int 型。
* 类名为:Fraction
*/
import java.util.Scanner;
// 创建一个名为 Fraction 的公开类
public class Fraction {
// 定义分数的两个属性 :分子和分母
int a;
int b;
/**
* 定义一个方法,该方法实现计算该分数的值,携带两个参数,分别为传来的分子和分母的值
* 如果分母为0,不换行输出:分母不能为0
* 如果分母不为0,将该分数的值四舍五入保留两位小数后输出
* 输出格式为:该分数的值为xx
*/
public void calculate(int a,int b)
{
double c;
if(b==0)
{
System.out.print("分母不能为0");
}
else
{
c=1.0*a/b;
System.out.print("该分数的值为"+String.format("%.2f",c));
}
}
// 定义主方法
public static void main(String[] args)
{
// 获取键盘传来的分子和分母的值
Scanner sc = new Scanner(System.in);
int a,b;
a=sc.nextInt();
b=sc.nextInt();
// 在主方法中通过 Java 添加的无参构造方法定义一个对象
Fraction fraction = new Fraction();
// 调用计算分数值的方法,将获取到的分子和分母分别传入该方法中
fraction.calculate(a,b);
}
}
实战3.比较大小
比较键盘输入的两个 double 型的数值的大小,输出较大的值。
/**
* 任务:比较键盘输入的两个 double 型的数值的大小,输出较大的值。
* 类名为:Compare
*/
import java.util.Scanner;
// 创建一个名为 Compare 的公开类
public class Compare{
// 分别定义两个数
int a;
int b;
/**
* 定义一个方法,该方法实现比较两数大小,携带两个参数,分别为传来的两个数的值
* 将两个数中较大的那个数返回,返回类型为double
*/
public double comp(double a,double b)
{
if(a>b)return a;
else return b;
}
// 定义主方法
public static void main(String[] args)
{
// 获取键盘传来的两个数
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
// 在主方法中通过无参构造方法定义一个对象
Compare compare = new Compare();
// 调用比较大小的方法,获得较大的那个数
double max = compare.comp(a,b);
// 不换行输出较大的那个数
System.out.print(max);
}
}
在创建一个对象的时候,至少要调用一个构造方法。构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。必须满足以下的语法规则:
方法名与类名相同;
不要返回类型(例如return、void等);
不能被static、final、native、abstract和 synchronized 修饰,不能被子类继承。
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类自动添加一个默认构造方法(无参构造方法)。当我们手动的指定了构造方法时,系统将不会再添加无参的构造方法。
构造方法又分为无参构造方法和有参构造方法。无参构造方法如字面意思,它不需要传入参数。无参构造方法又分为隐式无参构造方法和显示无参构造方法。
隐式无参构造方法
在定义类的时候,如果没有给类定义一个构造方法,Java 编译器在编译时会默认提供一个隐式的构造方法,它没有任何参数,并且有一个空的方法体。
例子:
public class Person {
int age;
int weight;
double height;
// 隐式无参构造方法
public Person() {
}
}
显式无参构造方法
隐式无参构造方法是由系统提供的,无法修改其内容。但有时需要在调用这个构造方法时,初始化类成员属性或执行一些操作,要实现这个需求,就需要为它定义一个显式无参构造方法。
public class Person {
int age;
double weight;
double height;
// 显示无参构造方法,自己定义的,方法名必须和类名一致。
public Person() {
this.age = 18;
this.weight = 55.3;
this.height = 1.80;
}
}
显示有参构造方法
构造并初始化对象是构造方法的用处,所以有时需要给这个方法传入一些参数,定义一个显示的有参构造方法。例如:
public class Person {
int age;
double weight;
double height;
// 显示无参构造方法,自己定义的,方法名必须和类名一致。
public Person() {
this.age = 18; // 将实例变量age的值初始化为18
this.weight = 55.3; // 将实例变量weight的值初始化为55.3
this.height = 1.80; // 将实例变量height的值初始化为1.80
}
// 显示有参构造方法 自己定义的,方法名必须和类名一致,需要携带参数。
public Person(int age, double weight, double height) {
this.age = age; // 实例变量age的值初始化为传来的参数age的值
this.weight = weight; // 实例变量weight的值初始化为传来的参数weight的值
this.height = height; // 实例变量height的值初始化为传来的参数height的值
}
}
对象的创建与使用
类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型,所以对象的创建方式有如下两种:
声明并实例化对象;
类名称 对象名称 = new 类名称 () ;
先声明对象,然后实例化对象;
类名称 对象名称 = null ;
对象名称 = new 类名称 () ;
引用数据类型与基本数据类型最大的不同在于:引用数据类型需要进行内存的分配和使用。所以,关键字 new 的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字 new 来分配内存空间。
例子:
public class Person {
int age;
double weight;
double height;
public Person() {
this.age = 18; // 将实例变量age的值初始化为18
this.weight = 55.3; // 将实例变量weight的值初始化为55.3
this.height = 1.80; // 将实例变量height的值初始化为1.80
}
// 显示有参构造方法,自己定义的,方法名必须和类名一致,需要携带参数,携带多少参数可以自己控制。
public Person(int age, double weight, double height) {
this.age = age; // 实例变量age的值初始化为传来的参数age的值
this.weight = weight; // 实例变量weight的值初始化为传来的参数weight的值
this.height = height; // 实例变量height的值初始化为传来的参数height的值
}
public static void main(String[] args) {
Person person = new Person(); // 调用无参构造方法实例化(创建)一个person对象。
// 或者
Person person1 = new Person(18,52.8,69.72); // 调用有参构造方法实例化(创建)一个person1对象。
}
}
当一个实例化对象产生之后,可以按照如下的方式进行类的操作:
对象.属性:表示调用类之中的属性;
对象.方法():表示调用类之中的方法。
例子:
public class Person {
int age;
double weight;
double height;
public Person() {
this.age = 18;
this.weight = 55.3;
this.height = 1.80;
}
public Person(int age, double weight, double height) {
this.age = age;
this.weight = weight;
this.height = height;
}
public void play(char a){
System.out.printf("我喜欢玩%c\n",a);
}
public static void main(String[] args) {
Person person = new Person(); // 调用无参构造方法实例化(创建)一个person对象
int a = person.age; // 获取Person类中的属性age的值
System.out.println(a);
person.weight = 60.0; // 修改Person类中的属性weight
System.out.println(person.weight);
char b = '球';
person.play(b); // 调用Person类中的play方法,将参数传入该方法
Person person1 = new Person(20,52.8,69.72); // 调用有参构造方法实例化(创建)一个person1对象
System.out.println(person1.age);
System.out.print(person1.weight);
}
}
执行结果:
18
60.0
我喜欢玩球
20
52.8