携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
类的成员
成员变量/属性/字段
在类中, 但是方法外部定义的变量, 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般不会严格区分)。
就是说成员变量/属性/字段,在类中在方法外部上方。
class Animal {
//name,age都是成员变量
public String name;
public int age;
public void eat(){
System.out.println(name+"::eat()");
}
}
注意事项
- 我们通过
.访问成员变量 - 成员变量可以不初始化,并且有默认初始值!
- 成员变量
不同类型成员变量的初始值:
| 类型 | 初始值 |
|---|---|
| 整型和浮点型 | 0 |
| 引用类型 | null |
| 布尔类型 | false |
null
null为空引用不指向任何对象!类似C语言中的空指针。记得是小写!而和C语言中的NULL空指针一样,不能通过null引用进行访问实例成员,否者为报空指针异常!
我们也可以对类中的成员变量进行初始化!不过这样的操作就使得该类的实例化对象的成员变量都有相同的值,有点鸡肋!
假如我们创建一个Animal类,如果我们将成员变量name初始化成一个固定的名字!就显得很不合理,毕竟每个动物读都有自己的名字!
成员方法
用于描述对象的行为
我们已经知道方法就好比C语言中的函数!我们通过成员方法将该类的某个行为,封装成一个方法!就好比Animal类中的eat方法。然后我们通过该类对象的引用调用该方法,展现该类的某种行为!
class Animal {
public String name;
public int age;
public void eat(){
System.out.println(name+"::eat()");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.setName("浩浩"); //通过类中的setName方法将animal对象name赋值
String name = animal.getName(); //getName方法获得name
System.out.println(name);
animal.eat(); //展现eat() 行为
}
构造方法
类中还有一种比较特殊的方法构造方法!
方法名和类名相同
基本语法
- 方法名和类名相同
- 方法无返回值
- 方法的参数列表(个数和种类)不做要求
- 一个类可以有多个构造方法,(构造方法重载)且必须有一个构造方法!
class People{
public String name;
public byte age;
//无参数的构造方法
public People(){
System.out.println("name:"+name);
}
//含有一个参数的构造方法
public People(String name){
this.name = name;
}
//含有两个参数的构造方法
public People(String name,byte age){
this.name = name;
this.age = age;
}
//含有多个参数的构造方法
//........
//上面这些构造方法构造了方法重载!
}
构造方法的作用
public class Test {
public static void main(String[] args) {
People people = new People();
//实例化一个People对象
}
}
运行结果
我们运行一下发现,我们并没有调用People类中无参数的构造方法,但是运行时却调用了!!!
这是什么原因呢?
构造方法的作用
这是不得不提构造方法的作用!
如何实例化一个对象呢?
可能你会问:bug你刚刚不是讲过了吗,不就是通过new关键字实例化一个对象嘛!
确实如此,but还有些重要的细节没说。
创建一个对象先要通过类创建一个引用,然后通过引用指向一个实例化对象。其实我们也可以不通过父类引用创建一个对象,后面bug郭学习!
实例化一个对象
- 通过
new关键字为创建并为对象分配空间 - 调用该类的合适的构造方法
这时你可能又有疑问!
bug郭你刚刚创建
Animal对象,也没见你类中有构造方法,更不要说调用构造方法了!
我们创建一个类时,编译器会默认给我们创建一个不带参数的构造方法,并不会在类中显示,并且该构造方法中不含有语句!
所以实例化一个对象时,都会调用该类的构造方法,如果类的创建者没有创建构造方法,编译器就会调用默认不带参数的的构造方法!
class Book{
public String name;
public double price;
// public Book(){ //编译器会默认帮我们创建这个不带参数的构造方法
// }
}
//自己创建构造方法!
class Book{
public String name;
public double price;
// public Book(){ //编译器会默认帮我们创建这个不带参数的构造方法
// }
public Book(String name){ //当我们创建一个构造方法
}
}
public class Test {
public static void main(String[] args) {
Book book = new Book();
//创建对象需要调用合适的构造方法
}
}
为啥但我们自己创建构造方法时,实例化一个对象却报了错误!
系统不是默认调用不带参数的构造方法嘛!
但我们自己书写了构造方法时,编译器就会将默认的构造方法删除,而我们
new Book();实例化对象时是要调用类中不带参数的构造方法!但是该类中已经没有不带参数的构造方法,所以报错!
- 创建对象时调用合适的构造方法!
class People{
public String name;
public byte age;
//无参数的构造方法
public People(){
System.out.println("name:"+name);
}
//含有一个参数的构造方法
public People(String name){
this.name = name;
}
//含有两个参数的构造方法
public People(String name,byte age){
this.name = name;
this.age = age;
}
//含有多个参数的构造方法
//........
//上面这些构造方法构造了方法重载!
}
class Book{
public String name;
public double price;
// public Book(){ //编译器会默认帮我们创建这个不带参数的构造方法
// }
public Book(String name){ //当我们创建一个构造方法
this.name = name;
System.out.println(this.name);
}
public Book(String name,double price){
this.name = name;
this.price = price;
System.out.println("name:"+this.name+" price:"+this.price);
}
}
public class Test {
public static void main(String[] args) {
//传递一个参数调用带有一个参数的构造方法,实例化一个对象
Book book = new Book("富婆通讯录"); //创建对象需要调用合适的构造方法
//传递两参数调用带有两个参数的构造方法
Book book1 = new Book("富婆通讯录",198.9);
}
}
- 构造方法不能有返回值
注意事项
- 实例化一个对象要调用合适的构造方法
- 实例化对象时通过传递不同参数列表,调用不同的构造方法
- 构造方法方法名与类名相同
- 构造方法无返回值
- 构造方法可以有多个,参数列表不同构成了方法的重载