JAVA学习:继承(下)

本文介绍了JAVA中的final和static关键字。final用于防止类被继承和方法被重写,确保代码安全性;static关键字则涉及常量、静态变量、静态方法和静态代码块,它们在内存中的生命周期和使用方式有所不同。文章通过实例详细讲解了这两个关键字的用法和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

五、final关键字

如果我们不希望一个类被继承,可以使用final关键字。如果我们将Pet类加上final关键字,则代码会立刻报错,系统提示,finalabstract不能同时使用:

在这里插入图片描述
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、静态方法

又称为类方法,特点:

  1. 直接通过类的名字来调用。
  2. 可以调用静态变量,不能调用成员变量。(只有非静态方法才能使用this)相反的是,非静态方法可以调用静态变量。

4、静态代码块

静态代码块用于给静态变量做初始化,如static{ }
例:
看看就行,以后会讲

特点:

  1. 当调用静态代码块所在类的方法和属性时,静态代码块会被最先执行(优先于构造函数)。
  2. 静态代码块只被调用一次。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值