Java从入门到放弃07---构造方法/static关键字/帮助文档/Math类的随机数功能/Java实现猜数字游戏

Java从入门到放弃07—构造方法/static关键字/帮助文档/Math类的随机数功能/Java实现猜数字游戏

01 构造方法

  • 构造方法:在创建对象时,除了使用关键字new外,还需借助构造方法,来完成对类的实例化。

  • 借助空参的构造方法或借助于有参数的构造方法创建对象

  • 有参的构造方法,在创建对象的时候能够将参数传递给私有化的成员变量,也可以写其他业务逻辑,并不局限与给成员变量赋值的功能。

  • 空参构造方法,在创建对象时不会进行参数传递,如果想对私有化的成员变量赋值,需要借助set/get方法

  • 构造方法的注意事项:在自定义的类中, 默认存在一个空参构造,但是可以通过手动写出一个有参构造方法,此时默认的空参构造消失。如果在测试类中继续使用空参构造方法创建对象会报错。

  • 构造方法的一键生成:alt+insert >>constructor>>select none 生成空参构造

    ctrol+选择参数,生成有参构造。


程序示例:

public class MyTest {
    public static void main(String[] args) {
        //使用空参构造来创建对象,如果想对私有化的成员变量赋值,需要借助set/get方法
        Teacher teacher = new Teacher();
        teacher.setName("John");
        teacher.setAge(28);
        System.out.println(teacher.getName());
        System.out.println(teacher.getAge());
        System.out.println("------------------------------");
        //使用有参构造来创建对象,在创建对象的时候能够将参数传递给私有化的成员变量
        Teacher teacher1 = new Teacher("Lily", 35);
        System.out.println(teacher1.getName());
        System.out.println(teacher1.getAge());
    }
}
class Teacher {
    //私有化成员变量
    private String name;
    private int age;
    //提供无参数构造方法(方法名同类名)
    public Teacher() {//构造方法的一键生成:alt+insert >>constructor>>select none  生成空参构造
    }
    //提供有参数构造方法(方法名同类名)
    public Teacher(String name, int age) {//构造方法的一键生成:alt+insert >>constructor>>ctrol+选择参数,生成有参构造。
        this.name = name;
        this.age = age;
    }
    //提供公共的 get set 方法,快捷键alt+insert>>Getter and Setter
    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 teache() {
        System.out.println("教书");
    }
}
运行结果:
John
28
------------------------------
Lily
35

02 创建对象的具体步骤

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

03 static关键字

  • 功能:static 能够让数据变成共享变量

  • 静态区(可理解为共享区)的数据不会在堆内存中开辟空间,而是在方法区。优先于对象(在堆内存进行初始化)而存在。

  • 被static修饰的成员,随类的加载而加载,随类的修改而修改,随着类的消失而消失。

  • 被static修饰的变量属于类,不属于对象。因此在调用时,应采用 类名.变量名 这种方式进行调用。

  • 每new一个新对象,堆内存会为其开辟一块空间,并将类中的相关变量进行初始化。(赋值,或赋默认值)

  • static也可以修饰方法,当方法被static修饰时,推荐使用类名.方法名直接调用。

  • 被static修饰的方法只能访问被static修饰的变量,而不能访问非static修饰的变量(原因是:先存在的访问不到后存在的)

  • 被static修饰的方法属于类方法,能够通过类名.方法名直接调用。非静态方法需要先实例化(new一个对象),才能调用。

  • 被static修饰的方法不能使用this关键字(原因,this代表一个对象,对象在类方法加载之后才在堆内存中new)

  • 成员变量和静态变量的区别

    成员变量存在于堆内存,静态变量存在于方法区中的静态区或共享区
    成员变量随对象的创建而产生,随对象的回收而销毁;静态变量随类的加载而加载,随类的消失而消失
    成员变量(也叫实例变量,对象变量)属于对象;静态变量属于类
    成员变量只能通过对象名调用;静态变量可以通过类名调用,也可以通过对象调用。
    

程序示例1:静态变量随类的加载而加载,随类的修改而全部修改,随类的小时而消失

