Java笔记第二篇 Java面向对象核心概念及应用

这是Java笔记第二篇内容,同样先来看一下这次内容的思维导图吧!这张思维导图里面是我想写内容的提纲,没有涉及到具体的东西,要看具体的内容,继续往下看哦~~~///(v)\~~~在这里插入图片描述

第5章 类与对象

5.1 类的定义

5.2 对象的创建与引用

创建对象及访问对象成员
使用“new+构造方法”来创建类的对象。
eg:
Point p1 = new Point();
p1为创建对象的引用变量,通过“p1.属性”访问对象属性,通过“p1.方法”访问对象方法。

对象的初始化和构造方法
定义属性成员时指定初值,通过初始化块赋初值,通过构造方法赋初值。

如果一个类没有指定构造方法,则系统自动提供一个无参构造方法。
注意:
(1)构造方法是类的一种特殊方法,构造方法的名称必须与类名同名。
(2)构造方法没有返回类型。
(3)一个类提供多个构造方法,在创建对象时,系统自动调用能满足参数匹配的构造方法为对象初始化。
(4)当提供一个非无参构造方法时,系统将不自动提供无参构造方法,需要自己添加。

5.3 变量作用域

成员变量、局部变量、方法参数、异常处理参数

5.4 类变量和静态方法

类变量:
用static修饰符修饰的属性是仅属于类的静态属性,相应的成员变量也属于类变量或者静态变量。

类变量的访问形式:
通过类名作前缀来访问、通过对象作前缀来访问、在本类中可以通过变量名直接访问。

给类变量赋初值:
按默认赋值原则在定义变量时赋初值;在通过静态初始代码块赋初值时,大括号前要有static修饰。
注意:静态初始化代码的执行是在main()方法执行前完成的。

静态方法:
用static修饰符修饰的方法,也叫类方法。

调用静态方法:
使用类名做前缀、也可以通过对象来调用,但必须清楚的是它不依赖于任何对象。
在静态方法中,能处理类变量,也可以访问其他static方法,但绝不能访问任何归属对象空间的变量的或方法。

5.5 理解this

用this作前缀可访问当前对象的实例变量的实例或成员方法。

this的用途:
(1)在实例变量和局部变量名称相同时,用this作前缀来特指访问实例变量。
(2)把当前对象的引用作为参数传递给另一个方法。
(3)在一个构造方法中调用同类的另一个构造方法,形式为this(参数)。但要注意,用this调用构造方法,必须是方法体中的第一个语句。

5.6使用包组织类

建立包:
创建包的语句需要使用关键字package,而且要放在源文件的第一行。每一个包对应一条目录路径。
在默认情况下,系统会为每一个源文件创建一个无名包(default),这个源文件中定义的所有类都隶属于这个无名包,它们之间可以相互引用非私有的域或方法,但无名包中的类不能被其他包中的类所引用。因此,如果希望编写的类被其他包中的类引用,则要建立有名包。

包的引用:
(1)在引用类时,使用包名作前缀。例如:“new java.util.Date()”。
(2)用import语句加载需要使用的类。例如“import java.util.date”,然后在程序中可以直接通过类名创建对象,“new Date()”。
(3)用import语句加载整个包,用星号代替类名位置,它将加载包中的所有的类。例如“import java.util.*”

第6章 继承与多态

6.1 继承

定义类时通过extends关键字指明其要继承的直接父类。

通过类的继承,祖先类的所有成员均将成为子类拥有的财富,但是能否通过子类对象直接访问这些成员则取决于访问权限的设置。例如,在子类中不能通过子类对象访问父类的私有属性,但并意味着子类对象没有拥有该属性,可以通过其他一些公开方法间接存取该属性。

构造方法不能继承。

子类可以在自己的构造方法中使用关键字super来调用父类的构造方法,但super调用语句必须是子类构造方法中第一个可执行语句。

子类在自己定义构造方法中如果没有用super明确调用父类的构造方法,则在创建对象时,首先自动执行父类的无参构造方法,然后再执行自己定义的构造方法。(此时如果父类中没有无参构造方法,程序在编译时将会出错)

