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;//猜对时跳出循环
}
}
}
}