目录
- 面向对象的初步认识
- 认识类
- 类的实例化
- this关键字
- 对象的构造及初始化
- 访问限定符
1.面向对象的初步认识
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。
2.认识类
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性。
-
类的定义格式
在Java中定义类时需要用到class关键字。例如:
// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}
class是定义类的关键字,ClassName是类的名字,{}中是类的主体。
类中包含类的成员属性(类成员变量)和方法。
属性主要用来描述类,方法主要说明类具有哪些功能,称为类的成员方法。
注意事项:
- 类名采用大驼峰
- 成员前写法统一为public,后续详细解释
-
练习(定义一个狗类)
class PetDog {
public String name;//名字
public String color;//颜色
// 狗的属性
public void barks() {
System.out.println(name + ": 旺旺旺~~~");
}
// 狗的行为
public void wag() {
System.out.println(name + ": 摇尾巴~~~");
}
}
注意事项:
- 一般一个文件当中只定义一个类
- main方法所在的类一般用public修饰(Ecilpse会默认在public修饰的类当中找main方法)
- public修饰的类必须要和文件名相同
- 不要轻易修改public修饰的类的名称,如果需要修改,要借助工具,如下图:
3.类的实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,用类类型创建对象的过程,称为类的实例化。
在java中采用new关键字,配合类名来实例化对象。
还是上面那个练习,我们实例化对象:
public class Main{
public static void main(String[] args) {
PetDog dogh = new PetDog(); //通过new实例化对象
dogh.name = "阿黄";
dogh.color = "黑黄";
dogh.barks();
dogh.wag();
PetDog dogs = new PetDog();
dogs.name = "阿黄";
dogs.color = "黑黄";
dogs.barks();
dogs.wag();
}
}
用类创建对象的方法:
类名 引用名称 = new 类名();
Person per = new Person();
注意事项:
- new关键字用于创建一个对象的实例
- 使用 . 来访问对象中的属性和方法
- 同一个类可以创建多个对象
类和对象的说明
类是一种自定义类型,可以用来定义变量,它是一个模型一样的东西,用来对实体进行描述。
类实例化出对象就像现实中使用建筑图纸建出一个房子。
4.this关键字
为什么有this关键字?首先我们看个例子:
public class Date {
public int year;
public int month;
public int day;
public void setDate( Date this, int y,int m,int d) {
//this代表当前对象
this.year = y;
this.month = m;
this.day = d;
}
public void print(){
System.out.println("year: "+year+" month: "+month+" day: "+day);
}
public static void main(String[] args) {
Date Date1 = new Date();
Date1.setDate(2000,9,9);
Date Date2 = new Date();
Date2.setDate(2011,1,1);
Date1.print();
Date2.print();
}
}
我们定义了一个类,实例化了多个对象,
问题一:
当我们调用方法赋值时,你怎么知道在给哪个对象赋值呢?
其实在方法的参数部分有一个隐藏的参数 Date this ,其实我上面已经写出来了,不过平常我们不会写,这是隐藏的参数。
问题二:
方法里面为什么加this,如果不加会怎样?
如果形参名不小心与成员变量名相同,而且不加this,那么输出结果:
可以看到都是0,是默认值,为什么呢? 其实是因为局部变量优先,这段代码的意思就是形参自己给自己赋值。
所以好习惯就是:习惯使用this
总结:
- this代表当前对象的引用。谁调用这个方法,this就代表谁。
- this只能在"成员方法"中使用
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
5.对象的构造及初始化
如何初始化对象
1.就地初始化:定义的同时直接赋初值。
class Person{
//成员变量, 定义在方法外部,类内部的变量
public String name="张三";
public int age=19;
//成员方法
public void eat() {
System.out.println(this.name+" 在吃饭!");
}
public void show() {
System.out.println("名字:"+name+" 年龄:"+age);
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
当我们不赋初值,直接使用的时候会输出:
原因:
2.默认初始化:
Person person = new Person();
person.name="李四";
person.age=10;
对象空间被申请好之后,对象中包含的成员已经设置好了初始值:
构造方法
构造方法(也称为构造器)是一个特殊的成员方法,
名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
还是以上面那个类为基础:
public Person() {
//构造方法
this.name = "张三";
this.age = 20;
}
构造方法如何被调用?
我们在刚刚的构造方法里打印一下,然后测试:
结果是:
解释:
实例化对象的时候,有两步是很关键的:
1.为对象分配内存 2.调用合适的构造方法
之前我们没有写构造方法的时候,也能正常运行,原因是:
如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的
构造方法可以有多个,它们之间构成重载关系。
比如我们再写一个构造方法
public Person(String name, int age) {
this.name=name;
this.age=age;
System.out.println("Person(String name, int age)");
}
这时候我们再实例化对象就可以直接传参:
public static void main(String[] args) {
Person person = new Person("孙悟空",500);
person.show();
}
然后当我们屏蔽掉之前不带参数的构造方法时,发现报错了。
注意:一旦用户定义任何一种构造方法,编译器都不再生成。
构造方法中,可以通过this调用其他构造方法来简化代码
访问限定符
当你不想让别人看到你类中的某个属性,可以用private修饰
这样别人就不能访问了。这就封装起来了,只能在当前类内使用,类外不能使用。
如果在类外要对封装的属性操作,可以提供公开的方法间接操作:
java提供了四种访问限定符:
public:可以理解为一个人的外貌特征,谁都可以看得到
default: 对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了
private:只有自己知道,其他人都不知道