四、面向对象(上)

1、类和对象

(1)修饰符
1)Java中的类也有修饰符,可以是public、final、abstract或者完全省略这三个修饰符,如果一个Java源文件中定义了一个public修饰的类,则这个源文件的文件名必须与public修饰的类的类名相同;
2)Java中的成员变量的修饰符,可以是public、protected、private、static、final,其中public、protected、private最多只能出现一个,不过可以和static、final组合起来使用;
3)Java中的方法的修饰符,比成员变量的修饰符多一个abstract,不过final和abstract最多只能出现一个
注:构造器的修饰符可以省略,也可以是public、protected、private其中之一,构造器有返回值只不过其返回值是隐式的,隐式的返回当前类的对象。
(2)访问控制符的含义

访问控制符 含义
private 只能在当前类中被访问
default 包访问权限,可以被相同包下的其他类访问
protected 既可以被同一个包中其他类访问,也可以被不同包中的子类访问
public 可以被所有类访问

(3)访问控制符的使用
1)如果想隐藏某些成员变量或者方法,使用private;
2)如果想作为一个父类,自己所包含的绝大部分方法希望被子类重写,而不想被外界直接调用,那么应该使用protected;
3)如果希望暴露出来让其他类进行调用,则使用public。

2、Java中的方法

(1)方法的归属
1)方法不能独立定义,只能在类体内定义;
2)方法要么属于该类本身,要么属于该类的一个对象;
3)永远不能独立执行方法,执行方法必须使用类或者对象作为调用者
(2)Java中方法的传递只有一种:值传递
(3)形参个数可变的方法
在定义方法的时候,在最后一个形参的类型后面增加三个点(…),则表明该形参可以接受多个参数值,多个参数值被当成数组传入,格式如下

class Test
{
	public void fun(int nNum, char cVal, String... books)
	{
		//.....
	}
	public void fun(int nNum, char cVal, String[] books)
	{
		//.....
	}
}

以上两种方法的处理结果是相同的,不同点是在调用的时候不同,即前者调用更加简洁,后者的参数必须是一个数组。

fun(5, "123", "456");
fun(5, new String[]{"123", "456"});

3、Java中的成员变量和局部变量

成员变量:在类里面定义的变量;
局部变量:在方法里面定义的变量,局部变量除了形参之外,都必须显式的初始化。必须先给方法局部变量指定初始值,否则不可以访问他们。另外,如果只定义了局部变量,系统并没有为这个局部变量分配内存空间,只有等到为其赋初始值时,系统才会为局部变量分配内存,并将初始值保存到这块内存中。

4、Java中的包

(1)package
在Java源文件中的第一个非注释行放置如下格式的代码,意味着源文件里面定义的所有类都属于这个包,并且类的完整类名应该是包名和类名的组合,并且包下面还可以定义子包。

package 包名

(2)import
import语句应该在package语句之后,类定义之前,用于导入多个包层次下的类。
(3)import static
用于导入指定类的某个成员变量、方法或者全部的静态成员变量、方法。

5、详解构造器

(1)使用构造器进行初始化
通过new关键字调用构造器时,系统会在一开始为这个对象分配孔家并执行默认初始化,即在构造器执行之前对象已经创建完成了,只是还不能被外部程序所访问,当构造器执行结束后,这个对象作为返回值被返回。
一般而言,会将构造器设置为public访问权限;若主要用于被子类调用,则设置成为protected;设置为private阻止其他类创建该类的实例。
(2)构造器的重载
若一个类中有两个构造器A和B,可以在A中使用this(参数);来调用构造器B。注,this中的参数一定要与B中规定的相同。

6、Java中的继承

(1)Java中只有单继承,每个子类只有一个直接父类,但却可以有无数个间接父类。
(2)Java中的子类不能获得父类的构造器。但可以在子类的构造器中使用super调用父类构造器的初始化代码。

super(父类构造器的形参);

使用super调用父类构造器也必须出现在子类构造器执行体的第一行,所以this调用和super调用不会同时出现。
而且不管是否使用super来调用父类构造器,子类构造器都会调用父类构造器一次。相应的规则
1)使用super进行调用;
2)子类构造器中有this显示调用本类中重载构造器,则在执行本类中另一个构造器的时候会调用父类;
3)无super调用也没有this调用,则会默认调用父类的无参构造器。
因此不管哪种情况都会上朔到java.lang.Object类的构造器。
(3)重写
1)什么是重写?
子类包含与父类同名方法的现象被称方法重写。
2)重写的要求?
“两同两小一大”:“两同”方法名相同、形参列表相同;“两小”子类的返回值类型比父类的方法的返回值类型更小或者相等,子类方法抛出的异常类型应该比父类方法声明抛出的异常类更小或者相等;“一大”子类的访问权限应该比父类的访问权限更大或者相等。
覆盖的方法和被覆盖的方法要么都是类方法,要么都是实例方法。
3)覆盖后的后果
子类的对象将无法访问到父类中被覆盖的方法,但可以在子类中进行调用。
如果被覆盖的是实例方法可以使用super来进行调用;如果被覆盖的是类方法可以通过调用父类类名来进行调用。

7、多态

Java允许将一个子类对象直接赋值给一个父类引用变量无需任何类型转换,被称为向上转型,向上转型由系统自动完成。
通过引用变量来访问其所包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。
引用类型之间的转换只能在具有继承关系的两个类之间进行。如果试图将一个父类转换成一个子类,那么这个对象必须实际上是子类才可以。
instanceof运算符:前一个操作数是通常是一个引用类型的变量,后一个操作数通常是一个类,它用于判断前面的对象是不是后面的类,或者是其子类,实现类的实例。如果是返回true否则返回false。

8、初始化块

(1)什么是初始化块?
Java类中的一个成员类似成员变量,方法,构造器。
(2)作用
当创建Java对象的时候,系统总是先调用该类里面定义的初始化块,然后调用构造器。如果定义了两个,那么前面的先执行后面的后执行。
实际上,初始化块是一个假象,在使用javac编译之后,初始化块中的代码会被还原到每个构造器中,且位于构造器的所有代码前面。
(3)如何使用

[修饰符]
{
	//初始化块的可执行性代码
}

(4)静态初始化块与普通初始化块
普通初始化块负责对对象执行初始化,类初始化块则负责对类进行初始化。系统将在类初始化阶段执行静态初始化块,而不是在创建对象的时候执行。因此静态初始化块总是比普通初始化块先执行。还有就是不论是静态的还是普通的,初始化块执行的时候都会依次上朔到java.lang.Object类。
静态初始化块不能对实例变量进行初始化处理,也就是说它不能访问非静态成员。

猜你喜欢

转载自blog.csdn.net/qq_35381323/article/details/84980564