类和对象是一个非常抽象的东西,我们来举个例子来说明它们,在现实生活中,类就相当于一类事物的统称,比方说动物,房子的模板······,而对象就是一个个单独的个体,例如猫,狗,按照模板建起的房子······
提到对象,我们就会想到面向对象这个词,而什么是面向对象呢,在C语言中,C语言是面向过程的,他关注的是过程,一步步的去解决问题。而在Java中,Java是基于面向对象的,关注的是对象,将一件件事分成不同对象,靠对象之间的交互完成。
面向对象是一种思考问题的方式:就拿洗衣服举例,面向过程是打开洗衣机,将衣服放进去,加入洗衣液,开启洗衣机。而对于面向对象来说,洗衣服就分为三个对象,衣服,洗衣机,和洗衣液,这样就可以吧复杂的事情变简单,只要面对几个对象就可以。
类和类的实例化
类就是一类对象的统称,对象就是类的实例化
基本语法:
// 创建类
class <class_name>//类名{
field;//成员属性
method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();
class为定义类的关键字,类中的元素称为成员属性,类中的方法称为成员方法
class Animal{
//成员属性
public String name;
public int age;
//成员方法
public void eat(){
System.out.println("吃东西");
}
public void sleep(){
System.out.println( "睡觉");
}
}
类的实例化
用类类型创建对象的过程,称为类的实例化
就如我们前面讲的,类是一类对象的统称,所以,一个类可以实例化出多个对象,每实例化出一个对象,就需要占用一定的物理空间,我们通过new来实现类的实例化。
public static void main(String[] args) {
Animal animal1 = new Animal();
Animal animal2 = new Animal();
Animal animal3 = new Animal();
animal1.eat();
int a =animal1.age;
String s = animal1.name;
}
成员方法和成员属性可以通过对象的引用调用
静态成员变量和普通成员变量的区别
在类中有普通成员变量,和静态成员变量,普通成员变量需要通过类的实例化对象来调用,而静态的成员属性或者方法不依赖于对象,可以通过类直接调用。
1.
我们发现在静态成员方法中可以定义普通的成员变量
2.
在普通的成员方法中不能定义静态的成员变量
3.
在静态的成员发放中不能调用普通的成员方法
4.
在普通的成员方法中可以调用静态的成员方法
总结如下:static定义的变量是类变量属于类的,静态的成员变量是不可以在方法中定义的,静态的方法不依赖于对象,所以在2中eat()方法时普通成员变量,需要对象的引用来调用,所以不能,3.同理。
封装
什么叫封装呢?在我们写代码时经常会涉及两种角色:类的实现者和类的调用者。而封装的本质就是让类的调用者不必太多了解类的实现者是如何实现类的,只要知道如何使用类就可以了,这样可以降低类的使用者的学习和使用成本,降低复杂度。
private
private关键字是用来控制访问权限的
被public 修饰的成员变量或者成员方法,可以直接被类的调用者使用
被private修饰的成员变量或者成员方法,不能被类的调用者使用,需要借助一个public的方法实现调用
getter和setter方法
当我们使用private来修饰字段的时候,就无法直接使用这个字段了,此时就需要使用getter和setter方法,来通过getter方法获取这个成员的值,通过setter方法,来设置这个成员的值。
其中当setter方法中的形参名字和类中的成员属性的名字一样的时候,我们需要使用this关键字,相当于表示当前实例的引用,而当我们不适用this的时候,就相当于自赋值。这里我们就来介绍下this的三种用法。
this关键字
1.this.gata
这里表示调用当前对象的属性
2.this.fanc();
这里表示调用当前对象的方法。
3.this()
调用当前对象的其他构造方法,其中我们要注意的是this调用当前构造方法只能放在构造函数当中。
这里我们不禁想,每个被private封装的成员变量都要使用getter和setter方法,一个个打多麻烦,这里idea中有关于生成getter和setter的快捷键,当我们需要生成时,快捷键Alt+Insert即可跳出一个栏目,选择getter和setter方法,在通过Ctrl选中你想要设置的成员属性即可,这样就能在源代码中自动生成setter和getter方法。
构造方法
构造方法,构造方法是用来干什么的呢?
它是用来对象的实例化,肯定会有兄弟想,为什么前面没说这个的时候,不也能实例化对象吗,其实,那个时候我们也调用了构造函数,这是什么原因呢?
原来当我们如果没有实现任何的构造方法,编译器就会帮我们,默认生成一个不带参数的构造方法,也就是说,一个类中,至少含有一个构造方法,就算你没写,编译器也会为你自动生成一个无参构造方法。
但是我们要注意的是,如果当前类中,含有其他构造方法,那么编译器就不会帮我们生成那个不带参数的构造方法。
这时如果我们想使用不带参数实例化对象时需要自己写一个不带参数的构造方法,或者通过Alt+Insert快捷键选择
r
不选中参数即可。
并且我们可以发现构造方法直线可以构成函数的重载
名字相同,参数不同,返回值不影响
代码块
代码块有本地代码块,实例代码块,静态代码块和同步代码块,这里我们主要介绍实例代码块和静态代码块
通过上面三张图我们发现,类中的代码块只要实例化对象就会实现,静态代码块优先调用,并且每个静态代码块只能被调用一次。