黑马程序员----java之面向对象(下)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


基本数据类型的包装类
java中的基本数据类型是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类型称为包装类。
在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一直,只是类名的第一个字母大写即可。
对于包装类说,这些类的用途主要包含两种:
                  a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
                   b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

==和equals
==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同.
基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true).
一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同。

单例类
我们把类的构造器定义成public访问权限,允许任何类自由创建该类的对象,但某些时候,允许其他类自由创建该类的对象没有任何意义,还可能造成系统性能下降。如果一个类始终只能创建一个实例,则这个类被称为单例类。

java中23种设计模式:
单例设计模式:解决一个类在内存只存在一个对象。
想要保证对象唯一。
1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象
2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

这三部怎么用代码体现呢?
1,将构造函数私有化。
2,在类中创建一个本类对象。
3,提供一个方法可以获取到该对象。

这个是先初始化对象。
称为:饿汉式。

Single类一进内存,就已经创建好了对象。
class Single
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}

对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}


final : 最终。作为一个修饰符,
1,可以修饰类,函数,变量。
2,被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
3,被final修饰的方法不可以被复写。
4,被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,有可以修饰局部变量。
当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。
而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。
单词间通过_连接。
5,内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。


final修饰基本类型和引用类型变量的区别
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。但对于引用类型的变量而言,它保持的仅仅是一个引用,final之保证这个引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

抽象类
抽象类的作用:抽象类不能创建实例,它只能当成父类来被继承。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性。


抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

abstract 关键字,和哪些关键字不能共存。
final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。
而抽象方法出现的就是需要被复写。
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。
可是抽象方法运行没意义。

内部类
把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类。
内部类的作用:
内部类提供了更好的封装,可以把内部类隐藏在外边类之内,不允许同一个包中的其他类访问该类。
内部类成员可以直接访问外部类的私有数据,但外部类不能访问内部类的实现细节。


非静态内部类
非静态内部类的成员可以访问外部类的private成员,如果外部类需要访问非静态内部类的成员,则必须显式创建非静态内部类对象来调用访问其实例成员。

根据静态成员不能访问非静态成员的规则,外部类的静态方法,静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例等。总之,不允许在外部类的静态成员中直接使用非静态内部类。

java不允许在非静态内部类里定义静态成员。

非静态内部类的构造器必须通过其外部类对象来调用。//Out.In in=new Out.new In("abc");

静态内部类
根据静态成员不能访问非静态成员的规则,所以静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类的对象作为调用者来访问静态内部类的实例成员。

匿名内部类
匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。
匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。因此不运行将匿名内部类定义成抽象类。
匿名内部类不能定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,通过实例初始化块来完成构造器需要完成的事情。
如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量,否则系统将报错。


对象与垃圾回收
垃圾回收机制的特征:
垃圾回收机制只负责回收堆内存中内存,不会回收任何物理资源。
程序无法精确控制垃圾回收的运行,垃圾回收会在合适时候进行。
垃圾回收机制回收任何对象之前,总会先调用它的finalize方法,该方法可能是该对象重新复活,从而导致垃圾回收机制取消回收。

强制系统垃圾回收的两个方法:
调用System类的gc()静态方法:System.gc()
调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc()

finalize方法:
当垃圾回收机制回收某个对象所占用的内存之前,通常要求程序调用适当的方法来清理资源,在没有明确指定资源清理的情况下,java提供了默认机制来清理该对象的资源。
特点:
永远不要主动调用某个对象的finalize方法,该方法应交给垃圾回收机制调用。
finalize方法何时被调用,是否被调用具有不确定性。
当jvm执行去活对象的finalize方法时,可能使该对象或系统中其他对象重新变成激活状态。
当jvm执行finalize方法时出现了异常,垃圾回收机制不会报异常,程序继续执行。


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值