面向对象(上)笔记

一、创建类:

[修饰符] class 类名{
	零个到多个构造器定义. .
	零个到多个成员变量.. .
	零个到多个方法. . 
}
其中修饰符可以是 public \ final \ abstract
从可读性方面看Java类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符
类里各成员之间的定义顺序没有任何影响,各成员之间可以相互调用, static 饰的成员不能访问没有 static 修饰的成员
一个类没有构造器,这个类通常无法创建实例。
如果没有为个类编写构造器,则系统会为该类提供个默认的构造器。一旦为个类编写了构造器,系统将不再为该类提供构造器
1.定义成员变量的语法格式如下:
	[修饰符] 类型 成员变量名[=默认值];
	修饰符可以省略,也可以是 public protected private static 、自final,其中 public protected private 个最多只能出现其中之一 可以与 static final 组合起来修饰成员变量
2.定义方法的语法格式如下:
	[修饰符] 方法返回值类型 方法名(形参列表)
	{
		由零条到多条可执行性语句组成的方法体;
	}
	修饰符可省略,也可以是 public protected private static final abstract ,其中 public protected private 三个最多只能出现其中之一; final abstract 最多只能出现其中之一 ,它们可以与 static 组合起来修饰方法
	如果指定了返回值类型,则方法体中必须包含一个有效的 return 语句,如果没有返回值,必须用 void 声明
	static 是个特殊的关键字,可用于修饰方法、成员变量。 static 修饰的成员表明它属于这个类本身,而不属于该类的单个实例,称为类变量、类方法。反之,不使用 static 修饰的方法、成员变量属于该类的单个实例,而不属于该类,称为实例变量、实例方法
	也可把 static 修饰的成员变量和方法称为静态变和静态方法,把不使用 static 修饰的成员变量和方法称为非静态变量和非静态方法
3.定义构造器:
	[修饰符] 构造器名(形参列表)
	{
		由零条到多条可执行性语句组成的构造器执行体;
	}
	修饰符可以省略,也可以是 public protected private 其中之一
	构造器名必须和类名相同
	构造器既不能定义返回值类型,也不能使用 void 声明构造器没有返回值,不然构造器就会被程序当成一个普通的方法

二、对象的产生和使用:

创建对象:(假设已有Person类)
	Person p = new Person();
访问类或实例对象的变量和方法:
	类.类变量|类方法,或者实例.实例变量|方法
java里的引用就是C里面的指针的封装

三、方法:

方法在逻辑上要么属于类,要么属于对象,不能独立存在
一个类中的方法相互调用还是使用 this 或者类来作为调用者
没有 static 饰的方法只能使用对象作为调用者来调用
参数个数可变的方法:
	在最后一个形参的类型后增加三点(...)则表明该形参可以接受多个参数值,多参数值被当成数组传入
	个数可变的形参只能处于形参列表的最后,一个方法中最多只能包含一个个数可变的形参。同时因其本质是一个数组型参数,所以该个数可变的参数也可以传入一个数组
方法的重载:
	如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载
	参数个数可变的方法需注意

四、成员变量和局部变量:

成员变量:实例变量(不以 static 修饰),类变量(以 static 修饰)
局部变量:
	形参(方法签名中定义的变量)(整个方法内有效)
	方法局部变量(在方法内定义)(定义的地方到方法结束有效)
	代码块局部变量(在代码块内定义)(定义的地方到代码块结束)
1.只要类|实例存在,程序就可以访问类|实例变量:
	类.类变量,实例.实例变量
通过实例可以访问类变量,如通过实例对类变量进行修改,则与通过该类来修改的结果完全一样
局部变量和成员变量可以同名,但在方法里同名的局部变量会覆盖成员变量
如果需要在这个方法里引用被覆盖的成员变量,则可使用this (对于实例变量)或类名(对于类)作为调用者来限定访问成员变量。

五、封装:

将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问
目的:
	隐藏类的实现细节
	让使用者只能通过事先预定 的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问。
	可进行数据检查,从而有利于保证对象信息的完整性。
	便于修改,提高代码的可维护性
	为了实现良好的封装, 需要从两个方面考虑
	将对象的成员变 和实现细节隐藏起来,不允许外部直接访问
	把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作
访问控制符:
	三个访问控制符 private 、 protected 、 public
	访问控制级别由小到大 private 、 default 、 protected 、 public
	private (当前类访问权限)只能在当前类的内部被访问,适用于修饰成员变量
	把成员变量隐藏在该类的内部(用setter和getter方法来完成对成员变量的操作)
	default (包访问权限)类中的成员变量、方法或构造器可以被同包的其他类访问
	protected  (子类访问权限)可以被不同包的子类访问,适用于希望其他子类来重写这个方法
	public (公共访问权限)全局范围均可访问
	如果Java源文件里定义的所有类都没有使用 public 修饰,则这个Java源文件的文件名可以是一切合法的文件名;但如果Java源文件里定义了 public 修饰的类,则这个源文件的文件名必须与 public 修饰的类的类名相同
package 、 import 和 import static:
	package 包
	要访问其他包的类时,需要用包名.类名,或者导入包:import 包名(出现在package语句之后,类定义之前)
	父包中的类需用子包中的类,则必须使用子包的全名,而不能省略父包部分
	使用import导入单个类:
		import package.subpackage...ClassName;
	使用import导入指定包下全部类:
		import package.subpackage...*;
	
	静态导入:
		import static 语句(出现在package语句之后,类定义之前)
		它用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法
		import static package.subpackage...ClassName.fieldName|methodName;
		import static package.subpackage...ClassName.*;


	import 和 import static import 可以省略包名 import static 则可以连类名都省略
Java 源文件的大体结构如下:
	//0个或一个,必须放在文件开始
	package 语句
	//0个或多个,必须放在所有类定义之前
	import | import static 语句
	//0个或1个public类、接口或枚举定义
	public classDefinition | interfaceDefinition | enumDefinition
	//0个或多个普通类、接口或枚举定义
	classDefinition | interfaceDefinition | enumDefinition

六、构造器:

使用构造器执行初始化
构造器重载:
	一个类里具有多个构造器,多个构造器的形参列表不同 ,即被称为构造器重载。构造器重载允许java 类里包含多个初始化逻辑,从而允许使用不同的构造器来初始化 Java 对象
	即根据需要初始化不同数量的变量,未在构造器初始化的变量按原有规则进行初始化
	一个构造器可以使用this调用另一个构造器(必须在该构造器语句的第一行):
		this(需要被初始化的参数列表)

七、类的继承:

继承特点:
	使用 extends 关键字实现
	修饰符 class SubClass extends SuperClass
	{
		//类定义部分;
	}
	子类不能获得父类的构造器
	子类获得父类的全部成员变量和方法
	一个类只能有一个直接父类
	未指定父类则默认扩展java.lang.Object类
	创建子类时也会为父类分配空间
重写父类的方法:
	在子类中重新定义一个方法名相同、形参列表相同的方法
	要求:
		子类的返回值类型需要比父类的小或者相等,声明抛出异常应比父类的更小或相等,访问权限应比父类的更大或相等
		覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法

	父类方法用 private 修饰,则子类中写的同名同参数列表的方法不是方法的重写所以没有上述的要求
super限定:
	super 用于限定该对象调用它从父类继承得到的实例变量或方法
	super 不能出现在 static 修饰的方法中
	super.变量名|方法名
	在构造器中使用该限定则初始化的为该对象从父类继承的实例变量
	如果被覆盖的是类变量,在子类的方法中则可以通过父类名作为调用者来访问被覆盖的类变量
调用父类的构造器:
	子类构造器可以使用super语句调用父类的构造器:(必须在该构造器语句的第一行)
		super(形参列表)
	如没有使用super语句则会默认隐式调用父类无参数的构造器

八、多态:

引用变量类型:编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋值给该变量的对象决定,若二者不一致则可能出现多态
java允许把一个子类对象直接赋给一个父类引用变量,称为向上转型,由系统自动完成
通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量
引用变量的强制类型转换:
	(type)variable
	普通类型只能在数值类型之间进行
	引用类型之间的转化只能在具有继承关系的两个类型之间进行
	要把父类转化为子类则对象必须在子类实例的才行,即编译时类型为父类,运行时类型为子类类型
