五、final关键字
如果我们不希望一个类被继承,可以使用final
关键字。如果我们将Pet类加上final
关键字,则代码会立刻报错,系统提示,final
和abstract
不能同时使用:
final
关键字是比较安全的一种写法,可以避免通过继承重新方法。
比如我们在Pet中有swim()
方法,此方法在Dog中被重写。如果我们在Pet中给swim()
方法加入final
,则Dog类中的swim()
方法会失效。
所以,abstract
关键字要求子类必须对方法进行重写,但final
关键字则不允许子类对方法进行重写。
下面,我们对final
关键字进行调用。我们先给dog1加上final
关键字,然后在给d1重新赋值,结果系统报错:
六、static关键字
1、常量
public static final String MALE = "male";
public static final double PAI = 3.1415926;
2、静态变量
又称为类变量(区别于前面学过的对象变量),例如我们之前写的代码中的dog1和dog2。
静态变量的生命期:一旦赋值,就永远不会被释放(除非程序退出或崩溃)。与之相对的,
局部变量生命期:代码运行超过该变量所在的{}范围,就会被GC标记为垃圾,等待垃圾回收。
成员变量生命期:代码运行超过该变量所属对象所在的{}范围,就会被GC标记为垃圾,等待垃圾回收。成员变量随所属对象一起消失。
接下来做用户登录。我们新建3个类,UserBiz、User和UserUi(注意勾选箭头指的位置):
建成后如下图:
在User中,我们编写几个简单的属性
package com.iscc.pet.entity;
public class User {
private String uname;
private String pwd;
private int role;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getRole() {
return role;
}
public void setRole(int role) {
this.role = role;
}
}
然后,我们在UserUi写登录的方法:
public class UserUi {
public User login() {
}
我们希望通过Ui调Biz,首先在Biz中输入:
package com.icss.pet.biz;
import com.iscc.pet.entity.User;
public class UserBiz {
public User login(String uname,String pwd) {
User user = null; //初始化
if(uname != null && pwd != null && uname.equals("admin") && pwd.equals("123") ) {
user = new User();
user.setUname(uname);
user.setPwd(pwd);
user.setRole(1);
}
return user;
}
}
然后在UserBiz中输入:
package com.icss.pet.biz;
import com.iscc.pet.entity.User;
public class UserBiz {
public User login(String uname,String pwd) {
User user = null;
if(uname != null && pwd != null && uname.equals("admin") && pwd.equals("123") ) {
user = new User();
user.setUname(uname);
user.setPwd(pwd);
user.setRole(1);
}
return user;
}
}
然后,在UserUi中输入:
package com.icss.pet.ui;
import com.icss.pet.biz.UserBiz;
import com.iscc.pet.entity.User;
public class UserUi {
public static User user = null; //静态变量,或类变量
public void login(String uname, String pwd) {
UserBiz biz = new UserBiz();
User user = biz.login(uname, pwd);
if(user != null) {
System.out.println(uname + "登录成功");
}else {
System.out.println("用户名或密码错误");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
UserUi ui = new UserUi(); //调用
ui.login("admin","123");
}
}
运行后,获得结果:
admin登录成功
下面,我们将user的变量进行存储:
package com.icss.pet.ui;
import com.icss.pet.biz.UserBiz;
import com.iscc.pet.entity.User;
public class UserUi {
public static User user = null; //静态变量,或类变量
public void login(String uname, String pwd) {
UserBiz biz = new UserBiz();
User user = biz.login(uname, pwd);
if(user != null) {
UserUi.user = user; //把局部变量赋值给静态变量
System.out.println(uname + "登录成功");
}else {
System.out.println("用户名或密码错误");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
UserUi ui = new UserUi(); //调用
ui.login("admin","123");
//调用登录用户的信息,在程序任何位置都可以调用
System.out.println("当前登录的用户为:" + UserUi.user.getUname() + ",权限是:" + UserUi.user.getRole());
}
}
3、静态方法
又称为类方法,特点:
- 直接通过类的名字来调用。
- 可以调用静态变量,不能调用成员变量。(只有非静态方法才能使用this)相反的是,非静态方法可以调用静态变量。
4、静态代码块
静态代码块用于给静态变量做初始化,如static{ }
。
例:
特点:
- 当调用静态代码块所在类的方法和属性时,静态代码块会被最先执行(优先于构造函数)。
- 静态代码块只被调用一次。