面向对象笔记
1.对象
-
java是完全面向对象的语,是java语言的基础
-
对象是现实世界的实体,如人,汽车,电脑…
-
对象是唯一的,具有各自的属性(特征)和行为(功能)
-
2.类
-
类是具有相同属性的和行为的对象的集合,是面向对象思想的重要概念
-
类是独立的程序单元,由类名,属性,方法组成
-
3.对象和类的关系
-
1.类是对象的模板,对象是类的实例
-
2.类是对象的原型
-
3.所有属于同一类的对象都具有相同的属性和行为
-
4.类是概念模型,定义对象的所有属性和方法的操作
-
5.对象是类的实际实体
-
6.对象是真是的模型
-
4.定义类的方式
-
语法:
-
class 类名{
数据类型 属性名1;
……;
数据类型 属性名N;数据类型 方法名1(参数列表){
方法体
}
……
数据类型 方法名N(参数列表){
方法体
}
}
关键字class开始了类的定义,类的成员属性和成员方法包含在一对大括号中,大括号表示类定义块的开始和结束。 -
5.方法的定义
-
5.1语法:
-
返回值类型 方法名称(参数类型 参数名称....参数类型n 参数名称n)
-
{
-
方法体
-
}
-
5.2 分类
-
根据返回值:有返回值和无返回值
-
根据参数:有参数和无参数
-
6.抽象:只关注事务的主要细节,而忽略次要细节
-
7.封装
隐藏属性,方法或实现细节的过程称为封装;
将属性和方法全部结合在一起,形成一个不可分割的独立单位(即对象)例如:1.将属性进行私有化过程,就是封装
2.需要对外提供相应的set()和get()方法8.局部变量
局部变量是定义在语句块中的.诸如:方法体,循环体,if或else语句后的一对大括号都是语句块
类体不是语句块. 局部变量的作用域:只在一个语句块内有效,其生命周期是从开始执行声明它的语句开始到其所在的语句块结束而结束.
在同一个局部同名的局部变量只能有一个定义在类体中的变量和方法属于当前类的,称为成员变量和成员方法
9.this关键字
1.this指的是当前的对象
2.当成员变量和局部变量同名,优先使用的是局部变量;如果需要调用成员变量,则使用 this.成员变量名称
3.this只能在属于对象的方法或语句块中使用,静态的方法和代码块不可以使用10.构造方法:
作用:创建对象
构造方法的名称和类名相同,没有返回类型1.有参数构造方法和无参数构造方法
2.如果没有指定任何构造方法,则调用系统提供的无参数的构造方法
3.如果自己定义了构造方法,则系统不再提供默认的构造方法,需要自己提供无参数的构造方法和有参数的构造(根据需求)
4.每个类都有有参数和无参数构造方法,用来初始化该类的一个对象;11.对象的创建
1.语法:类名 对象引用名称 = new 类名([参数列表]);
2.对象的声明
类名 对象引用名称;
注:声明并不为对象分配内存空间,而只是分配了一个引用空间
3.实例化
运算符new为对象分配内存空间,它调用类的构造方法,返回引用,一个类的不同对象分别占据不同的内存空间。
4.初始化
执行构造方法,进行初始化,根据参数列表的不同调用相应的构造方法。11.方法重载:
特点:方法名称相同,参数列表不一样(参数的个数,顺序不一样)
典型案例:构造方法重载
作业:
定义一个人类,声明属性和方法
定义一个动物类,声明属性和方法
定义测试类,创建类的实例,并输出创建的对象的信息12.继承
1.特点:子类继承父类的属性和方法,一个类只能有一个父类(单继承),但是使用接口可以实现多继续
具有层次机构
2.优点:a.代码可以重用
b.可以轻松自定义子类(可以有自己的属性和方法)
c.子类可以用父类的方法
d.设计应用程序更加简单3.使用extends关键字
4.super关键字
所有类的父类都是Object类
1.始终指向调用类的父类
2.调用父类的构造方法,使用关键字super
3.创建子类对象时,先调用父类的构造方法,再调用子类的构造方法
4.子类构造方法与类名相同
5.子类调用父类的方式
1.子类调用父类的构造方法
super();或super(参数列表);
注:调用父类的构造方法必须放在子类构造方法的第一行2.子类调用父类的变量 super.变量名称; 3.子类调用父类的方法 super.方法名称();
5.this和super的区别
参见图片6.对象引用的2种方式
1.对象引用指向其自己
2.对象的引用指向其直接子类或间接子类对象对象的引用:在java中真正操作标识符的实质上是一个引用 1.对象引用的语法格式:类名 对象引用名称; 如Book myBook; 2.通常一个引用不一定需要一个对象相关联,引用于对象的关系 Book myBook = new Book(); 3.比较两个对象 ==和equals()方法 == 比较两个对象引用的地址是否相等 equals是String的方法,比较的是2个对象引用所指向的内容是否相等(比较内容) 4.对象的销毁 1.java有垃圾回收机制,会自动释放内存 2.对象java虚拟机视为垃圾有2种情况 a.对象应用超过其作用范围,则将这个对象视为垃圾 b.将对象赋值为null,如 myBook = null; 5.判断两个对象是否兼容 对象引用名称 instanceof 类名
13.多态性
1.java的三大特性:封装,继承和多态
2.作用:将接口和实现分离,改善代码的机构,增强程序的架构的弹性和可维护性
多态使用不同的实例而执行不同的操作(根据不同的对象调用不同的方法)
多态包括方法重载和方法重写3.方法重写(Override):实型的动态多态(运行时多态)
只能存在具有继承关系中,且重写非私有的方法
方法名称,参数,返回值相同,不同实现1.若子类重写了父类的方法,则调用子类的方法,反之,则调用父类的方法 2.子类方法不能比父类方法中被重写的方法更严格的访问权限 3.重写的方法不能比被重写的方法抛出更多的异常 4.调用父类的方法:super.methonname();
4.方法重载(Overloading):静态重载(编译时多态)
方法名称相同,参数列表不同(个数,顺序,类型),返回类型可以相同也可以不同,但是返回值的类型不能区分重载方法
典型:构造方法重载5.方法重载和方法重新的区别
14.访问修饰符
1.作用:信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因
信息隐藏的原因包括:
对任何实现细节所作的更改不会影响使用该类的代码
防止用户意外删除数据
此类易于使用
2.分类:
1.public:公开,整个工程中的类都可以访问
2.protected:受保护的,同一个包中的类可以访问,具有继承关系的父子类可以访问(可以不在同一个包中)
3.默认:只能同一个包的类可访问
4.private:私有的,同一个类访问
3.成员的访问控制:private,默认,protected,public
对应受保护的成员,如果需要调用,则要对外提供相应的get和set方法
4.类的访问控制: public和默认的访问控制
public的类:可以在任何地方被任何类访问
默认的类:只能被在同一个包中的类访问
注:一个文件中,只能有一个类是public修饰的,其他的类是默认
15.方法修饰符
1.static关键字
1.static修饰的变量叫静态变量,也叫类变量
2.static修饰的方法叫静态方法,也叫类方法
3.访问类变量和类方法的方式:
类名.类变量/类方法;
4.在静态方法中可以调用静态变量和静态方法,但是不能调用非静态的变量和方法
5.在非静态方法中不仅 可以调用用非静态的变量和方法,也可以调用 静态变量和静态方法
6.静态方法中不能使用this和super关键字
7.static不能修饰局部变量
2.fianl关键字
1.final修饰的类(最终的类)不能被继承
2.final修饰的方法(最终方法)不能被重写
3.final修饰的成员变量(最终变量)其值不能被修改
4.final的局部变量在使用前把值赋上
5.final修饰的成员变量必须在定义时或者在构造方法中初始化,建议定义时直接初始化
6.如果一个成员变量同时使用final和static修饰,则称为类常量,简称常量,常量命名一般大写
eg:private final static String SCHOOL_NAME="襄阳英泰";
3.abstract关键字
1.由abstract修饰的类叫抽象类,语法:
abstract class 类名称{
}
2.有abstract修饰的方法叫抽象方法,语法
abstract 返回值类型 方法名称(参数列表);
注:1.抽象方法只能定义在抽象类中,如果一个类中有抽象方法,则此类必定是抽象类
2.抽象类中即可定义抽象方法,也可以定义非抽象的方法
3.抽象类中的抽象方法没有方法体,父类中抽象方法,必须被子类重写并实现
3.构造方法不能使用abstract修饰
4.static方法,final方法不能使用abstract修饰
5.抽象方法不能使用private修饰*(因其子类要重写)
16.接口
接口就是一个抽象类
1.接口弥补了java中的单一继承
2.使用关键字interface声明接口
可以把接口看成是一个“纯粹”的抽象类.
接口代表一个契约,表示实现其的类有什么样的功能。其也需要实现,默认为abstract修饰。
语法:访问修饰符 [abstract] interface 接口名{
//方法与成员变量声明
}
注:1.abstract可以省略
3.它里的所有成量变量都用public static final修饰的。
4.其方法都是用public abstract来修饰的方法,
public [abstract] 返回类型 方法名称(参数列表);
注:1.接口的中方法只能是声明,不能有具体的实现(没有方法体),既 接口中就是抽象方法
2.abstract可以省略
3.不能用static及final修饰
5.接口的实现:
class 类名 implements 接口名列表{
//要实现的方法
}
多个接口中间用逗号分隔
注:1.如果一个类实现了接口,可以有2种操作方式
a.该类重写接口中的方法
b.将这个类改为抽象类
19.异常
1.程序运行的过程中出现不正常的事情,从而导致程序终止
2.异常常用类:
Exception: 异常类的根类
RuntimeException:java.lang包中异常类的基类
ArithmeticException:算术异常,如除数为0
IllegalArgumentException:参数异常
ArrayIndexOutOfBoundsException:数组越界异常,数组的大小小于或大于实际的数组大小
NullPointerException:空指针异常,比如对象没有实例化
ClassNotFoundException:不能加载指定类的异常
NumberFormatException:数字转换异常
IOException: I/O异常的根类
FileNotFoundException:找不到文件
EOFException:文件结束
InterruptedException:线程中断
3.处理异常的方式
3.1 try-catch捕获异常
1.try-catch捕获异常(有三种情况)
try{
//a.监控的代码块
}catch(异常类型 e1){
//b.异常的处理方式
}
注:1.监控的代码块如果没有异常,程序继续执行
2.监控的代码块如果有异常 --->产生异常对象---->异常类型匹配--->进入catch模块--->程序继续执行
3.监控的代码块如果有异常 --->产生异常对象---->异常类型不匹配 ---->程序终止
2.finally块
try{
//a.监控的代码块
}catch(异常类型 e1){
//b.异常的处理方式
}finally{
//c.释放资源
}
无论程序是否有异常,finally总是会被执行
资源释放:网络连接,数据库连接
3.多重catch语句
1.发生异常时,会按顺序来查看每个catch语句,并执行第一个与异常匹配的catch语句
2.执行一个catch语句后,其余catch语句将不会被执行
3.子类异常一定要位于父类异常之前
try{
监控的代码块
}catch(异常类型1 e1){
异常处理方式
}catch(异常类型2 e2){
异常处理方式
}catch(异常类型3 e3){
异常处理方式
}catch(异常类型4 e4){
异常处理方式
...
}finally{
//释放资源
}
4.嵌套try-catch
3.2.Throw和Throws处理异常
1.throws声明抛出异常
a.throws通常用于方法声明,当方法中可能存在异常,却不想在方法中对异常处理时,
就可以在声明方法时使用throws声明抛出异常
b.若需要抛出多个异常,各个异常中间用逗号分隔
c.语法:
访问修饰符 返回值类型 方法名称(形参列表) throws 异常类1,异常类2....异常类n{
方法体
}
d.调用者处理捕获异常
2.throw语句抛出异常
a.throw语句通常用在方法体中,在程序中自行抛出异常,使用throw语句抛出的异常类的实例(new),
通常与if语句一起使用
b.语法:
throw new 异常类1,异常类2....异常类n;
c.调用者处理捕获异常
4.自定义异常
1.自定义异常的概念
2.自定义异常需要继承Exception及其子类
3.语法:
class 自定义异常类名 extends Exception(或其子类){
}
4.调用者try-catch捕获异常
20.java.lang包
1.Java.lang包被自动导入到所有的程序,是java最广泛使用的包
2.包装类
2.1 定义变量使用基本数据类型(简单数据类)
2.2 java是面向对象语言,有时需要将简单的数据类型存储在某些类中,而这些类中只能存储类,这就需要对简单数据类型包装成类进行存储
2.3 包装类
基本类型 包装类型
byte ---> Byte
short ---> Short
int ---> Integer
long ---> Long
float ---> Float
double ---> Double
boolean ---> Boolean
char ---> Character
2.4 基本类型转成包装类的方法
1.构造方法
2.xxx.valueOf()方法
2.5 包装类转成基本类型的方法
1.xxxValue()方法 ,如:intValue()
2.parsexxx()方法, 如:paresInt()
如:public static int parseInt(String s, int radix)
@s: String包含整数表示被解析
@radix: 字符串中的字符必须全部是指定基数的数字
parseInt("-FF", 16) 指定前面是十六进制数
parseInt("1100110", 2) 指定前面是二进制数
parseInt("172", 8) 指定前面是八进制数
parseInt("7815459", 10) 指定前面是十进制数
2.6 Character包装类的常用方法
1.转大换:toUpperCase();
2.转小写:toLowerCase();
3.判断是否为0~9的数字:isDigit()
4.Java确定指定的字符是否为空格:isWhitespace(char ch)
5.判断是否为大写字母:isUpperCase(c)
6.判断是否为小写字母:isLowerCase(c)
7.判断是否为字母:isLetter(c)
8.判断是否是空格:isWhitespace()
注:
1.自动打包:可以直接将基本数据类型的值当作封装类对象使用
2.自动解包:可以直接将封装对象赋值给基本的数据类型的变量
3.字符串String
1.字符串是常量,其值在创建之后不能改变
2.String对象是不可改变的,故可以共享他们
(Java虚拟机理解字符串为编译时常量,在内存中只会为它分配一个次内存,然后就可以多次调用)
3.字符串的长度:length()方法
4.比较字符串的常用方法:
1.== :比较是否是同一个对象
2.equals()方法:比较两个对象的内容是否相等
3.equalsIgnoreCase():比较两个字符串的内容是否相等,忽略大小写
4.compareTo(): 按字母顺序比较两个字符串,返回值是int型
如果两个字符串相等,则返回 0;
如果字符串在该值之前,则返回值小于 0;
如果字符串在该值之后,则返回值大于 0
5.endsWith(): 以指定字符串结尾
6.startsWith():以指定字符串开头
6.字符串的搜索方法:
1.indexOf():如果找到指定的字符,就返回字符串的索引位置,如果找不到则返回-1
注:字符串的索引位置从0开始,最大是lengt-1
2.charAt():返回指定索引(非负)位置的字符 ,如果找到返回字符,找不到会出错
3.substring():从指定位置开始,截取到字符串末尾
4.substring(startIndex, endIndex):从指定startIndex位置开始,截取到endIndex-1指定位置,包含前面,不包含后面,前闭后开
5.concat():连接字符串
6.replace(oldchar,newchar):使用新的字符替换旧的字符
7.trim():去掉字符串的前后空格
8.indexOf(String str, int fromIndex):返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
9.lastIndexOf(String str):返回指定子字符串最右边(最后一次)出现的字符串内的索引。