instanceof 运算符:
	子类对象赋值给父类引用变量时总会成功,这种这种转型只是表明这个引用变量的编译时类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式。但把一个父类对象赋给子类引用交量时,就需要进行强制类型转换,而且还可能在运行时产ClassCastException 异常,使用 instanceof 运算符可以让强制类型转换更安全。
	instanceof 运算符前操作数为一个引用类型变量,后一个操作数为一个类(或者接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的对象。可用于if语句中

	instanceof 运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误

九、继承与组合:

继承虽然是实现类复用的重要手段,但是继承破坏了封装,相比之下,组合也可实现类的复用且能提供更好的封装性
继承:
	如有访问权限允许子类可以直接访问父类成员变量和方法,但也造成子类可以直接修改父类的方法和成员变量,形成父类和子类的严重耦合
		父类:
			尽量隐藏父类的内部数据。尽量把父类的所有成员变量都设置成 pnvate 访问类型,不要让子类直接访问父类的成员变量
			不要让子类可以随意访问、修改父类的方法 父类中那些仅为辅助其他的工具方法,应该使用 private 访问控制符修饰,让子类无法访问该方法;
			如果父类中的方法需要被外部类调用,则必须以 public 修饰,但又不希望子类重写该方法,可以使用 final 修饰符来修饰该方法:如果希望父类的某个方法被子类重写,但不希望被其他类自由访问,则可以使用 protected 来修饰该方法
			尽量不要在父类构造器中调用将要被子类重写的方法
		使用 final 修饰类可以使这个不能被当成父类
		使用 private 修饰父类构造器使子类无法调用该类的构造器
		适合用继承的条件:
			子类需要额外增加属性,而不仅仅是属性值的改变
			子类需要增加自己独有的行为方式(包括增加新的方法或重写父类的方法)
组合:
	在一个类中实例化另一个类,例:
		class Animal
		{
			public void breath()
			{

			}
		}
		class Bird
		{
			//将原来的父类组合到原来的子类,作为子类的一个组合成分
			private Animal a;
			public Bird(Animal a)
			{
				this.a = a;
			}
			重新定义一个自己的 breath ()方法
			public void breath()
			{
				// 直接复用 Animal 提供的 breath ()方法来实现 Bird的breath ()方法
				a.breath();
			}
		}
		使用组合虽然需要实例化对象,但是并不会比继承占用空间多,因为继承中当创建一个子类时,系统不仅需要为该子类定义的实例变量分配内存空间,而且需要为它的父类所定义的实例变量分类内存空间

十、初始化块:

使用初始化块:
	[修饰符]{
		//初始化块的可执行性代码
	}
	修饰符只能是 static ,使用static修饰的初始化块称为静态初始化块。
	初始化块里的代码可以包含任何可执行性语句,包括定义局部变量、调用其他对象的方法,以及使用分支、循环语句等
	初始化块没有名字,在创建对象时隐式执行,且在执行构造器之前执行
	注:
		不论初始化代码放在哪都会在创建对象时在构造器前优先执行,如该类有父类则先执行父类无参数构造器,再执行初始化块代码
	实例变量的初始化顺序:
		先执行初始化块或声明实例变量时指定的初始值(二者执行顺序与其在源代码的顺序一致)
		再执行构造器里指定的初始值
初始化块和构造器:
	初始化块是构造器的补充,初始化块总是在构造器执行之前执行。系统同样可使用初始化块来进行对象的初始化操作
	实际上初始化块的代码在编译后会被“还原”到每个构造器中,且位于构造器代码的最前面(但在 super 语句之后)!
静态初始化块:
	使用static修饰的初始化块称为静态初始化块,也称为类初始化块,负责对类进行初始化,在类初始化阶段执行,因此比普通的初始化块优先执行
	静态初始化块不能对实例变量进行初始化处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@zhouyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值