day03-Problems
Code Problems 03
写成String public demo报错了,顺序不对,为什么不能这么写,这么写的依据是什么?
Java 方法的声明必须遵循固定语法结构,访问修饰符(如 public)必须在返回值类型(如 String)之前,顺序不能颠倒。
正确的语法结构(以方法为例)是:
[访问修饰符] [其他修饰符,如static] 返回值类型 方法名(参数列表) { 方法体 }
4个访问修饰符:private(low,仅当前类可以访问,同包都不行),public(跨包访问),protected(同包+不同包子类可以访问),还有默认修饰符(包访问权限)。
- 统一代码结构,降低编译器解析成本
- 提升代码可读性
关于this.name name的疑问?
对比维度 | return name; |
return this.name = name; |
---|---|---|
操作的变量 | 方法的「局部变量 name 」(参数传入的值) |
先给「成员变量 this.name 」赋值,再返回 |
是否修改成员变量 | 不修改!成员变量 this.name 保持原值 |
会修改!把局部变量的值赋给成员变量 |
返回的内容 | 直接返回参数传入的「局部变量值」 | 先执行「赋值操作」,再返回「赋值后的值」(赋值表达式的结果就是 “被赋的值”) |
实际作用 | 仅 “传递参数值”(方法无副作用,不改变对象状态) | 既 “给对象的成员变量赋值”,又 “返回赋值结果”(有副作用,改变对象状态) |
public class Test {
public static void main(String[] args) {
Person p = new Person(); // 此时成员变量 this.name 是默认值 null
// 情况1:如果 demo 方法是 return name;
String result1 = p.demo("张三");
System.out.println(result1); // 输出:张三(返回的是参数值)
System.out.println(p.getName()); // 输出:null(成员变量没被修改,还是默认值)
// 情况2:如果 demo 方法是 return this.name = name;
String result2 = p.demo("李四");
System.out.println(result2); // 输出:李四(返回的是赋值后的值)
System.out.println(p.getName()); // 输出:李四(成员变量被修改了)
}
}
Summary:this是指向创建的实例的,所以当我们返回this.name=name时是给实例的属性赋值,如果返回name就仅仅返回输入的属性,没有对实例有什么影响。
即不是传参就是赋值,不要想当然的认为。
关于sout在非static函数外报错?
认为sout和c等语言的print一样可以在各处使用,其实不然。
java的直接作用域只能放[成员变量,方法声明,代码块声明],不能放执行性代码(如sout,赋值语句等)。其实也就是说1对于sout这些执行性代码来说只能放在方法或者代码块内,直接放在类的直接作用域会出错。sout等应该在被执行的时候调用而不是直接使用。面向对象的,类是装东西的,方法代码块才是负责干活的。
🐾