类与对象
面向对象(Object Oriented)
一、面向对象
三大特性:
- 封装性:对象的成员属性和行为看做一个不可分割的整体,一些不想让外界看到的方法也隐藏起来
- 继承性:java是类的单继承,接口的多继承,是从一个基础的类上派生出反应一些特殊性的类,如几何类下面可以包括圆类,正方体类等
- 多态性:多态是指程序中允许出现重名现象。
- 方法重载:根据函数参数的不同,允许同名函数完成不同的工作
- 对象多态:子类对象可以和父类对象相互转换,根据其使用的子类不同完成的功能也不同,比如几何类实例对象,new Circle()和new Cube()是不同的,但是都可以用Gemometric定义
二、类与对象
一个类完成定义后,描述的只是一个广泛的概念,其具体操作必须通过对象来完成,格式如下:
类名称 对象名称 = new 类名称()
或者进行分步定义:
类名称 对象名称 = null
对象名称 = new 类名称()
然后采取以下方法进行类结构的操作
- 对象.成员属性:表示调用类中的成员属性,可以为其赋值或者获取其保存内容
- 对象.方法():表示调用;类中的方法
public class ObjectDemo {
public static void main(String[] args) {
Person person = new Person("张三", 15);
System.out.println(person.tell());
}
}
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String tell(){
return "姓名: "+this.name+"、 年龄: "+this.age;
}
}
1. 对象内存分析
类属于引用数据类型,在使用过程中都要通过关键字new开辟新的内存空间,才能实现成员属性的信息保存
- 【heap】堆内存:保存的是对象的具体信息(成员属性),在程序之中内存空间的开辟是通过关键字new进行的
- 【stack】栈内存:保存的是一块堆内存的地址,可以通过地址找到内存,然后找到对象内容。
类中的成员属性都是每个对象私有的,而类中的方法是所有对象共有的,方法的信息会存储在“全局方法区”这样的公共内存中
NullPointerException
表示的是没有正确实例化对象,也就是有地址,但是地址所指向的内存为空
public class ObjectDemo {
public static void main(String[] args) {
Person person1 = new Person("张三", 15);
Person person2 = person1; // 引用传递,此时person2的地址指向person1的地址,然后指向person1的内存
System.out.println(person1.tell());
System.out.println(person2.tell());
}
}
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String tell(){
return "姓名: "+this.name+"、 年龄: "+this.age;
}
}
当使用引用传递时,要注意栈内存只能保存一个堆内存的信息,当发生指向改变时需要断开原有连接,进行新的连接,此时原有指向的堆内存就没有了入口,成为垃圾,需要GC(Garbage Collection)垃圾回收器不定期的进行回收释放
三、成员属性封装
使用private进行属性的封装,只能够在该类中进行调用,外部无法使用,此时应该提供getter,setter方法来获取和修改private属性。
四、构造方法与匿名对象
构造方法在实例化对象时默认调用new,完成对象属性的初始化操作
- 构造方法的名称必须与类名保持一致
- 构造方法没有返回值类型声明
实例化类时会默认生成一个无返回值无参数的构造方法,如果类中明确定义了一个构造方法,则不会自动生成无参无返回值的构造方法,也就是一个类中至少存在一个构造方法
构造方法也可进行重载,而且只需考虑参数类型及个数即可
public class ObjectDemo {
public static void main(String[] args) {
Person person1 = new Person("张三"); // 使用单参数构造方法,年龄为默认值0
System.out.println(person1.tell());
}
}
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public Person(String name){
this.name = name;
}
public String tell(){
return "姓名: "+this.name+"、 年龄: "+this.age;
}
}
匿名对象只能在创建的时候使用一次,由于没有入口,以后就无法调用
public class ObjectDemo {
public static voi