第一章对象和类
一个对象是类的一个实例。可以从一个类中创建多个实例,创建实例的过程称为实例化。
构造方法是为了完成初始化动作。(构造方法是在使用new操作符创建对象的时候被调用)
构造方法必须具备和所在类相同的名字
构造方法没有返回值类型 不能使用void
构造方法是在创建对象时New创建出来的
构造方法可以重载(可以使用相同的名字,但是必须是有不一样的签名。形参个数可以不一样)
可以把多个类放在同一个文件中,但是文件中只能有一个类是公共(public)类,公共类必须与文件名同名。只是当编译运行的时候会产生多个文件类。
没有声明引用的对象如Person p = new Person()中若直接new Person()这就是匿名对象。引用变量的赋值,即p1 = p2这个仅仅是将p2的引用赋值给p1,p1指向p2的引用内容,自己的内容若不再使用,则会当成垃圾,虚拟机会自动处理。
静态变量被类中的所有对象所共享。静态方法不能访问类中的实例成员。实例变量就是class类中如Person p 中有某个变量age,则称age为实例变量,实例变量是绑定到类的某个特定的实例的,它是不能被同一个类的不同的对象所共享的。
若想让一个类的所有实例共享数据,就要使用静态变量。也称为类变量。静态变量和静态方法是存储到一个静态的存储区的,是一个公共的地址,若某个对象改变了静态变量则所有引用静态变量的对象都会受到影响。静态变量和静态方法只需要在类前面加上static即可以。若是常量,即不能修改的需要前面加上final即可以。
静态方法和实例方法的区别
静态方法可以调用静态的变量和方法,但是不能调用实例方法和实例变量,原因是静态方法是公共的,它不属于某个成员
实例方法可以调用实例变量和实例方法,也可以调用变量方法。
Private修饰符限定方法只能是在自己的类中可以被访问。private只能应用在类的成员上面,public可以应用在public和private上面,在局部上面使用private 和public使用都是错误的。为了避免数据域被直接修改,可以定义private来修饰,这称为数据封装
Protected:允许子类访问,但是不允许子类以外的内容访问。在同一包内可以访问。
第二章面向对象思考
类的关系:关联 聚合 组合 继承
关联:学生student 教师teacher 课程course就是一种关联关系,学生选课,教师教课
组合:学生student 一个学生有一个姓名name,一个学生有一个家庭住址address,但是家庭住址可以被多个学生所共享,称为聚合
类的无参构造方法默认创建了一个默认容量为16的无参构造方法
StringBuilder 和 StringBuffer中可以添加,插入或者追加新内容,但是String一旦创建内容就不再改变,只能使用引用来进行读取。它们两个的区别是StringBuffer是修改缓冲区是同步的,就是说多线程访问修改是同步的。单线程使用StringBuilder 会更加高效。
第三章继承和多态
面向对象的三大支柱:封装 继承 多态
继承特点:
子类并不是父类的一个子集,实际上它比父类包含更多的信息和方法,可以继承父类的数据域和方法。
父类的私有数据域在该类之外是不能访问的(private),之能通过get和set方法是使用(访问器和修改器)
继承是用来为“is a”关系建模的,不能仅仅是为了重用父类的方法而继承父类
不能使用多重继承,java里是单一继承自一个父类。
Super关键字是用来调用父类的构造方法和父类的方法。子类可以继承父类中所有的可以访问的数据域和方法,但是不能继承父类的构造方法,只能通过关键字super从子类的构造方法中来访问,且必须是构造方法的第一条语句。若不显示的调用,则编译器会默认的将Super()作为构造方法的第一条语句,父类若上面还有,他也会继续调用super()调用自己的父类。
方法重写:子类需要修改父类中定义的方法,需要使用super.方法名 来进行调用父类的相同的方法名。(必须使用相同的签名和相同的返回值类型在子类中重新定义)与实例方法一样,静态方法也能被继承,但是静态方法不能被覆盖。如果父类的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏,只能通过类名.方法名进行调用。、
方法重载:
重写和重载的区别:
方法重写发生在通过继承而相关的不同类中;方法重载可以发生在同一个类中,也可以发生在由于继承关系而相关的类中。
方法重写@Override有相同的签名和返回值类型,方法重载有相同的名字,不同的参数列表。
多态:使用父类对象的地方都可以使用子类的对象,就是父类型变量可以引用子类型的对象。
第四章异常处理
可以声明异常或者捕获异常
第五章多线程
多线程:在一个程序中允许同时执行多个任务,一个任务类必须实现Runnable接口,任务从线程开始运行。
多线程一般是先创建任务,之后确定让那个任务执行即先实现Runnable接口,之后定义Thread线程,重写里面的run方法run方法指明如何完成这个任务,java虚拟机会自动之行该方法,执行Start()方法。
由于Thread类实现了Runnable,只需要定义一个Thread的扩展类,并且实现run方法即可。需要1.继承 extends thread 2.实现 implement Runnable
Yield()方法为其他线程临时让出CPU时间
Sleep()方法可以设置休眠时间
Join()方法使一个线程等待另一个线程结束
Priority()方法会设置优先级。