面向对象:
关注现实存在的事物的各个方面的信息,从对象的角度出发,根据事物的特征进行程序设计。
类
类,是抽象的概念,可以理解为一个模型,用来确定对象将会拥有的特征(属性)和行为(方法)
对象,是类的实例表现形式,一个实体。
- 类的属性:对象具有的各种静态特征 (对象有什么)
- 类的方法:对象具有的各种动态行为 (对象能做什么)
实例化
定义一个Dog
类,有两个属性name
和age
,还有两个方法,run()
和eat()
新建文件Dog.java
public class Dog {
//成员属性:name age
String name;
int age;
//成员方法: run eat
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
}
接着,再定义一个用来测试的类, TestDog.java
1 public class TestDog {
2 public static void main(String[] args){
3 Dog dog = new Dog();
4 dog.name = "灰灰";
5 dog.age = 2;
6 System.out.println(dog.name);
7 System.out.println(dog.age);
8 dog.eat();
9 dog.run();
}
}
下边来看下TestDog.java
做了些什么:
第一行第二行的基础部分这里不再赘述,直接看第三行,实例化对象 Dog dog = new Dog();
实例化对象的过程可以分为两部分:
- 声明对象 Dog dog :在内存的
栈空间
开辟一块空间, 此时对象是空的, 无法使用 - 实例化对象 new Dog() : 在内存的
堆空间
开辟一块空间,完成具体对象初始化操作
通过赋值操作,把堆空间的内存地址存放到了
dog
中:
Dog dog = new Dog();
关于对象的实例化操作,是通过new + 构造方法的形式来完成的。
构造方法
构造方法也称为构造函数、构造器:
1.构造方法与类同名且没有返回值
2.只能在对象实例化的时候调用(配合 new调用)
3.当没有指定构造方法时,系统会自动添加无参的构造方法
4.当指定了构造方法,无论有参数还是无参数的构造方法,都不会自动添加无参数的构造方法
5.一个类中可以有多个构造方法,---构造方法重载,java会根据参数去自动选择。
上边的Dog.java
没有定义构造方法,在调用时系统自动帮我们添加无参数的构造方法,下边我们添加上有参数的构造方法:
public class Dog {
String name;
int age;
//带参数的构造方法
public Dog(String name, int age){
}
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
}
当我们使用带参数的构造函数来进行初始化的时候,为了避免产生赋值错误的情况,可以使用this
关键字
this关键字
this代表当前对象的默认引用,上述代码,dog
就是当前对象
更改Dog.java
public class Dog {
String name;
int age;
//带参数的构造方法
public Dog(String name, int age){
//把传入的 name 赋值给局部变量 name
this.name = name;
//把传入的 age 赋值给局部变量 age
this.age = age;
}
public void run(){
//调用成员方法eat,(这里只是演示this的使用 不关心逻辑)
this.eat();
System.out.println("跑");
}
public void eat(){
//也可以不用this 直接调用成员方法run
run();
System.out.println("吃");
}
}
补充知识
我们在类中定义变量后,其实变量是有初始值的,代码说明:
新建Demo.java
和TestDemo.java
public class Demo {
String name;
int age;
double d;
boolean n;
}
public class TestDemo {
public static void main(String[] args){
Demo de = new Demo();
System.out.println(de.name);
System.out.println(de.age);
System.out.println(de.d);
System.out.println(de.n);
}
}
运行结果:
null
0
0.0
false
上边Demo.java中定义了四个不同类型的变量,直接在TestDemo.java中调用并打印,可看到变量的默认值。
下图展示了变量定以后的初始值: