
在solidity中大量的访问控制符,因此理解这些访问控制符就像java中的类修饰变量和方法一样,合适的修饰符,合约代码会更省gas,诸如,public,exteral,internal,private这类修饰符是控制函数或者变量在合约中的可见性以及可调用范围,通俗理解就是谁能访问这段代码的权限。
在合约内部或者外部都能访问
name与getName都是 public,公有的name在getName中可以被访问,他们在外部也可以被访问contract A {
// 申明name变量为public,且为string类型
string public name = "Tom";
// 申明getName为public
function getName() public view returns(string memory) {
return name;
}
}
在外部可以被访问

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.28;
contract A {
// 申明name变量为public
string public name = "Tom";
uint private age = 18;
// 申明getName为public
function getName() public view returns(string memory) {
return name;
}
function setAge (uint _age) public {
age = _age;
}
function getAge() private view returns(uint) {
return age;
}
function getPrivateAge () public view returns(uint) {
return getAge();
}
}
private example
contract Example {
uint private secret = 123;
function getSecret() private view returns(uint) {
return secret;
}
function reveal() public view returns(uint) {
return getSecret(); // OK
}
}访问不了私有方法

父类 private 方法无法访问

contract A {
// 申明name变量为public
string public hobby = "basketball";
...
function setHobby(string memory _hobby) internal {
hobby = _hobby;
}
function getHobby() public view returns(string memory) {
return hobby;
}
}
contract B is A {
function getViewParent() public view {
// 子类访问父类public方法
this.getName();
this.getHobby();
}
// 能直接调用父类的setHobby方法
function setParentHobby(string memory _hoddy) public {
setHobby(_hoddy);
}
}
internal example
contract Base {
function _add(uint a, uint b) internal pure returns (uint) {
return a + b;
}
}
contract Derived is Base {
function sum(uint x, uint y) public pure returns (uint) {
return _add(x, y); // 子合约可以用
}
}
this.f() 调用),不能直接在内部调用。this访问external example
contract Example {
function foo(uint x) external pure returns(uint) {
return x * 2;
}
function bar(uint y) public view returns(uint) {
// return foo(y); // ❌ 错误
return this.foo(y); // ✅ 只能这样调用
}
}
在外部可以访问

我们发现我们的方法里也有 view 这样的关键字,这是读取合约的状态变量,只能读取,不能修改
contract Example {
uint public x = 10;
// view: 可以读取状态,但不能修改
function getX() public view returns (uint) {
return x; // ✅ 可以读取状态
}
}
this.balance、block.timestampragma solidity ^0.8.0;
contract Math {
// 纯函数:不会读写状态,只做运算
function add(uint a, uint b) public pure returns (uint) {
return a + b;
}
}
contract A {
function sum (uint a, uint b) internal pure returns(uint) {
return a + b;
}
uint public num = 0;
function callSum(uint a, uint b) public {
num = sum(a, b);
}
}
合约的几个修饰符,public、private、external、internal主要控制合约变量以及函数的访问权限
public修饰的变量或者方法可以访问,外部可以调用访问private修饰的合约变量和方法只能在当前合约内部访问,外部与继承合约无法访问external修饰的合约变量能在外部访问,在合约内部可以通过this访问,在子合约通过this访问internal修饰合约的变量或方法只能内部访问,通常用于计算结果参考资料
[1]
code example: https://github.com/maicFir/SolidityLesson/blob/master/18-test/contracts/demo.sol