公开的,表示可以在合约内部和外部调用。都支持外部访问。
私有的,表示只能在合约内部调用。
内部的,表示只能在合约内部调用。在0.5版本以后,已经废弃,建议使用private替代。
外部的,表示只嗯呢该在外部调用。状态变量不支持external类型。只支持外部函数访问,如果内部函数访问会报错。
对于,public、internal、private的状态变量都支持合约内部函数的访问。
对于,public、internal、private类型的函数都支持合约内部函数的访问。
pragma solidity ^0.8.0;
contract MyContract {
// 只能在外部调用
function externalFunction() external {
//...
}
// 可以在合约内部和外部调用
function publicFunction() public {
//...
}
// 只能在合约内部调用
function privateFunction() private {
//...
}
}
pragma solidity ^0.8.0;
contract Car{
string private _name;
string public _color;
uint _kw;
constructor(){
_name="car";
_color="black";
_kw=0;
}
function getKW() view external returns(uint){
return _kw;
}
function getColor() view public returns (string memory){
return _color;
}
function getName() view private returns(string memory){
return _name;
}
}
contract Tesla is Car {
constructor() {
// _name="tesla";
_color="red";
_kw=100;
}
function go() public {
// uint kw=getKW();
string memory color = getColor();
// string memory name=getName();
}
}
getKW()是external可见性,只能从外部调用,所以注释掉报错。 getName()是private可见性,不支持继承,所以注释掉报错。
public、internal类型的状态变量都支持继承,private不支持。 external、public、internal可见性都支持继承,private不支持。
pragma solidity ^0.8.0;
contract Car{
string private _name;
string public _color;
uint _kw;
constructor(){
_name="car";
_color="black";
_kw=0;
}
function getKW() view external returns(uint){
return _kw;
}
function getColor() view public virtual returns (string memory){
return _color;
}
function getName() view private returns(string memory){
return _name;
}
}
contract Tesla is Car {
constructor() {
// _name="tesla";
_color="red";
_kw=100;
}
function getColor() view public override returns (string memory){
return _color;
}
}
如果父合约支持子合约继承自己的行为,也就是函数,那么给函数前面添加virtual关键字。 子合约继承或重写行为的时候,要加上override关键字。

