JavaSE笔记09 构造方法+对象的创建+面向对象练习题
文章目录
一.构造方法:
1.构造方法的概述:
在Java中,我们知道面向对象有三大特征:封装、继承与多态。 我们也了解到类是一个抽象的概念,我们不能进行直接地使用,所以要使用一个类中的属性与功能,必须对类进行实例化
所谓的实例化,我们可以理解为创建该类的对象。在创建对象时,除了要用关键字外,我们还需要借助构造方法,来完成对类的实例化
2.利用无参构造完成类的实例化:
构造方法的定义:
在类中,方法名与类名相同,没有返回值类型,甚至连void都没有
注意:
我们自定义一个类时,类中就会默认存在一个空参的构造方法。当我们只是用无参构造去完成类的实例化时,此空参构造方法可写可不写,但是当出现有参构造时,默认的无参构造如果没有定义就将消失
代码演示:
public class MyTest {
public static void main(String[] args) {
//无参构造完成对类的实例化
Star star = new Star();
star.setName("刘德华");
star.setAge(35);
System.out.println(star.getName());
System.out.println(star.getAge());
}
}
class Star{
//私有化成员变量
private String name;
private int age;
public Star(){ }
//提供get set方法可以对成员变量进行赋值与显示的操作
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;
}
}
运行截图:
注意在idea中选择:右键->Generate->Getter and setter->选择要生成的get和set方法的变量,选择之后就可以直接生成相对应变量的get和set方法
3.构造方法的重载以及注意事项:
**构造方法是可以进行方法重载的:**所谓的方法重载就是在一个类中,允许一个以上的同名方法,方法名相同,参数列表不同(参数的类型不同,参数的个数不同),不以返回值类型作区别
通过有参构造进行对类的实例化,通常比起无参构造对类的实例化比较简单
代码演示:
public class MyTest1 {
public static void main(String[] args) {
//使用有参构造来实现对类的实例化
Star2 star = new Star2("刘亦菲", 30);
System.out.println(star.getAge());
System.out.println(star.getName());
}
}
class Star2{
//私有化成员变量
private String name;
private int age;
//提供有有参构造方法
public Star2(String name,int age){
this.name=name;
this.age=age;
}
//提供get方法即可
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
运行截图:
4.有参构造和无参构造对类的实例化:
由上面可见,一个标准的类由成员变量,成员方法以及构造方法构成。下面给出一个标准类的写法:会提供成员变量,成员方法以及构造方法
代码演示:
public class MyTest2 {
public static void main(String[] args) {
//使用无参构造来完成对类的实例化
StarPlus s1 = new StarPlus();
s1.setName("Taylor Swift");
s1.setAge(31);
System.out.println(s1.getName());
System.out.println(s1.getAge());
System.out.println("=====================");
//使用有参构造来完成对类的实例化
StarPlus s2 = new StarPlus("郭老师", 27);
System.out.println(s2.getName());
System.out.println(s2.getAge());
}
}
class StarPlus{
//1.私有化成员变量
private String name;
private int age;
//2.提供无参构造方法
public StarPlus(){}
//3.提供有参构造方法
public StarPlus(String name,int age){
this.name=name;
this.age=age;
}
//4.提供get set方法
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;
}
}
运行截图:
二.对象的创建:
对于下列代码的内存演示,即对于Student类的相关内存图演示:Student s = new Student();
步骤:
- (1):加载Student.class文件进内存
- (2):在栈内存为s开辟空间
- (3):在堆内存为学生对象开辟空间
- (4):对学生对象的成员变量进行默认初始化
- (5):对学生对象的成员变量进行显示初始化
- (6):通过构造方法对学生对象的成员变量赋值
- (7):学生对象初始化完毕,把对象地址赋值给s变量
三.面向对象练习题:
题设:
定义一个矩形(Rectangle)类,定义求周长和面积的方法,然后定义一个测试类Test,进行测试
解题思路:
定义类使用无参和有参两种构造,对于无参构造,使用set和get对于私有成员变量进心访问,对于有参构造,分为两种情况,一种是对于含两个参数的构造,即矩形为长方形时的长和宽,另一种则是对于含一个参数的构造,即是对于正方形边长,所以在定义类的构造方法中应同时有三种,并且在测试类中将三种情况分别进行测试
代码演示:
import java.util.Scanner;
class Rectangle{
private double width;
private double height;
private double line;
public Rectangle(){} //空参构造
public Rectangle(double width,double height){
this.width=width;
this.height=height;
} //含长,高两个参构造
public Rectangle(double line){
this.line=line;
} //含一个边长的正方形构造
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getSquare(){
return this.width*this.height;
}
public double getPrimeter(){
return (this.height+this.width)*2;
}
public double getS(double line){
return line*line;
}
public double getP(double line){
return line*4;
}
}
public class RctangleTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入矩形的长和高:");
double wid = input.nextDouble();
double hei = input.nextDouble();
//第一种,使用空参进行构造
Rectangle rectangle = new Rectangle();
rectangle.setWidth(wid);
rectangle.setHeight(hei);
double s = rectangle.getSquare();
double p = rectangle.getPrimeter();
System.out.println("矩形面积为"+s);
System.out.println("矩形周长为"+p);
System.out.println("-------------------------------");
//第二种,使用含参构造:
Rectangle rectangle1 = new Rectangle(wid,hei);
double s1 = rectangle1.getSquare();
double p1 = rectangle1.getPrimeter();
System.out.println("矩形面积为"+s1);
System.out.println("矩形周长为:"+p1);
System.out.println("-------------------------------");
//第三种,传一个参说明矩形是正方形:
System.out.println("请输入正方形的边长:");
double a = input.nextDouble();
Rectangle rectangle2 = new Rectangle(a);
System.out.println("正方形的面积为:"+rectangle2.getS(a));
System.out.println("正方形的周长为:"+rectangle2.getP(a));
}
}
运行截图: