面向对象

面向对象

概述
	面向对象是相对于面向过程来讲的,
	指的是把相关的数据和方法组织为一个整体来看待,
	从更高的层次来进行系统建模,更贴近事物的自然运行模式。


面向过程到面向对象思想层面的转变: 
	面向过程关注的是执行的过程,面向对象关注的是具备功能的对象。
	面向过程到面向对象,是程序员思想上 从执行者到指挥者的转变。

三大思想

面向对象思想从概念上讲分为以下三种:OOA、OOD、OOP 
	OOA:面向对象分析(Object Oriented Analysis) 
	OOD:面向对象设计(Object Oriented Design) 
	OOP:面向对象程序(Object Oriented Programming

三大特征

封装性:所有的内容对外部不可见 
继承性:将其他的功能继承下来继续发展 
多态性:方法的重载本身就是一个多态性的体现

类与对象

类必须通过对象才可以使用,
对象的所有操作都在类中定义, 
类由属性和方法组成。

定义格式

类的定义格式
	class 类名称{ 
		成员属性 
		成员方法 
	}
	
属性定义格式
	数据类型 属性名;
  
属性定义并赋值的格式: 
	数据类型 属性名 = 初始化值;
	
方法定义格式
	权限修饰符 返回值类型 方法名(形式参数列表){
		//方法体 
		return 返回值; 
	}

对象的创建与使用

一个类要想真正的进行操作,则必须依靠对象,对象的定义格式如下: 
	类名称 对象名称 = new 类名称() ; 
如果要想访问类中的属性或方法(方法的定义),则可以依靠以下的语法形式: 
	访问类中的属性: 对象.属性 ; 
	调用类中的方法: 对象.方法(实际参数列表) ;

构造方法

作用:用于对象初始化。 
执行时机: 在创建对象时,自动调用 
特点:
	所有的Java类中都会至少存在一个构造方法
	如果一个类中没有明确的编写构造方法, 
	则编译器会自动生成一个无参的构造方法, 构造方法中没有任何的代码! 
	
如果自行编写了任意一个构造器, 则编译器不会再自动生成无参的构造方法。

定义的格式: 
	与普通方法基本相同, 区别在于: 方法名称必须与类名相同, 没有返回值类型的声明 !
构造方法设计
	建议自定义无参构造方法,不要对编译器形成依赖,避免错误发生。 
	当类中有非常量成员变量时,建议提供两个版本的构造方法,一个是无参构造方法,一个是全属性做参数的构造方法。 
	当类中所有成员变量都是常量或者没有成员变量时,建议不提供任何版本的构造。

方法的重载

方法名称相同, 参数类型或参数长度不同, 可以完成方法的重载 ! 方法的重载与返回值无关! 
方法的重载 ,可以让我们在不同的需求下, 通过传递不同的参数调用方法来完成具体的功能。

构造方法的重载

一个类, 可以存在多个构造方法 : 
参数列表的长度或类型不同即可完成构造方法的重载 ~ 
构造方法的重载 ,可以让我们在不同的创建对象的需求下, 调用不同的方法来完成对象的初始化!

匿名对象

没有对象名称的对象就是匿名对象。
匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被G·C回收。 
只使用一次的对象可以通过匿名对象的方式完成,这一点在以后的开发中将经常使用到。

封装 private

在开发中, 为了避免出现逻辑错误, 我们建议对所有属性进行封装,
并为其提供setter及getter方法进行设置和取得 操作。

this

在Java基础中,this关键字是一个最重要的概念。
使用this关键字可以完成以下的操作: 
	调用类中的属性 
	调用类中的方法或构造方法 
	表示当前对象

static

概述
	static表示“静态”的意思,可以用来修饰成员变量和成员方法(后续还会学习 静态代码块 和 静态内部类)。
	 static的主要作用在于创建独立于具体对象的域变量或者方法 
	 	简单理解: 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,
	 		只要类被加载了,就可以通过类名去进行访 问。 
	 	并且不会因为对象的多次创建 而在内存中建立多份数据
重点:
	静态成员 在类加载时加载并初始化。 
	无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 ) 
	在访问时: 静态不能访问非静态 , 非静态可以访问静态 !

代码块

普通代码块 
	在执行的流程中 出现的 代码块, 我们称其为普通代码块。 
构造代码块 
	在类中的成员代码块, 我们称其为构造代码块, 在每次对象创建时执行, 执行在构造方法之前。 
静态代码块 
	在类中使用static修饰的成员代码块, 我们称其为静态代码块, 在类加载时执行。 每次程序启动到关闭 ,只会 执行一次的代码块。 
同步代码块 
	在后续多线程技术中学习。

权限修饰符

修饰符子类其他包
public
protected×
default××
private×××

继承

格式
	class 父类 {
	}
	class 子类 extends 父类{
	}
	
super
	调用super构造方法的代码 必须写在子类构造方法的第一行
	通过super,可以访问父类构造方法
	通过super,可以访问父类的属性
	通过super,可以访问父类的方法

重写

重写规则:
	参数列表必须完全与被重写方法的相同
	返回类型必须完全与被重写方法的返回类型相同
	访问权限不能比父类中被重写的方法的访问权限更低
	父类的成员方法只能被他的子类重写
	声明为static和private的方法不能被重写,但是能够被再次声明

final

final用于修饰属性、变量;
	变量称为了常量、无法再次赋值
	final修饰的局部变量,只能赋值一次(可以先声明后赋值)
	final修饰的是成员属性,必须在声明时赋值
	举例:
	1.
	final 变量类型 变量名 = 常数;
	2.
	final 变量类型 变量名;
	变量名 = 常数;
	
	全局常量(public static final)
	常量命名规范:
		由1个或多个单词组成,单词与单词之间必须舒勇下划线分隔开。单词所有字母大写
		例如:SQL_INSERT

final用于修饰类
	final修饰的类,不可以被继承。
final用于修饰方法
	final修饰的方法,不能被子类重写。

抽象

抽象类
	抽象类必须使用abstract class声明
	一个抽象类中可以没有抽象方法。抽象方法必须写在抽象类或者接口中。 
	格式:
	abstract class 类名{ // 抽象类 
	}
抽象方法
	只声明而未实现的方法称为抽象方法(未实现指的是:没有“{}”方法体),
	抽象方法必须使用abstract关键字声明。 
	格式:
	abstract class 类名{ // 抽象类
		public abstract void 方法名() ; // 抽象方法,只声明而未实现 
	}
	
在抽象类的使用中有几个原则:
	抽象类本身是不能直接进行实例化操作的,即:不能直接使用关键字new完成。
	一个抽象类必须被子类所继承,被继承的子类(如果不是抽象类)则必须覆写(重写)抽象类中的全部抽象方法。
	
常见问题
	1、 抽象类能否使用final声明? 
		不能,因为final属修饰的类是不能有子类的 , 而抽象类必须有子类才有意义,所以不能。
	2、 抽象类能否有构造方法? 
		能有构造方法,而且子类对象实例化的时候的流程与普通类的继承是一样的,
		都是要先调用父类中的构造方法(默 认是无参的),之后再调用子类自己的构造方法
		
抽象类和普通类的区别
	1、抽象类必须用public或protected修饰(如果为private修饰,那么子类则无法继承,也就无法实现其抽象方法)。 默认缺省为 public 
	2、抽象类不可以使用new关键字创建对象, 但是在子类创建对象时, 抽象父类也会被JVM实例化。 
	3、如果一个子类继承抽象类,那么必须实现其所有的抽象方法。如果有未实现的抽象方法,那么子类也必须定义为 abstract类

接口

定义
	如果一个类中的全部方法都是抽象方法,全部属性都是全局常量,
	那么此时就可以将这个类定义成一个接口。 
定义格式: 
	interface 接口名称{ 
		全局常量 ; 
		抽象方法 ; 
	}
	
面向接口编程思想
	这种思想是接口是定义(规范,约束)与实现(名实分离的原则)的分离。 
	优点:
		1、 降低程序的耦合性 
		2、 易于程序的扩展 
		3、 有利于程序的维护
		
全局常量和抽象方法的简写
	因为接口本身都是由全局常量和抽象方法组成 , 所以接口中的成员定义可以简写: 
	1、全局常量编写时, 可以省略public static final 关键字,
		例如: 
			public static final String INFO = "内容" ; 
		简写后: 
			String INFO = "内容" ; 
	2、抽象方法编写时, 可以省略 public abstract 关键字, 
		例如: 
			public abstract void print() ; 
		简写后: 
			void print() ;
接口的实现 implements
	接口可以多实现: 
		格式:
			class 子类 implements 父接口1,父接口2...{ 
			} 
	以上的代码称为接口的实现。那么如果一个类即要实现接口,
	又要继承抽象类的话,则按照以下的格式编写即可:
		class 子类 extends 父类 implements 父接口1,父接口2...{ 
		}
接口的继承
	接口因为都是抽象部分, 不存在具体的实现, 所以允许多继承,
	例如: 
		interface C extends A,B{ 
		}
		
	如果一个接口要想使用,必须依靠子类。 子类(如果不是抽象类的话)要实现接口中的所有抽象方法。
		
接口和抽象类的区别
	1、抽象类要被子类继承,接口要被类实现。
	2、接口只能声明抽象方法,抽象类中可以声明抽象方法,也可以写非抽象方法。 
	3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。 
	4、抽象类使用继承来使用, 无法多继承。 接口使用实现来使用, 可以多实现 
	5、抽象类中可以包含static方法 ,但是接口中不允许(静态方法不能被子类重写,因此接口中不能声明静态方法) 
	6、接口不能有构造方法,但是抽象类可以有

多态

多态
	是对象的多种表现形式
	对象的多态性,从概念上非常好理解,
	在类中有子类和父类之分,子类就是父类的一种形态 ,对象多态性就从此而来。
	方法的重载 和 重写 也是多态的一种, 
	不过是方法的多态(相同方法名的多种形态)。
	重载: 一个类中方法的多态性体现 
	重写: 子父类中方法的多态性体现。

多态的使用:对象的类型转换
	类似于基本数据类型的转换: 
		向上转型:将子类实例变为父类实例
		格式:
			父类 父类对象 = 子类实例 ; 
		向下转型:将父类实例变为子类实例
		格式:
			子类 子类对象 = (子类)父类实例 ;

instanceof

判断某个对象是否是指定类的实例,则可以使用instanceof关键字 
格式:
实例化对象 instanceof 类 //此操作返回boolean类型的数据

Object类

概念
	Object类是所有类的父类(基类),
	如果一个类没有明确的继承某一个具体的类,则将默认继承Object类。 
	例如我们定义一个类: 
		ublic class Person{ 
		}
	其实它被使用时 是这样的: 
		ublic class Person extends Object{ 
		}
		
Object的多态
	使用Object可以接收任意的引用数据类型

toString

建议重写Object中的toString方法。 
此方法的作用:返回对象的字符串表示形式。
Object的toString方法, 返回对象的内存地址

equals

议重写Object中的equals(Object obj)方法,
此方法的作用:指示某个其他对象是否“等于”此对象。
object的equals方法:实现了对象上最具区别的可能等价关系; 
就是说,对于任何非空引用值x和y ,
当且仅当 x和y引用同一对象( x == y具有值true )时,此方法返回true 。 

equals方法重写时的五个特性: 
	反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。 
	称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true 。 
	递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true ,
		  x.equals(z)应该返回true 。 
	致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,
		 是未修改对象 上的equals比较中使用的信息。 
	空性 :对于任何非空的参考值x , x.equals(null)应该返回false 。

内部类

定义
	在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。 
	广泛意义上的内部类一般来说包括这四种: 
		1、成员内部类 
		2、局部内部类 
		3、匿名内部类 
		4、静态内部类

成员内部类

	成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式: 
	class Outer { 
		private double x = 0; 
		public Outer(double x) { 
			this.x = x; 
		}
		
		class Inner { //内部类 
			public void say() { 
				System.out.println("x="+x); 
			} 
		} 
	}
	特点: 
		成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。 
		不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问 的是成员内部类的成员。
		如果要访问外部类的同名成员,需要以下面的形式进行访问: 
			外部类.this.成员变量 
			外部类.this.成员方法
		
	外部使用成员内部类 
		Outter outter = new Outter(); 
		Outter.Inner inner = outter.new Inner();

局部内部类

匿名内部类

	匿名内部类由于没有名字,所以它的创建方式有点儿奇怪。
	创建格式如下: 
		new 父类构造器(参数列表)|实现接口() {
			//匿名内部类的类体部分 
		}

	注意事项
		1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,
		   但是两者不可兼得,同时也只能继承一个类或 者实现一个接口。 
		2、匿名内部类中是不能定义构造函数的。 
		3、匿名内部类中不能存在任何的静态成员变量和静态方法。 
		4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。 
		5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。 
		6、只能访问final型的局部变量

静态内部类

	静态内部类也是定义在另一个类里面的类,
	只不过在类的前面多了一个关键字static。
	
	静态内部类是不需要依赖于外部类对象的,这点和类的静态成员属性有点类似,
	并且它不能使用外部类的非static成员 变量或者方法.

包装类

概述
	在Java中有一个设计的原则“一切皆对象”,
	那么这样一来Java中的一些基本的数据类型,就完全不符合于这种设计思想,
	因为Java中的八种基本数据类型并不是引用数据类型,
	所以Java中为了解决这样的问题,引入了八种基本数据类型的包装类。
	基本数据类型
		int		char			float		double
	包装类
		Integer		Character			Float		Double
	基本数据类型
		boolean		byte			short		long
	包装类
		Boolean		Byte			Short		Long
	以上的八种包装类,可以将基本数据类型按照类的形式进行操作。 
	但是,以上的八种包装类也是分为两种大的类型的: 
		Number:Integer、Short、Long、Double、Float、Byte
		都是Number的子类表示是一个数字。 
		Object:Character、Boolean
		都是Object的直接子类。

装箱和拆箱操作
	将一个基本数据类型变为包装类,那么这样的操作称为装箱操作。 
	将一个包装类变为一个基本数据类型,这样的操作称为拆箱操作,

字符串转换
	使用包装类还有一个很优秀的地方在于:
		可以将一个字符串变为指定的基本数据类型,
		此点一般在接收输入数据上使用 较多。

可变参数

一个方法中定义完了参数,则在调用的时候必须传入与其一一对应的参数,
但是在JDK 1.5之后提供了新的功能,可以根 据需要自动传入任意个数的参数。

语法: 
	返回值类型 方法名称(数据类型…参数名称){
		//参数在方法内部 , 以数组的形式来接收 
	} 

注意: 
	可变参数只能出现在参数列表的最后。

递归

递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。
也就是说,递归算法是一种直接或者间接调用自身方 法的算法。

异常

概论
	异常是在程序中导致程序中断运行的一种指令流。
处理异常
	如果要想对异常进行处理,则必须采用标准的处理格式,
	处理格式语法如下: 
	try{
		// 有可能发生异常的代码段 
	}catch(异常类型1 对象名1){
	 	// 异常的处理操作 
	}catch(异常类型2 对象名2){
		// 异常的处理操作 
	} ... 
	finally{
	 	// 异常的统一出口 
	 }
try+catch的处理流程
	1、 一旦产生异常,则系统会自动产生一个异常类的实例化对象。 
	2、 那么,此时如果异常发生在try语句,则会自动找到匹配的catch语句执行,
		如果没有在try语句中,则会将异 常抛出. 
	3、 所有的catch根据方法的参数匹配异常类的实例化对象,
		如果匹配成功,则表示由此catch进行处理。
finally
	在进行异常的处理之后,在异常的处理格式中还有一个finally语句,
	那么此语句将作为异常的统一出口,不管是否产生 了异常,最终都要执行此段代码。
异常体系结构
	异常指的是Exception , Exception类, 
	在Java中存在一个父类Throwable(可能的抛出) Throwable存在两个子类:
	1.Error:表示的是错误,是JVM发出的错误操作,只能尽量避免,无法用代码处理。 
	2.Exception:一般表示所有程序中的错误,所以一般在程序中将进行try…catch的处理。
	
	多异常捕获的注意点: 
	1、 捕获更粗的异常不能放在捕获更细的异常之前。 
	2、 如果为了方便,则可以将所有的异常都使用Exception进行捕获。
	特殊的多异常捕获写法: 
	catch(异常类型1 |异常类型2 对象名){
		//表示此块用于处理异常类型1 和 异常类型2 的异常信息 
	}
throws关键字
	在程序中异常的基本处理已经掌握了,但是随异常一起的还有一个称为throws关键字,
	此关键字主要在方法的声明上使 用,表示方法中不处理异常,而交给调用处处理。 
	格式:
		返回值 方法名称()throws Exception{ 
		}
throw关键字
	throw关键字表示在程序中人为的抛出一个异常,因为从异常处理机制来看,
	所有的异常一旦产生之后,实际上抛出 的就是一个异常类的实例化对象,
	那么此对象也可以由throw直接抛出。
	代码: 
		throw new Exception("抛着玩的。") ;
RuntimeExcepion与Exception的区别
	为NumberFormatException并不是Exception的直接子类,而是RuntimeException的子类,
	只要是 RuntimeException的子类,则表示程序在操作的时候可以不必使用try…catch进行处理,
	如果有异常发生,则由JVM进 行处理。当然,也可以通过try catch处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值