- 面向对象三大特征:1)封装性(private封装) 2)继承性 3)多态性
- 面向对象的名词扩展:
1)OOA:面向对象分析
2)OOD:面向对象设计
3)OOP:面向对象编程 - 所谓的类就是指共性的概念,而对象指的是一个具体的、可以使用的事物。首先产生类(类是生产对象的蓝图),而后才可以产生对象。对象的所有行为,一定在类中进行了完整的定义。
- 类中的组成: 属性(变量,描述每个对象的具体特点)、方法(操作的行为)
例如:定义一个Person的类
class Person {
public String name; //属性
public int age; //属性
public Person(String name,int age) { 构造函数
this.name = name;
this.age = age;
}
public String getPersonInfo() { //方法 不再由主类直接调用,而需要由对象调用
return "姓名:"+this.name+",年龄:"+this.age;
}
}
- 生产(定义)对象的语法: 类名称 对象名称 = new 类名称();
例如:生产(定义)一个Person类的实例(对象):
Person p1 = new Person();
Person p2 = new Person("Steven",25);
- 通过对象调用实例变量与实例方法。
Person p = new Person(“Steven",25);
System.out.println(p.name);
System.out.println(p.getPersonInfo());
- 栈内存(JVM局部变量表):存放的是局部变量(包含编译期可知的各种基本数据类型、对象引用-即堆内存的地址,可以简单的理解为对象的名称),java栈是与线程对应起来的,每当创建一个线程,JVM就为这个线程创建一个对应的Java栈。
- 堆内存:保存的是真正的数据,即对象的属性信息。
- 只要出现了关键词new,表明在堆上分配了内存并且产生了类的对象引用这部分内存。
- 对象(引用数据类型)必须在实例化后调用,否则会产生NullPointerException(运行时错误),编译时不会出错。
- 引用传递的本质:一块堆内存可以被多个栈内存所指向。
- 垃圾内存:没有任何栈内存指向的堆内存空间。
所有的垃圾空间会不定期GC(Garbage Collection 垃圾收集、垃圾回收机制),GC会影响性能,所以开发之中一定要控制好对象的产生数量(无用的对象尽量少产生)。 - 对象属性的初始化方式?(一般无特殊说明,属性为private修饰)
1)提供一系列Getter和Setter方法;(快捷方式为 Alt + Insert)
setter方法:主要用于进行属性内容的设置和修改;
getter方法:主要用于属性内容的取得。
2)通过构造函数(方法);
3)静态代码块和实例代码块。
static { //静态代码块
}
{ //实例代码块
}
- 对象的产生需要以下两步:
1)为对象开辟内存;
2)调用合适的构造函数(方法)
Ps:构造函数可以发生重载,若类中没有给出构造函数,则提供默认的无返回值构造函数(方法)。 - 对象的初始化顺序:
静态——>实例——>构造函数(方法) - native修饰的方法都存储在本地方法栈上。
- static修饰的不属于对象,属于类,只能通过类调用,而不能通过对象调用。类中static修饰的变量、常量、方法都要用类调用,例如Person.count。
- 方法是静态的,只能访问静态变量,静态代码块只会被初始化一次。
- 类的设计原则:
1)编写类时,类中的所有属性必须使用private封装。
2)属性若要被外部访问,必须定义setter、getter方法。 - 产生对象的语法: ①类名称 ②对象名称 = ③new ④类名称();
1)任何对象都应该有其对应的类,类是对象的蓝图;
2)是一个唯一的标记,引用一块堆内存;
3)表示开辟新的堆内存空间;
4)构造方法。 - 所谓的构造方法是使用关键词new实例化新对象时进行调用的操作方法,定义原则为:
1)方法名称必须与类名称相同;
2)构造方法没有返回值类型声明;(没有void声明)
3)每一个类中一定至少存在一个构造方法(没有明确定义,则系统会自动生成一个无参构造。 - 属性:是在对象开辟对内存时开辟的空间;
构造方法:是在使用new后调用的;
普通方法:是在空间开辟了、构造方法之后可以多次调用的。
public void Person() { } //命名不标准的普通方法
public Person() { } //无参构造方法
PS:构造方法的调用和对象内存分配几乎是同步完成的。
- 构造方法重载
public Person() {
System.out.println("====无参构造====");
}
public Person(String name) {
System.out.println("====有参构造====");
}
- 在进行类定义时顺序为:①定义属性—>②定义构造方法—>③定义普通方法
- 匿名对象:无任何的栈空间所指向,使用一次就成为垃圾空间。
new Person("张三",20).getPersonInfo();
- this关键字的主要用途:(你是怎么理解this)
1)当前对象的调用;
2)调用构造方法(函数);
3)调用属性。
1)只要在类中,方法访问类中属性,一定要加上关键字。
2)this调用本类方法有以下两种情况:
①调用普通方法:this.方法名称(参数)
②调用构造方法:this(参数)
3)this调用构造方法需注意:
①this调用构造方法的语句即 this(参数),必须在构造方法首行;
②使用this调用构造方法时,请留有出口。
- static关键字:
1)static类属性:保存在全局数据区的内存之中,所有对象都可以进行该数据区的访问。描述共享属性,只需要在属性前添加static关键字即可。
2)传统属性的特征:保存在堆内存中,且每个对象独享属性。
3)static属性(类属性)与传统属性的区别:
①访问static属性(类属性)应使用类名称.属性名;
访问非static属性使用对象名称.属性名
②所有的非static属性(实例变量)必须在对象实例化后使用,而static属性(类属性)不受对象实例化控制。 - static类方法:使用static定义的方法,直接通过类名称访问。
- 关于static方法的两点说明:
①所有的static方法不允许调用非static定义的属性和方法;
②所有的非static方法允许访问static方法或属性。