面向对象最核心的套路是:设计对象来处理数据,解决问题!!!
静态
静态在面向对象编程中是很常见的关键字"static".,可以用来修饰成员变量,也可以修饰成员方法
1.1 static修饰成员变量
Java中的成员变量按照有无static修饰,分为两种:类变量、实例变量。
由于静态变量是属于类的,只需要通过类名就可以调用:类名.静态变量
实例变量是属于对象的,需要通过对象才能调用:对象.实例变量
类变量:属于类,在内存中只有一份,用类名调用
实例变量:属于对象,每一个对象都有一份,用对象调用
1.2 static修饰成员方法
成员方法根据有无static也分为两类:类方法、实例方法
有static修饰的方法,是属于类的,称为类方法;调用时直接用类名调用即可。
无static修饰的方法,是属于对象的,称为实例方法;调用时,需要使用对象调用。
public class Test {
public static void main(String[] args) {
//创建两个对象
//通过类名.访问成员变量,没有创建
System.out.println(Users.count);
//通过类名. 访问成员变量,创建1个
Users users = new Users("张三");
System.out.println(users.count);
//通过类名. 访问成员变量,创建2个
Users users1 = new Users("李四");
System.out.println(users.count);
//创建对象名,访问实例变量对象变量
System.out.println(users.username);
System.out.println(users1.username);
}
}
public class Users {
public String username; //实例对象
public static int count; //类变量
public Users(String username){
this.username = username;
count ++;
}
}
1.3 工具类
如果一个类中的方法全都是静态的,那么这个类中的方法就全都可以被类名直接调用,由于调用起来非常方便,就像一个工具一下,所以把这样的类就叫做工具类。
-
写一个生成验证码的工具类
public class MyUtils{
public static String createCode(int n){
//1.定义一个字符串,用来记录产生的验证码
String code = "";
//2.验证码是由所有的大写字母、小写字母或者数字字符组成
//这里先把所有的字符写成一个字符串,一会从字符串中随机找字符
String data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ";
//3.循环n次,产生n个索引,再通过索引获取字符
Random r = new Random();
for(int i=0; i<n; i++){
int index = r.nextInt(data.length());
char ch = data.charAt(index);
//4.把获取到的字符,拼接到code验证码字符串上。
code+=ch;
}
//最后返回code,code的值就是验证码
return code;
}
}
-
接着可以在任何位置调用
MyUtils
的createCOde()方法
产生任意个数的验证码
//比如这是一个登录界面
public class LoginDemo{
public static void main(String[] args){
System.out.println(MyUtils.createCode());
}
}
//比如这是一个注册界面
public class registerDemo{
public static void main(String[] args){
System.out.println(MyUtils.createCode());
}
}
在补充一点,工具类里的方法全都是静态的,推荐用类名调用为了防止使用者用对象调用。我们可以把工具类的构造方法私有化。
public class MyUtils{
//私有化构造方法:这样别人就不能使用构造方法new对象了
private MyUtils(){
}
//类方法
public static String createCode(int n){
...
}
}
static应用(代码块)
代码块根据有无static修饰分为两种:静态代码块、实例代码块
静态代码块
关于静态代码块重点注意:静态代码块,随着类的加载而执行,而且只执行一次。
public class Test2 {
private static int count;
static String school = "黑马";
//静态代码块:加载时执行,只执行一次,用于类变量的初始化
static {
count++;
school = "大头";
}
public static void main(String[] args) {
System.out.println(count); //1
System.out.println(school); //大头
}
}
实例代码块
public class Test {
//实例变量
int age;
//实例代码块:执行在每一个构造方法之前
{
System.out.println("实例代码执行");
age = 18;
System.out.println("创建了对象" + this);
}
public Test(){
System.out.println("无参数构造器执行");
}
public Test(String name){
System.out.println("有参数构造器执行");
}
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test("张三");
System.out.println(t1.age+"t1");
System.out.println(t2.age+"t2");
}
}
//实例代码执行
//创建了对象demo01_static_block.Test@6d311334
//无参数构造器执行
//实例代码执行
//创建了对象demo01_static_block.Test@682a0b20
//有参数构造器执行
//18t1
//18t2
对于实例代码块重点注意:实例代码块每次创建对象之前都会执行一次