使用this查找匹配的方法时首先在本类查找,在找不到时再到其父类和祖先类查找;
使用super查找匹配方法时,首先到直接父类查找,如果不存在,则继续到祖先类逐级往高层查找。

6.2 多态性

多态性体现在两个方面:
方法的重载,也称参数多态;子类对父类方法的覆盖。

方法的重载:
方法重载是在同一类中存在多个方法名相同但参数不同的方法。调用时,首先按“精确匹配”原则去查找匹配方法,如果找不到,则按“自动类型转换匹配”原则去查找能匹配的方法。
注意:静态方法和实例方法的调用差异,实例方法一定要有一个对象作为前缀;静态方法则不依赖对象。

方法的覆盖:
子类继承父类的非私有方法,在子类中对父类定义的方法重新定义,这时产生方法覆盖。
(1)方法名、参数列表完全相同才会产生方法覆盖。返回类型通常也要一致,只有返回类型为引用类型时,允许子类方法的返回类型是父类方法返回类型的子类型。其他情形导致类型不一致时编译将提示错误。
(2)方法覆盖不能改变方法的静态与非静态属性。
(3)不允许子类中方法的访问修饰符比父类有更多的限制。

通过父类引用访问子类对象时,只有实例会是子类定义的,对象属性,静态属性,静态方法均是父类定义的。
原因在于对象执行方法时,由实际对象的类型决定,而不是引用变量的类型。访问属性时则由引用变量的类型决定,因为编译程序分析在分析程序时是基于类型来决定访问哪个属性变量。
静态成员是依赖类的,静态成员的访问基于引用变量的类型,而不是对象类型。尽管父类引用变量可指向子类对象,但通过父类引用变量访问的静态方法和静态属性均是父类的。

6.3 几个特殊类

Object类
Object类是所有Java类的最终祖先,如果类定义时不包含关键字extends,则编译将自动认为该类直接继承Object类。

Object类是一个具体类,它可以创建对象。Object类包含了所有的Java类的公共属性和方法。
常用的方法:
public boolean equals(Object obj):该方法是比较两对象封装的数据是否相等;与“==”不同,后者是比较两个对象的引用是否指向同一对象。在Object类中,equals()方法采用的是后者比较方法,即比较对象引用。因此,在类设计时,需要进行对象的数据比较,一般要重写equals()方法。

public String toString():返回对象的字符串描述,一般对其重写。

Class类
Java运行环境中提供了反射机制,这种机制允许在程序中动态获取类的信息以及动态调用对象的方法。其相关的类主要有
Class类:代表类
Filed类:代表类的属性
Method类:代表类的构造方法
Array类:代表动态创建数组

获取Class类型的对象

方法1.调用 Object 类的 getClass()方法。
方法2.使用 Class 类的 forName()方法。
方法3.如果 T 是一个Java类型,那么T.class就代表了与该类型匹配的Class对象。例如,String.class代表字符串类型,int.class代表整数类型。

6.4 访问控制修饰符

访问控制符是一组限定类、域或方法是否可以被程序其他部分访问和调用的修饰符。

公共访问控制符:public
修饰类,类为公共类,表示它可以被所有的其他类所访问,否则该类只能被一个包中的类访问。
修饰类的成员,表示在其他类中可以无显示地访问该成员。

默认访问控制符
默认的访问控制指在属性或方法定义前没有给出访问控制符的情形,在这种情况下,该属性或方法只能被同一个包的类所访问,而不可以被其他包的类所访问。

私有访问控制符:private
用private修饰的域或方法只能被该类自身所访问和修改,而不能在任何其他类(包括该类的子类)中访问。

保护访问控制符:protected
可以在以下三种情况下被访问:
1.该类本身
2.与它在同一个包中的其他类
3.在其他包中的该类的子类

当类的修饰符为public时:在这里插入图片描述

6.5 final修饰符的使用

final作为类修饰符
此时的类称为最终类。特点是不允许被继承。

