第五章:面向对象基础
1、基本概念
封装性:两个含义,一是指把对象的属性和行为封装成在一个对象中。二是指信息隐蔽.
封装的好处
1、良好的封装能够减少耦合。
2、类内部的结构可以自由修改。
3、可以对成员进行更精确的控制。
4、隐藏信息,实现细节。
继承性:用户开发类去继承类库,子类可以使用父类所定义的变量和方法,继承所有成员,并相应的增加自己的成员。(如果父类方法为private类型的,那么子类则无法继承,也无法覆盖。)
多态性:两种形式,一方法重载。二对象多态,即子类对象可以和父类对象互相转换,根据其使用的子类不同,完成的功能也不同。上转型和下转型。
2、对象的引用传递
如果per1,per2两个对象都实例化了,当per2=per1时,per2对象断开原有指向自己堆内存的连接,指向per1的堆内存。per2的堆内存由于没有被任何对象所引用,所以会等待垃圾回收机制(GC)进行回收。
3、封装性
http://blog.csdn.net/chenssy/article/details/12757911
(该文章对封装理解的不错)
面向对象中,不允许对象直接访问类的属性,所以要对类中所有属性进行封装,使用private关键字。因此要定义setter和getter方法去获取封装的属性。(封装性在Java中有很多种形式,private只是最基本的一种形式,也是一种比较常见的形式)
例:public String getName(){
return this.name;
};
public void setName(String n){
this.name=n;
}
一般定义名字为set加属性名字(第一个字母大写),同get方法;
setter方法我可以用来对属性进行控制和规范,例如年龄没有负数等等。
getter方法也可以做一些值得转换等等;
4、构造方法
注意点:构造方法申明处不能有任何返回值类型的申明。
不能在构造方法中使用return。
只有对象实例化的时候才会调用构造函数。
5、匿名对象(名称不太熟悉)
匿名对象就是没有明确给出名称的对象。匿名对象值在堆内存中开辟空间,栈内存中没有。
例:new Person("张三",40).tell();
一般只是用一次,之后会被GC回收。
匿名对象在实际开发中基本上作为其他类实例化对象的参数传递的。
6、String
String其实是一个类
String str1="hello";
String str2="hello";
str1==str2——>true。Java会提供一个字符串池来保存全部内容,因为hello在str1创建的时候已经存在,所以str2也指向同一个堆内存。
那String str=new String("hello");
因为用new的话不管如何都会开辟新的空间。实际上开辟两个空间,真正使用的是new开辟的空间,另一个会被GC回收。
所以String一般都是直接赋值。
String内容不可改变,真正改变的实际上是指向了新的堆空间。
所以开发中不要用循环大量的修改字符串内容,性能会很低。Java有专门的StringBuffer来完成。
String一些方法
(1).toCharArray();将字符串变为字符数组
(2).charAt(a);取出第a+1个字符
(3).getBytes();字符串变为byte数组
(4).length();取得字符串长度
(5).indexOf("c");查找字符c的位置,没有返回-1;
(6).trim();去掉左右空格
(7).substring(1,5);截取1-5个位置的内容
(8).split("");按空格进行拆分
(9).toUpperCase转大写;.toLowerCase转小写
(10)startsWith("**")是否以**开始;endsWith同理
(11).equals(str2);不分大小写进行字符串比较
(12).replace("l","x");将所有l替换成x
7、引用传递
一对一关系,例如一个人有一本书,一本书属于一个人。人和书都是类。所以会有以下定义
class Person{
private Book b;
public void setBook(Book b){
this.b=b;
}
}
class Book{
private Person p;
public void setPerson(Person p){
this.p=p;
}
}
public class Demo05(){
....
per.setBook(bk);
bk.setPerson(per);
....
}
8、this关键字
(1)表示类中的属性 this.name=name;
(2)调用本类的构造方法 this();this(int a);构造方法互相调用,但只能放在构造方法的首行。而且程序中至少存在一个构造方法是不使用this调用其他构造方法的。
(3)表示当前对象 Person p=this;
9、static关键字
(1)用static申明属性,该属性称为全局属性,可以被所以对象共享。并且可以用类名称直接调用(Person.country="A";)。如果name设置了内容,贼实用设置的名字。如果没有设置,用static属性为类中的属性自动的编名操作。
(2)用static申明方法,可以用类名称直接调用。但static方法不能调用非static的属性或者方法。反之可以。
10、代码块
(1)普通代码块
(2)构造块。构造块优先于构造方法执行,并且每次实例化对象都会执行。
(3)静态代码块。使用static申明的代码块。静态代码块优先于主方法执行,而在类中定义的静态代码块会优先于构造块。并且不管产生多少个对象,都只执行一次。
(4)同步代码块
10、构造方法私有化
因为构造方法被私有化,所以不能在外部进行实例化对象,只有在类的内部。因此需要在内部实例化一个本类的static对象,通过static的getter方法返回类的对象。然后再用类名称直接调用getter方法。
这种设计模式叫做
单例设计模式
,不管怎么运行,这个类永远只有一个实例化对象。
11、内部类
内部类的唯一好处就是可以方便地访问外部类的私有属性。
在其他类中调用内部类:外部类.内部类 内部类对象=外部类实例.new 内部类();
如果在方法中定义内部类,方法中的参数如果要被内部类调用,参数必须加上final
12、单链表
引用对象的实现