面向对象的程序设计的3个特征:
1. 封装性。对外部不可见,必须通过实例化一个类的对象,通过对象才能访问此类的属性及方法。private的属性,不能由对象直接进行访问,须通过setter和getter方法设置和取得。
2. 继承性。子类继承父类,子类只能继承一个父类。
3. 多态性。
方法重载、重写:一个类中,允许多个同名的方法,但方法的参数个数或参数的类型不同
对象多态:子类对象与父类对象相互转换
类属于引用数据类型。
所有对象名称都保存在栈内存中,而对象的具体内容则保存在堆内存。Person per=new Person(),对象名称per保存在栈内存,保存的内容是其对应的堆内存空间的访问地址。
每当出现关键字new的时候必定表示开辟了新的堆内存空间。
构造方法:当调用关键字new实例化对象时才会调用构造方法。在Java中如果一个类中没有明确地声明一个构造方法,在编译时则会直接生成一个无参数的,什么都不做的构造方法。
匿名对象:没有明确给出名称的对象。一般匿名对象只使用一次,且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。匿名对象没有栈内存引用它,所以匿名对象在用过一次之后就等待被垃圾收集机制回收。
一个字符串就是一个String类的匿名对象,匿名对象就是已经开辟了堆内存空间的并可以直接使用的对象。“hello”.equals("hello"),一个字符串可以调用String类中的方法,也就证明了一个字符串就是一个String类的匿名对象。
String str1=“hello”; 先在堆内存开辟了一个空间,内容那个是“hello”,然后把这个堆内存的地址给了str1。如果一个字符串已经被一个名称引用,则以后再有相同的字符串声明时,就不会再重新开辟空间,继续使用已经开辟好的堆内存。
String str=new String("hello");一个字符串是一个String类的匿名对象,而如果使用new关键字,不管如何都会再开辟一个新的空间,但此时,此空间的内容还是hello。所以此代码实际上是开辟了两个内存空间(如果在之前已经声明过一个hello的匿名对象,此代码就只开辟了一个空间),真正使用的是new开辟的空间,另外一个匿名的,就等待被回收。
字符串的内容一旦被声明则不可改变。String str=“hello”; String str=str+" world";