final修饰方法
此时的方法是功能和内部语句不能被更改的最终方法,在子类中不能再对父类的final方法重新定义。有private修饰的方法,默认地也认为是最终方法。

final定义常量
用final标记的常量也就是常量。
常量可以在定义时赋值,也可以先定义后赋值,但只能赋值一次。与普通属性变量不同的是,系统不会给常量赋默认初值,因此,要保证引用常量前给其赋初值。

如果将引用类型的变量标记为final,那么该变量只能固定指向一个对象,不能修改,但可以改变对象的内容。

6.6对象引用转换

在具体编程中,就是允许将子类对象赋值给父类的引用变量,但反之不可。

在将父类引用赋值给子类变量时要进行强制转换,这种强制转换在编译时总是认可的,但运行时的情况取决于对象的值。如果父类对象引用指向的就是该子类的一个对象,则转换时成功的,如果父类对象指向的其他的子类对象或父类自己的对象,则转换会抛出异常。

第7章 常用数据类型处理类

7.1 字符串的处理

String类用于不变字符串的操作,StringBuffer类则用于可变字符串处理。String类主要用于对字符串内容的检索和比较等操作,但要记住操作的结果通常得到一个新字符串,而且不会改变原串的内容。

String类
创建字符串
字符串的构造方法有如下4个。
(1) public String(): 创建一个空的字符串。
(2) public String(String s):用已有字符串创建新的String。
(3) public String(StringBuffer buf):用StringBuffer对象的内容初始化新的String。
(4) public String(char value[ ]):用已有字符数组初始化新的String。

字符串的连接
利用 “+” 运算符可以实现字符串的拼接。
方法concat(String str)专用于字符串的连接。

比较两个字符串
在这里插入图片描述
字符串的比较有一个重要的概念要引起注意,那就是equal()方法和“==”的区别。
详情请看equals()方法和“==”的区别

字符串的提取与替换

在这里插入图片描述
字符串中字符或子串的查找

在这里插入图片描述

StringBuffer 类
创建StringBuffer 对象

在这里插入图片描述

StringBuffer 类的主要方法

在这里插入图片描述

7.2 基本数据类型包装类

在这里插入图片描述

7.3 日期和时间

Date 类
在这里插入图片描述
Calendar 类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第8章 抽象类和接口

8.1 抽象类和抽象方法

抽象类用 abstract 修饰符修饰。

8.2 接口

Java中不支持多重继承,而是通过接口实现比多重继承更强的功能,Java通过接口使处于不同层次,甚至互不相关的类可以具有相同的行为。
如果不清楚为什么是单继承、多接口,请查看:Java中为什么是单继承、多接口?(多版本)

接口的定义:

接口由常量和抽象方法组成,由关键字 interface引导接口定义。
在这里插入图片描述
接口是抽象类的一种,不能直接用于创建对象。接口的作用在于规定一些功能框架,具体功能的实现则由遵守该接口约束的类去完成。

接口的实现
在类的声明部分用 implements 关键字声明该类将要实现哪些接口。
在这里插入图片描述

8.3 内嵌类

在这里插入图片描述成员类
在这里插入图片描述
注意:
1.程序中所有定义的类均将产生相应的字节码文件。内嵌类的命名要注意不能与自己的外层类同名,其他不必担心,因为其真实的名字加上了外层类作为前缀。
2.不能直接在 main 等静态方法中直接创建内嵌类的对象,在外界要创建内嵌类的对象必须先创建外层类对象,然后通过外层类对象去创建内嵌类对象。
例如:

public static void main(String arg[])
{
    
    
	OuterOne.InnerOne i = new OuterOne().new InnerOne();
	i.innerMethod();
}

静态内嵌类

内嵌类可定义为静态的,静态内嵌类不需要通过外层类的对象来访问,静态内嵌类不能访问外层类的非静态成员。

方法中的内嵌类
在这里插入图片描述
匿名内嵌类
Java中允许创建对象的同时定义类的实现,但是未规定类名,Java将其定义为匿名内嵌类。

猜你喜欢

转载自blog.csdn.net/xiaobai_qian/article/details/106079363