把学习当作习惯

导航

java---面向对象

第三章 面向对象
成员变量:定义在类中的变量称为成员变量
局部变量:定义在方法中的变量成为局部变量
类的定义:[修饰符] class 类名 [extends 父类名] [implement 接口名]{//类体(包括成员变量和成员方法)}
声明(定义)成员变量:[修饰符] 数据类型变量名[=值];
定义一个方法:[修饰符] [返回值类型] 方法名([参数类型 参数名1, 参数类型 参数名2]){//方法体 return 返回值;//返回值为void,返回值可以省略}
创建一个对象: 类名 对象名称 = new 类名();

访问控制符:(从小到大)private <default < protect < public
private:只能被该类的其他成员访问
default:只能被本包的其他类访问
protec:既能被本包的其他类访问,也能被不同包下该类的子类访问
public不管是否为一个包,能被所有类访问.

方法的重载:方法名相同,返回值类型,参数个数不同,或参数类型都可以
构造方法:必须没有返回值,方法名与类名相同,构造方法的参数类型或参数个数不同即可

this关键字
1).通过this关键字调用成员变量,解决与局部变量名称冲突的问题
2).通过this关键字调用成员方法 this.方法名;
3).通过this关键字调用构造方法this([参数]);
注意:只能在构造方法中使用this调用其他构造方法,不能再成员方法中使用;在一个构造中,使用this调用构造方法必须是该方法的第一句执行语句,且只能执行一次;不能在两个构造方法中互相使用this调用.

static关键字(静态)
静态变量:在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据.只有通过new关键字创建该类的实例对象后,系统才会为每个对象分配内存空间,储存各自的数据.它可以被所有实例所共享(只能修饰成员变量,不能修饰局部变量。
静态方法:静态方法不需要创建对象就可以直接通过类名调用(两种方式1. 类名.方法 2. 实例对象名.方法)
注意:静态方法在被调用时k可以不创建任何对象
静态代码块:static{。。。} 因为类只加载一次,因此静态代码块也只执行一次。

super关键字
1).使用super关键字调用父类的成员变量和成员方法
2).调用父类的构造方法

面向对象的三个特征:封装,继承,多态。

封装:将对象的属性和行为封装起来,一般用private进行封装,用get和set方法进行调用

抽象类:在定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。此时可以使用抽象类。
注意:抽象方法的类必须定义为抽象类,但抽象类中可以不包含任何抽象方法,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果像调用抽象类中定义的抽象方法需要创建一个子类,在子类中实现抽象类中的抽象方法。

接口:接口是一种特殊的抽象类,它不能包含普通方法,其内部的所有方法都是抽象方法。
接口所包含三类方法:抽象方法、默认方法、和静态方法。静态方法可以通过”接口名.方法名“的形式来调用,因此需要定义一个接口的实现类,该类通过implements关键字来实现当前接口,并实现接口中的所有抽象方法。
注意:包含抽象方法的类必须定义为抽象类,但抽象类中可以不包含任何抽象方法。另外,抽象类是不可以被实例化的(声明一个类的变量后,new一下就是实例化了。),因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用,如果想用抽象类中定义的抽象方法,需要创建一个子类,在子类中实现抽象类中的抽象方法。

继承:描述类与类之间的关系。
继承:类与类之间的继承:extends
注意:类只能单继承,不允许多重继承(一个类只能有一个直系父类),多个类可以继承同一个父类,可以多层继承
接口与接口之间的继承:implements
一个类可以在继承另一个类的统统是实现多个接口,并且多个接口之间需要使用英文逗号分隔:[修饰符]class 类名[extends 父类名] [implements 接口 1,接口 2,...]{...}
重写父类的方法:子类重写父类的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。

4.4多态
多态的前提条件:子类和父类有继承或者实现关系,重写父类(接口)方法,父类引用指向子类对象(用父类,或者父接口进行实例化出一个子类对象。)
特点:
成员变量:编译看父类,运行看父类(不能调用子类的成员变量)
成员方法:父类(接口)===桥,编译看父类,运行看子类(不能调用子类的成员方法)
缺点:没办法访问子类特有的成员变量和成员方法,解决方法时向下转型。

多态:在一个类中定义的属性和功能被其他类继承后,当把子类对象直接赋值给父类引用变量是,相同引用类型的变量调用同一个方法所呈现出的多s种不同行为特征。
多态是指不同类的对象在调用同一个方法是所呈现出的多种不同的行为.

对象类型的转换:
将子类对象当作父类类型的使用的情况(向上转型)此时不能通过父类变量去调用子类特有的方法
转换后的类 新对象 =(转换后的类) 旧对象

判断一个对象是否为某个类(或接口)的实例或者子类实例: 对象(或者对象的引用变量) instanceof 类(或接口)

内部类:
可以无条件地访问外部类的所有成员(静态内部类除外)
实现隐藏,可以实现多重继承,用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承,通过匿名内部类来优化简单的接口实现。