public class MyTest {
    public static void main(String[] args) {
        Person person = new Person();
        person.name="张三";
        person.country="美国";//静态变量储存在方法区,随着类的修改而全部修改
        Person person2 = new Person();
        person2.name = "李四";
        person2.country = "新加坡";//静态变量储存在方法区,随着类的修改而全部修改
        Person person3 = new Person();
        person3.name = "王五";
        person3.country = "英国";//静态变量储存在方法区,随着类的修改而全部修改
        System.out.println(person.name+"----"+person.country);
        System.out.println("---------------");
        System.out.println(person2.name + "----" + person2.country);
        System.out.println("---------------");
        System.out.println(person3.name + "----" + person3.country);
    }
}
class Person {
    public String name;
    public static String country = "中国";//country为静态变量
}
运行结果:
张三----英国
---------------
李四----英国
---------------
王五----英国

程序示例2:

public class MyTest {
    public static void main(String[] args) {
        //通过对象名.共享变量名 这种方式,可以去访问静态变量,但不推荐使用
        //A a = new A();
        //int b = a.b;
        //a.show();
        //被static 所修饰的我们推荐使用类名直接调用
        //因为静态变量,属于类,所以使用类名直接调用即可
          A.b=500;
          int b = A.b;
          System.out.println(b);
       	  A.show();//静态方法,推荐使用类名直接调用
    }
}
class A{
    double a=100;
    static int b=1000; //静态变量
    public static void show(){
        System.out.println("这是一个静态的show方法");
    }

}

程序示例3:在静态方法里面,只能访问静态变量,非静态变量访问不到。在非静态方法里面,既可以访问静态的,也可以访问非静态的。静态方法里面,不能存在this。this代表一个对象,对象是后来存在的,先存在的,不能访问后存在的。总结:先存在的不能访问后存在的,后存在的可以访问之前就存在的。

public class MyTest {
    public static void main(String[] args) {
        B b = new B();
        b.show();
        b.staticShow();
    }
}


class B{
    int a=10;
    static double num=100;
    public void show(){//非静态方法既可以访问静态变量也可以访问非静态变量
        System.out.println(a);
        System.out.println(num);
    }
    public static void staticShow(){ //静态方法只能访问静态变量
        //System.out.println(a);程序报错:java: 无法从静态上下文中引用非静态 变量 a
        System.out.println(num);
    }
    public void test() { //非静态方法既可以访问静态方法也可以访问非静态方法
        this.show();
        staticShow();
    } 
    public static void test2() {//静态方法只能访问静态方法
        //this.show 程序报错:java: 无法从静态上下文中引用非静态 变量 this
        staticShow();
    }
    public static void test3() {//静态方法里面,不能存在this。this代表一个对象,对象还是后来有的,先有的,不能访问后来有的
        // int a=this.a;程序报错:java: 无法从静态上下文中引用非静态 变量 this
    }
}

04 如何使用帮助文档

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

05 Math类的随机数功能

  • Math类概述:该类包含用于执行基本数学运算的方法

  • Math类特点:由于Math类在java.lang包下,所以不需要导包。
    没有构造方法,因为它的成员全部是静态的。

  • 获取随机数的方法

    public static double random():返回带正号的double值,该值大于等于0.0 且小于1.0。
    int number = (int)(Math.random()*100)+1;//获取一个1-100之间的随机整数
    

程序示例:猜数字游戏,用户只有十次机会。

import java.util.Scanner;
public class GuseeNumber {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("please guess a number 1----100");
        int num=(int)(Math.random()*100+1);//随机生成一个1--100之间的整数
        int i=10;//限制用户猜数字的次数
        while (i>0){//用户还有机会的时候进入该循环
            int userNum=scanner.nextInt();//用户输入数字
            if (userNum>num){
                System.out.println("猜大了");
                i--;//猜错一次,机会减少一次
                if (i>0) {//当还有机会的时候,显示剩余机会的次数
                    System.out.println("您还有"+i+"次机会");
                } else if(i==0){
                    System.out.println("游戏结束");
                }
            }else if(userNum<num){
                System.out.println("猜小了");
                i--;
                if (i>0) {
                    System.out.println("您还有"+i+"次机会");
                } else if(i==0){
                    System.out.println("游戏结束");
                }
            }else if(userNum==num){
                System.out.println("猜对了");
                System.out.println("游戏结束");
                break;//猜对时跳出循环
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yinyanyao1747/article/details/89206082