面向对象(二):构造方法及其重载;创建对象具体过程(内存图);static关键字;JDK帮助文档的使用;用随机数方法设计猜数字小游戏

面向对象(二)

一、构造方法及其重载

1、构造方法概述及格式

概述和作用:创建对象,给对象中的成员进行初始化
  格式特点:a:方法名与类名相同
	 	  b:没有返回值类型(void都没有)
	 	  c:没有具体返回值

2、构造方法的重载及注意事项

概述:即参数列表不同的构造方法
构造方法注意事项
	a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
	b:如果我们给出了有参构造方法,系统将不再提供默认的无参构造方法,这时如果我们还想使用无参的构造方法,必须自己给出(建议每次自己给出无参构造方法)。
示例:
class Dog{
    //定义成员变量
    String name;
    double age;
    //定义无参的构造方法
    Dog(){
        System.out.println("无参的构造方法执行了...");
    }
    //定义有参的构造方法
    Dog(String name,double age){
        System.out.println("有参的构造方法执行了...");
        this.name=name; //设置成员变量name的值
        this.age=age;   //设置成员变量age的值
    }
    //定义打印狗信息的方法
    public void show(){
        System.out.println("狗的名字:"+name+"\n年龄:"+age);
    }
}
public class Demo {
    public static void main(String[] args) {
        Dog dog = new Dog();//通过无参构造方法创建对象,并调用无参构造方法
        dog.show();     //dog调用show()方法,无参构造方法没有给name和age设置值,所以打印默认值
        System.out.println("----------------------------");     //分割线,无特殊意义
        Dog dog1= new Dog("旺财", 1.5);//通过有参构造方法创建对象,并调用有参构造方法
        dog1.show();    //dog1调用show()方法
    }
}
运行结果:
无参的构造方法执行了...
狗的名字:null
年龄:0.0
----------------------------
有参的构造方法执行了...
狗的名字:旺财
年龄:1.5

Process finished with exit code 0

二、创建一个对象的步骤:

Student s = new Student();
步骤:
	(1):加载Student.class文件进内存
	(2):在栈内存为s开辟空间
	(3):在堆内存为学生对象开辟空间
	(4):对学生对象的成员变量进行默认初始化
	(5):对学生对象的成员变量进行显示初始化
	(6):通过构造方法对学生对象的成员变量赋值
	(7):学生对象初始化完毕,把对象地址赋值给s变量
内存图:

在这里插入图片描述

三、static关键字

1、static关键字概述

A:static 状态修饰符,静态的 ,可以修饰成员变量,可以修饰成员方法,
B:修饰的成员变量变成了共享变量,该类的对象可以去操作这个共享变量
C:被static修饰的变量存在方法区的静态区,被这个类的所有对象,所共享
D:被静态所修饰的成员,是随着类的加载(.class 一加载进内存,静态的数据就会加载)而加载

2、static关键字内存图解

在这里插入图片描述

3、static关键字特点:

static关键字的特点
	a:随着类的加载而加载
	b:优先于对象存在
	c:被类的所有对象共享
	d:可以通过类名调用,也可以使用对象名调用(推荐使用类名调用)
4、举例:
class Teacher {
    String name;
    static int num=100;
    //非静态方法里面既可以访问静态变量,也可以访问非静态变量
    public void test(){
        System.out.println("这是一个测试方法"+name+"==="+num);
    }
    //在静态方法里面,不能访问非静态成员,只能访问静态成员
    //原因是:被静态所修饰的成员,是随着类的加载而加载,出现的时机比较早,而非静态成员,是随着对象的创建而产生
    //静态的只能访问静态的
    public static void show(){
       // System.out.println("这是一个静态的方法"+name+"===="+num);//name访问不到
        System.out.println("这是一个静态的方法" + num); //只能访问到静态变量
    }
    //静态方法里面只能调用静态方法
    public static void show2() {
        System.out.println("这是一个静态2的方法" + num);
       // test(); 调用不到
        show();
    }
    //非静态方法里面既可以调用静态方法,也可调用非静态方法
    public void test2() {
        System.out.println("这是一个测试2方法" + name + "===" + num);
        this.test();
        this.show();
        Teacher.show();
    }
    //静态方法里面不能出现this关键字
    public static void show3() {
        System.out.println("这是一个静态3的方法" + num);
        //this 他代表本类的一个引用,或者说对象,对象是后来才有的,先有的不能访问后有的
       // System.out.println(this); //错误
    }
}
public class MyTest {
    public static void main(String[] args) {
        //被静态所修饰的成员,推荐使用类名直接访问
        Teacher.num=500;
        System.out.println(Teacher.num);    //500
        Teacher teacher = new Teacher();    
        System.out.println(teacher.num);    //500
        teacher.num=1000;
        Teacher teacher2 = new Teacher();
        System.out.println(teacher2.num);   //1000
        teacher.show();
        teacher2.show();
        Teacher.show(); //静态方法类名直接调用即可
    }
}
运行结果:
500
500
1000
这是一个静态的方法1000
这是一个静态的方法1000
这是一个静态的方法1000