成员内部类:方法一:
外部类.内部类 内部类类名 = new 外部类().new.内部类();
方法二:也可以分两步:
外部类 外部类类名 = new 外部类();
外部类.内部类 内部类类名 = 外部类.new 内部类();
方法三:可以在外部类中实例化内部类。
内部类名 name = this.new 内部类名();
也可以专门在外部类中专门定义一个函数,对内部类实例化。
return new 内部类;
内部类可任意访问外部类的成员,不受权限地限制,单外部类要访问内部地成员就必须先创建内部类实例来引用。里面不能有静态成员变量和静态成员方法,但可以有静态常量。可以有构造方法,会生成两个.class文件。

局部内部类:实质是通过调用函数来完成类的创建与实例化的过程,真正把类隐藏起来。通常只使用一次,在方法内对类进行实例化。局部内部类只能访问方法中声明的final类型的变量(因方法体内的变量只能用final修饰,就连static也不能有),没修饰符的变量也视为常量。可以继承外部类。
不能使用修饰符public,private,protected

静态内部类: 外部类名.静态内部类名 变量名 = new 外部类名. 静态内部类名();
静态内部类无法访问外部类的成员,但可以访问外部类中的静态
员。因为静态类先于外部类非静态成员创建。实际上等同于静态内部类和外部类没任何直接关系。

匿名内部类:
匿名内部类是没有访问修饰符的,它只是为了获得一个对象实例
不需要知道其实际类型。匿名内部类必须继承一个抽象类或者实现一个接口。匿名内部类中不能存在任何静态成员或方法。
匿名内部类是没有构造方法的,因为它没有类名,也是四个内部类中唯一没有构造方法的。
第一种方式:
new 父抽象类(接口)名(){
重写父类(接口)方法
}.方法名();
第二种方式:
父抽象类(接口)名 对象名 = new 父类或者接口名(){
重写父类或者接口的方法
}
对象名.方法名();匿名类使用方法:首先需要一个接口型的参数,来调用这个新方法,语法格式:
新方法(new 接口名(){});

4.6Lambda表达式
语法格式([数据类型 参数名, 数据类型 参数名,...])->{表达式主体}
([数据类型 参数名, 数据类型 参数名,...])用来向表达式主体传递接口方法需要的参数,多个参数名中间必须用英文逗号进行分隔,可以省略参数的数据类型,如果只有一个参数可以省略括号().
->:表示Lambda表达式箭牌,用来指定参数数据指向,不能省略,
{表达式主体}:由单个表达式或语句块组成的主体,本质就是接口中抽象方法的具体实现,如果表达式主体只有一条语句,那么可以省略包含主体的大括号.允许有返回值,只有一条return语句时,也可以省略return关键字.

有且仅有一个抽象方法的接口,lambda表达式就是Java中函数式编程的体现,只有确保接口中有且仅有一个抽象方法,Lambda表达式才能顺利地推导出所实现的这个接口中的方法

@FuncInterface注解:该注解只是显式地标注了接口是一个函数式接口,并强制编辑器进行更严格的检查,确保该接口事函数式接口,若不是,编译器会报错,而对程序运行没有实质上的影响。

种类 lambda表达式示例引用示例 引用示例
类名引用普通方法 (参数列表)->对象名.类普通方法名() 类名::类普通方法名
类名引用静态方法 (参数列表)->类名.静态方法名() 类名::类静态方法名
对象名引用方法 (参数列表)->对象名.实例方法名() 对象名::实例方法名
构造方法引用 (参数列表)->new 类名() 类名::new
构造方法引用(参数列表)->new 类名() 类名::new
lambda 表达式的主体只有一条语句时,程序不仅可以圣洛包含主体的大括号,还可以通过英文双冒号“::”的语法格式来引用方法和构造器(即构造方法),这两种形式可以进一步简化Lambda表达式的书写


异常:
简单说就是由于硬件或者软件环境出现错误,或者程序本身的算法有误等造成的过程中断或者出现错误提示等情况。
异常的类型:
编译时异常:通常指书写程序时系统自动检测到的语法错误。
两种处理方式:
try:不发生异常情况执行的语句;
catch:发生异常情况下执行的语句(处理);
finally:不管try语句或者catch语句是否执行,都会执行的语句,通常
用来清理缓存或者线程等操作。线程:主线程--子线程 僵尸线程
throws:抛出异常,交由调用方处理,并终止程序运行。
throw:用于方法体内,只抛出一个异常对象,通常要和throws或者try...catch配合使用
运行时异常:通常指系统编译时正常,但运行时由于算法问题引起的错误。
自定义异常继承Exception类及其子类。

垃圾回收
四种垃圾回收算法:
标记清除算法
复制算法
标记整理算法
分代回收算法。
1. System类下的静态方法gc():System.gc()。
2. Runtime对象的gc()实例方法:Runtime.getRuntime.gc()。

posted on 2020-10-31 12:26  生活的样子就该是那样  阅读(78)  评论(0编辑  收藏  举报