抽象概念——类(class)——对象模板
具体——实例(instance)——对象实例
定义class:
class Person {
public String name;
public int age;
}
字段(field)描述一个类的特征
类把一组数据汇聚到一个对象上,实现数据封装
public
修饰字段,表示该字段可被外界访问
创建实例:
new 根据模板创造对象实例
Person ming = new Person();
访问实例变量可以用变量.字段
方法
为防止外界直接操作内部字段(field
),使用private
修饰
class Person {
private String name;
private int age;
}
此时可使用方法(method
)使外部代码间接修改field
调用方法语法:实例变量.方法名(参数);
定义方法:
修饰符 方法返回类型 方法名(方法参数列表) {
若干方法语句;
return 方法返回值;
}
方法返回值通过return
语句实现,返回类型设为void
时可省略return
private
方法内部调用
方法可以封装一个类的对外接口,调用方不需要知道也不关心Person实例在内部到底有没有age字段
this变量:始终指向当前实例(具体对象)
命名没有冲突时可以省略
局部变量和字段重名时,局部变量优先级高,此时指向字段用this
方法参数用于接收传递给方法的变量值
可变参数用类型...
定义,相当于数组类型,如:
class Group {
private String[] names;
public void setNames(String... names) {
this.names = names;
}
}
//可变参数定义
Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames("Xiao Ming"); // 传入1个String
g.setNames(); // 传入0个String
麻烦之处:
调用方可以传入null
,但在此为一个空数组
调用方需要自己先构造String[]
参数绑定
调用方把参数传递给实例方法时,调用时传递的值会按参数位置一一绑定
计算完毕方法返回值后,改变传入参数
基本类型的为复制,不影响
引用类型的会影响
public class Main {
public static void main(String[] args) {
Person p = new Person();
String bob = "Bob";
p.setName(bob); // 传入bob变量
System.out.println(p.getName()); // "Bob"
bob = "Alice"; // bob改名为Alice
System.out.println(p.getName()); // "Bob"还是"Alice"?
}
}
class Person {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
为何是Bob而不是Alice的解释:
String bob
中this.name = name;
时,是将字符串的地址赋给字段地址,变内容时为直接改变地址,原地址不变,而String[] bob
时,fullname[0] = "Bart"
是将指向地址内的内容改变
构造方法
一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法,无参数,无执行语句
class Person {
public Person() {
}
}
可定义既无参数的构造方法,又有参数的构造方法
没有在构造方法中初始化字段时,字段为默认类型
也可直接定义字段时初始化
构建对象实例时先初始化字段,再执行构造字段代码进行初始化
多构造方法
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this.name = name;
this.age = 12;
}
public Person() {
}
}
通过new
操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分
重载方法
也依据方法参数输入识别
继承
extends
class Person {
private String name;
private int age;
public String getName() {
...}
public void setName(String name) {
...}
public int getAge() {
...}
public void