Process finished with exit code 0

5、static关键字注意事项:

static的注意事项
	a:在静态方法中是没有this关键字的
	因为静态变量是随着类的加载而加载,this是随着对象的创建而存在,静态比对象先存在。
	b:静态方法只能访问静态的成员变量和静态的成员方法
	简单记:静态只能访问静态,非静态可以访问静态的也可以访问非静态的

6、静态变量和成员变量的区别

A:所属不同
	静态变量属于类,所以也称为类变量
	成员变量属于对象,所以也称为实例变量(对象变量)
B:内存中位置不同
	静态变量存储于方法区的静态区
	成员变量存储于堆内存
C:内存出现时间不同
	静态变量随着类的加载而加载,随着类的消失而消失
	成员变量随着对象的创建而存在,随着对象的消失而消失
D:调用不同
	静态变量可以通过类名调用,也可以通过对象调用
	成员变量只能通过对象名调用

四、JDK帮助文档的使用

1、使用方法

A:找到文档,打开文档
B:点击显示,找到索引,出现输入框
C:你应该知道你找谁?举例:Scanner
D:看这个类的结构(需不需要导包)
	java.lang包下的内容不需要我们手动导入
	其它包下的内容需要我们手动导入
	类		    			API文档
		成员变量				字段摘要
		构造方法				构造方法摘要
		成员方法				方法摘要
E:看这个类的说明(简单的了解一下)
F:看开始版本
G:看构造方法
H:看成员方法
	看左边:
		是否是static的,如果是我们就不需要创建对象,直接可以使用类名调用该方法;看返回值,返回值是什么我就使用什么接收
	看右边:
		看参数列表: 参数的个数 , 参数的类型 ; 要什么参数我是用的时候,就传递什么参数					
I:然后使用

2、学习Math类的随机数功能

A:Math类概述
	类包含用于执行基本数学运算的方法
B:Math类特点
	由于Math类在java.lang包下,所以不需要导包。
	没有构造方法,因为它的成员全部是静态的。
C:获取随机数的方法
	public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
D:我要获取一个1-100之间的随机数,怎么办?
	int number = (int)(Math.random()*100)+1;

3、应用随机数功能设计猜数字小游戏

需求:猜数字小游戏(数据在1-100之间)
import java.util.Scanner;
public class GuessNumberGame {
    public static void main(String[] args) {
        int frequency=6;    //定义游戏次数
        int num = (int) (Math.random() * 100 + 1);  //调用随机数方法,获取一个[1,100]随机整数
        Scanner scanner = new Scanner(System.in);   //创建Scnner的对象
        System.out.println("游戏开始,你一共有"+frequency+"次机会\n请在1---100之间(包括1和100)猜一个数:");
        int x=-1;   
        for (int i = 1; i <=frequency; i++) {
            int n = scanner.nextInt();  //调用方法,获取键盘录入数字
            //判断猜的数字与随机数的关系,并提示玩家
            if (n > num) {
                System.out.println("猜大了");
            } else if (n < num) {
                System.out.println("猜小了");
            } else {
                System.out.println("恭喜你猜对了!");
                x=1;
                break;
            }
            //提示玩家剩余游戏次数
            if (i < frequency) {
                System.out.println("你还有" + (frequency - i) + "次机会!\n请再猜一个数:");
            }
        }
        //游戏次数用完且没有猜对,则会执行下面打印语句
        if(x!=1){
            System.out.println("Game Over");
        }
    }
}
运行结果示例:
游戏开始,你一共有6次机会
请在1---100之间(包括1100)猜一个数:
50
猜小了
你还有5次机会!
请再猜一个数:
75
猜大了
你还有4次机会!
请再猜一个数:
63
猜大了
你还有3次机会!
请再猜一个数:
55
猜小了
你还有2次机会!
请再猜一个数:
58
猜大了
你还有1次机会!
请再猜一个数:
56
猜小了
Game Over

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值