黑马程序员java基础篇----面向对象总结(下)

android培训java培训期待与您交流

一、static和final

(一)static

1、一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。static的变量是在类装载的时候就会被初始化。
2、有关静态变量或方法的一些要点如下:
 (1)、一个类的静态方法只能访问静态属性。
 (2)、一个类的静态方法不能够直接调用非静态方法。
 (3)、如访问控制权限允许,static属性和方法可以使用对象名加‘.’方式调用;当然也可以使用实例加‘.’方式调用。
 (4)、静态方法中不存在当前对象,因而不能使用“this”,当然也不能使用”super”。
 (5)、静态方法不能被非静态方法覆盖。
 (6)、构造方法不允许声明为static的。
3、静态初始器仅仅在类装载的时候(第一次使用类的时候)执行一次,静态初始器往往用来初始化静态的类属性。
4、静态引用使我们可以象调用本地方法一样调用一个引入的方法,当我们需要引入同一个类的多个方法时,只需写为 “import static java.lang.Math.*”即可,这样的引用方式对于枚举也同样有效。

(一)final
1、final的规则如下:
 (1)、final标记的类不能被继承。
 (2)、final标记的方法不能被子类重写。
 (3)、final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
 (4)、final标记的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能 在构造方法中显式赋值,然后才能使用。
 (5)、final标记的局部变量可以只声明不赋值,然后再进行一次性的赋值。
 (6)、final 一般用于标记那些通用性的功能、实现方式或取值不能随意被改变的成分,以避免被误用。
2、如果将引用类型(即,任何类的类型)的变量标记为final,那么该变量不能指向任何其它对象,但可以改变对象的内容,因为只有引用本身是final的。
3、被声明为final 的方法有时被用于优化,编译器能产生直接对方法调用的代码,而不是通常的涉及运行时查找的虚拟方法 调用。被标记为static或private的方法被自动地final,因为动态联编在上述两种情况下都不能应用。
4、final修饰符可用于创建不可变类,不可变类规则如下:
 (1)、使用private和final来修饰类的属性。
 (2)、提供带参数的构造器,通过传入参数来初始化类的属性。
 (3)、仅为该类的属性提供getter方法,而不提供setter方法,因为对于final属性完成初始化以后不能改变。
 (4)、如果必要,重写Object类中hashCode和equals方法,并保证两者结果一致性。
在这里定义一个不可变类的模板:

	public class UnmodifiableClass {
		private final int intV ;
		private final String strV ;
		public UnmodifiableClass(int intV, String strV) {
			super();
			this.intV = intV;
			this.strV = strV;
		}
		public int getIntV() {
			return intV;
		}
		public String getStrV() {
			return strV;
		}
		@Override
		public int hashCode() {
			return new Integer(intV).hashCode()+strV.hashCode();
		}
		@Override
		public boolean equals(Object obj) {
			if(obj instanceof UnmodifiableClass){
				UnmodifiableClass tem = (UnmodifiableClass)obj;
				return this.intV==tem.intV&&this.strV.equals(tem.strV);
			}
			return false;
		}	
	}

二、抽象和接口

(一)抽象类与抽象方法
1、抽象类与抽象方法即为用abstract修饰符所修饰的类与方法。
2、抽象类与抽象方法的规则如下
 (1)、抽象方法不可以有方法体。
 (2)、抽象类不可以被实例化,即无法用new关键字调用抽象类的构造器来创建对象,即使抽象类中不包含抽象方法。
 (3)、抽象类可以包含属性、方法(普通方法与抽象方法)、构造器、初始化块、内部类、枚举,与普通实现类无异,但是抽象类的构造器不能用于创建实例,只能用来被子类调用。
 (4)、抽象类的子类要成为实现类必须实现父类中所有的抽象方法,否则仍然是个抽象类。
3、利用抽象类与抽象方法可以更好地发挥多态的优势,它体现的是一种模板模式的设计。
4、static、final、private不可以与abstract同时使用。

(二)接口
1、实现类是一种具体实现体,抽象类是一种模板,可以认为是系统实现过程中的中间产品,而接口定义了一种规范,属于更 彻底的抽象。对于接口的实现者,接口规定了实现者能够并且必须向外提供的服务,对于调用者,接口规定了调用者可以调用哪些服务以及如何调用。所以,当在一个程序中使用接口时,接口是多个模块间的耦合标准,当在多个应用程序之间 使用接口时,接口是多个程序之间的通信标准。
2、接口可以降低程序耦合性,提高扩展性,减少维护成本。
3、接口成员定义规则如下:
 (1)、接口里只能包含抽象方法、只能定义静态常量属性、不包含构造器。
 (2)、定义属性时,默认的修饰符为public static final,所以在属性声明的时候要直接初始化。
 (3)、定义方法时默认的修饰符为public abstract。
 (4)、定义的内部类与枚举类默认使用的修饰符为public static。
4、接口支持多继承,且支持多实现。
5、与接口相关的两个设计模式:简单工厂模式与命令模式。

三、内部类

1、内部类特点;
 (1)、内部类可以体现逻辑上的从属关系,同时对于其他类可以控制内部类对外不可见等。
 (2)、外部类的成员变量作用域是整个外部类,包括内部类,但外部类不能访问内部类的private成员。
 (3)、逻辑上相关的类可以在一起,可以有效的实现信息隐藏。
 (4)、内部类可以直接访问外部类的成员。可以用此实现多继承!
 (5)、编译后,内部类也被编译为单独的类,不过名称为outclass$inclass的形式。
2、内部类按照使用上可以分为四种情形:
 (1)、类级:成员式,有static修饰
      static内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可直接创建。
 (2)、对象级:成员式,无static修饰 内部类的对象以属性的方式记录其所依赖的外层类对象的引用,因而可以找到该外层类对象并访问其成员。该属性是系统自动为非static 的内部类添加的,名称约定为“外层类名.this”。在其它场合则必须先获得外部类的对象,再由外部类对象加“.new”操作符调用内部类的构造方法创建内部类的对象,此时依赖关系的双方也可以明确。此类型内部类有一个应用,可以用于仿闭包与回调。
 (3)、本地内部类:局部式
      本地类是定义在代码块中的类。
 (4)、匿名级:局部式
      匿名内部类是本地内部类的一种特殊形式,也就是没有变量名指向这个类实例,而且具体的类实现会写在 这个内部类里面
3、成员式内部类的基本规则:
 (1)、可以有各种修饰符,可以用4 种权限、static、final、abstract 定义(这点和普通的类是不同的)。
 (2)、若有static限定,就为类级,否则为对象级。类级可以通过外部类直接访问;对象级需要先生成外部的对象后 才能访问。
 (3)、内外部类不能同名。
 (4)、非静态内部类中不能声明任何static成员。
 (5)、内部类可以互相调用。
4、本地内部类的基本规则:
 (1)、仅在定义了它们的代码块中是可见的。
 (2)、可以使用定义它们的代码块中的任何本地final变量。
 (3)、本地类不可以是static的,里边也不能定义static成员。
 (4)、本地类不可以用public、private、protected修饰,只能使用缺省的。
 (5)、本地类可以是abstract的。
5、匿名类的基本规则:
 (1)、匿名类没有构造方法。
 (2)、匿名类不能定义静态的成员。
 (3)、匿名类不能用4 种权限、static、final、abstract修饰。
 (4)、只可以创建一个匿名类实例。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值