1.面向对象
1.1封装
1.java三大属性:封装、多态、继承
2.封装:就是对象代表什么,就得封装相对应的数据,并且提供数据对应的行为。
3.private关键字是个权限修饰符。被private修饰的成员变量只能在本类中访问,如果需要被其他类访问,必须要提供get,set方法进行调用,也可以在get方法中进行持续的过滤。
//主函数中代码块去调用 BoyFriend by1=new BoyFriend(); //在代码块中创建一个对象 by1.setAge(19); by1.setName("猪猪侠"); System.out.println(by1.getName()); System.out.println(by1.getAge());
//boyfriend类 package org.example; public class BoyFriend { private String name; private int age; public void setName(String n){ name=n; } public String getName(){ return name; } //getset方法对值进行过滤 public void setAge(int a){ if (a >= 18 && a <= 50) { age=a; }else{ System.out.println("非法数据"); } } public int getAge(){ return age; } }
1.2构造方法
1.作用:创建对象时,虚拟机会自动调用构造方法,为了给成员变量初始化。
2.类别:有参构造(可同时为变量赋值)与无参构造(虚拟机会自动给出初始化的值)
3.tips:①、任何类的定义默认带无参构造器的。如果先定义了有参数构造器,无参构造器就不会自动生成。②、无参、有参构造方法在实际开发过程中最好两者均写入
public Student(String name,int age){ this.name=name; this.age=age; }//有参构造相当与set方法public Student(){ System.out.println("看看我是否被执行!"); }//无参构造方法
4.标准的JavaBean
1.3面向对象内存图
①class字节码文件加载至方法区(main方法同时也被临时存储至方法区,同时压入栈中)。
②将方法临时加载到方法区中。
③BoyFriend by1=new BoyFriend(); (对左边的变量声明空间<栈>中,右边的变量加载空间<堆>中,右边的空间地址会将成员变量以及成员方法地址加载至堆中,并进行显式初始化与隐式初始化,以及构造方法初始化,最后将右边的空间地址赋值给与左边的变量)
基本数据类型:实际变量的地址存储的是真实的数据
引用数据类型:实际存储的是 真实数据的地址值(变量存在在栈中,数据存储在堆中)
1.4this关键字
this关键字遵循就近原则,调用就近原则的成员变量。
本质是区分局部变量与成员变量。
this代表的是被调用者的地址值
2.小练习(双色球系统)
import java.util.Random;
import java.util.Scanner;
public class Main {
//生成中将号码的代码
public static int[] Reward() {
Random sc = new Random();
// int[] arr ={21,2,4,7,24,16,1}; //测试数组
int[] arr=new int[7];
for (int i = 0; i < 6; i++) {
int index = sc.nextInt(33);
arr[i] = index;
}//生成随机红球的号码
for (int i = 0; i < 1; i++) {
int index = sc.nextInt(16);
arr[i + 6] = index;
} //生成蓝球的号码
System.out.print("\n本期中奖号码为:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
return arr;
}
//中奖规则
public static int Guize(int arr[], int arr1[]) {
int RedCount = 0;
int BuleCount = 0;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr1.length - 1; j++) {
if (arr[i] == arr1[j]) {
RedCount++;
}
}
}
if (arr1[6] == arr[6]) {
BuleCount++;
}
if ((RedCount == 1 && BuleCount == 1) || (RedCount == 0 && BuleCount == 1) || (RedCount == 2 && BuleCount == 1)) {
return 6;
} else if ((RedCount == 3 && BuleCount == 1) || (RedCount == 4 && BuleCount == 0)) {
return 5;
} else if ((RedCount == 4 && BuleCount == 1) || (RedCount == 5 && BuleCount == 0)) {
return 4;
} else if ((RedCount == 5 && BuleCount == 1)) {
return 3;
} else if ((RedCount == 6 && BuleCount == 0)) {
return 2;
}else if((RedCount == 6 && BuleCount == 0)){
return 1;
}
return 0;//根据中奖规则返回中奖等级
}
public static void main(String[] args) {
System.out.print("请输入红球的号码:");
int arr1[] = new int[7]; //arr1用于存放用户输入的数字
for (int i = 0; i < 6; ) {
Scanner sc = new Scanner(System.in);
arr1[i] = sc.nextInt();
if (arr1[i] >= 1 && arr1[i] <= 33) {
i++;
} else {
System.out.print("数据输入非法!请重新输入!");
}
}
System.out.print("请输入蓝球的号码:");
while (true){
Scanner sc = new Scanner(System.in);
int index = sc.nextInt();
if (index >= 1 && index <= 16) {
arr1[6] = index;
break;
}else{
System.out.println("数据输入非法!请重新输入");
}
}
System.out.print("=========================\n");
System.out.print("您输入的号码为:");
for (int i = 0; i < arr1.length; i++) {
System.out.print( arr1[i]+" ");
}
int num=Guize(Reward(), arr1);
switch (num){
case 1:
System.out.println("恭喜你,中了一等奖!获得1000w元");
break;
case 2:
System.out.println("恭喜你,中了二等奖!获得500w元");
break;
case 3:
System.out.println("恭喜你,中了三等奖!获得3000元");
break;
case 4:
System.out.println("恭喜你,中了四等奖!获得200元");
break;
case 5:
System.out.println("恭喜你,中了五等奖!获得10元");
break;
case 6:
System.out.println("恭喜你,中了六等奖!获得5元");
break;
default:
System.out.print("\n=========================\n");
System.out.println("很遗憾,没有中奖!(´。_。`)");
}
}
}
暴力解(有规则的限制)
-------
原来彩票的中奖概率那么的低啊,以后不买彩票了。我自己框框做个假数据中一等奖,哈哈哈哈哈。
①在判断篮球号码时候的条件限制用while循环很巧妙,但是忘记了写break。导致代码报错。
②写的速度有些慢,希望可以快一点。小菜菜一定可以学会的