类和对象
众所周知,java是面向对象的语言。
面对对象的三个过程:找对象、创建对象、使用对象
面向对象语言(OOP)的三大特征:继承、封装、多态
类:一类对象的统称,是一个模板
对象:类具体化的一个实例
类相对于建造房子的图纸,对象相对于我们用图纸建造出的房子
类及其实例化
总之:类相当于一个模板,对象是由模板产生的一个具体化的实例,一个类可以产生无数个对象。
声明一个类就是创建一个新的数据类型,类在Java中属于引用类型。
类的创建:
class 类名 {
类体;
}
类名 对象名 = new 类名; //实例化对象
类体中包括属性及方法,即成员属性及成员方法。
例如有一个Person类,属性包括年龄、姓名等;方法/行为包括吃饭、睡觉等。
类的实例化:用类创建对象的过程
一个类可以实例化多个对象,使用new关键字来实例化一个对象。
通过对象的引用来调用成员方法,但前提是必须实例化一个对象;
例如 Person person = new Person;person就是一个引用。
实例成员变量:若是引用类型,未进行初始化,则初值为null;若为简单类型,则初值为简单类型对应的0值。
- 访问类的成员变量: 引用.成员变量
- 访问类的成员方法: 引用.成员方法
class Person {
public String name;//成员变量name
public int age;//成员变量age
//成员方法eat
public void eat() {
System.out.println(name +" "+"吃饭" );
}
//成员方法sleep
public void sleep() {
System.out.println("睡觉");
}
public static void main(String[] args) {
Person person = new Person();
person.name="yang";
person.age=15;
person.eat();//通过对象的引用调用成员方法
}
}*/
成员变量
定义在类的内部,不定义在方法内部的变量
成员变量分为静态成员变量和实例成员变量
静态成员变量:被static所修饰,存储在方法区,需要通过类名.静态成员变量来调用,属于类,不属于对象。
实例成员变量:通过对象的引用调用,存储在堆上。
成员方法与成员变量类似
class Person {
public int age;
public String name;
public static int count = 10;
public final int SIZE = 11;
public static final int SIZE2 = 12;
}
上述类中成员变量的存储:
被static 所修饰的放在方法区,其余放在堆上。
1.main函数为什么是静态的?
main函数是程序入口,若main函数不是static,则依赖于对象,而没进入主函数,程序无入口,对象无法建立。
2.静态成员方法为什么不可以调用实例成员变量?
所有静态的方法或成员变量不依赖于对象
实例成员变量的调用依赖于对象,必须产生一个对象的引用,才可调用实例成员。
- 实例方法内可以调用静态方法或变量;静态方法内不可以调用实例方法或变量。
一般在设计类时,将属性写为私有的private,但这时由当前类私有,只能在类的内部访问
要想在类的内部访问,需要进行封装,提供一系列的set、get公有方法。
一键生成get、set方法:alt + insert
构造函数
作用:生成对象
实例化对象时,若自己未实现构造函数,它都会自己生成一个默认不带有参数的构造函数
在调用构造函数期间,未生成对象;调用完成之后,生成对象。
构造函数可以发生重载
this关键字
this:代表当前对象的引用
原因:实例化对象分为两步,一是为对象分配内存;二是调用合适的构造函数,构造函数完成后才生成对象。
this:
- 用this 调用构造函数,只能放在方法的第一行
- this.成员属性
- this.成员方法
- this 不能在static方法中使用。
public Person() {
this("软件",18);//通过this调用带有两个参数的构造函数
System.out.println("Person()");
}
//带有一个参数的构造函数
public Person(String name) {
System.out.println("Person(String)");
this.name = name;
}
//带有两个参数的构造函数
public Person(String name,int age) {
System.out.println("Person(String,int)");
this.name = name;
this.age = age;
}
代码块
普通代码块:定义在方法中的代码块
构造代码块/示例代码块:定义在类中的代码块,用于初始化实例成员变量
{
}
静态代码块:由static修饰,用于初始化静态成员变量
static {
}
优先级:静态代码块先于实例代码块,实例代码块先于构造函数
- 静态代码块只执行一次