> 文章列表 > Java学习

Java学习

Java学习

面向对象进阶

static

被static修饰的成员变量,叫做静态变量
特点:
被该类所有对象共享
调用方式:
类名调用(推荐)
对象名调用

各大类

javabean类:用来描述一类事物的类.比如,Student,Teacher,Dog,Cat等.
测试类:用来检查其他类是否书写正确,带有main方法的类,是程序入口
工具类:不是用来描述一类事物,而是帮我们做一些事情的类

static的注意事项

1.静态方法只能访问静态变量和静态方法
2.非静态方法可以访问静态变量或者静态方法,也可以访问非静态成员变量和非静态成员方法
3.静态方法中是没有this关键字
总结:静态方法中,只能访问静态.非静态方法可以访问所有.静态方法中没有this关键字

继承的特点

1.Java只支持单继承,不支持多继承,但支持多层继承
2.Java中所有的类都直接或者间接继承object类
3.子类只能访问父类中非私有成员
4.独立完成继承体系的案例

成员变量访问特点

1.继承中成员变量访问特点:就近原则
先在局部位置找,本类成员位置找,父类成员位置找,逐级往上
2.如果出现重名的成员变量怎么办

System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);

方法重写

当父类的方法不能满足子类现在的需求时,需要进行方法重写.

书写格式:

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写方法。
@Override是放在重写后的方法上,校验子类重写时语法是否正确

方法重写注意事项和要求

1.重写方法的名称,形参列表必须与父类中的一致
2.子类重写父类方法时,访问权限子类必须大于等于父类
3.子类重写父类方法时,返回值类型必须小于等于父类
4.建议:重写的方法尽量和父类保持一致
5.只有被添加到虚方法表中的方法才能被重写

构造方法的访问特点

1.父类中的构造方法不会被子类继承,但可以通过super调用
2.子类构造方法的第一行,有一个默认super()
3.子类中所有构造方法默认先访问父类中的无参构造,再执行自己
4.要想方法文父类有参构造,必须手动书写

this,super使用总结

this:理解为一个变量,表示当前方法调用者的地址;
super:代表父类存储器

认识多态

什么是多态?
同类型的对象,表现出不同形态.
多态的表现形式
父类类型 对象名称 = 子类对象
多态的前提
1.有继承关系
2.有父类引用指向子类对象

多成员调用的特点

1.变量调用:编译看左边运行也看左边
2.方法调用;编译看左边运行看右边

弊端

不能调用子类的特有功能

使用其他类的规则

使用其他类时,需要使用全类名
import com.itheima.domain.Student;
1.使用同一个包中的类时,不需要导包。
2.使用java.lang包中的类时,不需要导包
3.其他情况都需要导包
4.如果同时使用两个包中的同名类时,需要全类名

final

final修饰方法
表明该方法是最终方法,不能被重写
final修饰类
表明该类是最终类,不能被继承
final修饰变量
叫做常量,只能被赋值一次
关于常量
实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。
常量的命名规范
单个单词:全部大写
多个单词:全部大写,单词之间用下划线隔开
细节:
final修饰的的变量是基本类型:那么变量存储的数据值不能发生变化
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变

权限修饰符

权限修饰符:是用来控制一个成员能够被访问的范围的
可以修饰成员变量,方法,构造方法,内部类
private----私房钱,只能自己用
默认----只能本包中能用
protected----受保护的
public----公共的

权限修饰符的使用规则
实际开发中,一般只用private和public
成员变量私有
方法公开
特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有

代码块

局部代码块、构造代码块、静态代码块

局部代码块

提前结束变量的生命周期(已淘汰)

构造代码块

抽取构造方法中的重复代码(不够灵活)
1、写在成员位置的代码块
2、作用:可以把多个构造方法中重复的代码抽取出来
3、执行时机:我们创建本类对象的时候会先执行构造代码块再去执行构造方法

静态代码块

数据初始化(重点)
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用

抽象类和抽象方法

抽象方法:将共性的行为(方法)抽取到父类之后
由于每一个子类执行的内容是不一样的
所有,在父类中不能确定具体的方法体
该方法就可以定义为抽象方法

抽象类:如果一个类中存在抽象方法,那么该类就必须申明为抽象类

抽象方法的定义格式:public abstract 返回值类型 方法名(参数列表)
抽象类的定义格式:public abstact class 类名{}

抽象类和抽象方法的注意事项
抽象类不能实例化
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
可以有构造方法
抽象子类(要么重写抽象类中的所有抽象方法,要么是抽象类)

接口

接口就是一种规则,是对行为的抽象

接口的定义和使用
接口用关键字interface来定义
public interface 接口名{}
接口不能实例化
接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
接口的子类(实现类)
要么重写接口中的所有抽象方法
要么是抽象类
注意1:接口和类的实现关系,可以单实线,也可以多实现。
public class 类名 implements 接口名1,接口名2{}
注意2:实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口名1,接口名2{}

接口中成员的特点

成员变量
只能是常量
默认修饰符:public static final
构造方法:没有
成员方法:只能是抽象方法。默认修饰赋:public abstract

接口和类之间的关系

类和类的关系
继承关系,只能单继承,不能多继承,但是可以多层继承
类和接口之间的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系
继承关系,可以单继承,也可以多继承(如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法)

接口中新增方法

JDK8的新特性:接口中可以定义有方法。(默认、静态)
允许在接口中定义默认方法,需要使用关键字default修饰(解决接口升级的问题)
接口中默认方法的定义格式:
格式:public defalut 返回值类型 方法名(参数列表){}
范例:public defalut void show(){}
接口中默认方法的注意事项
默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
public可以省略,default不能省略
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
JDK9的新特性:接口中可以定义私有方法。

接口应用

接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了
当一个方法的参数就是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态

适配器设计模式

当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
书写步骤:
编写中间类XXXAdapter,实现对应的接口
对接口中的抽象方法进行空实现
让真正的实现类继承中间类,并重写需要用的方法
为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰

内部类

类的五大成员:
属性、方法、构造方法、代码块、内部类
什么是内部类?
在一个类的里面,再定义一个类

public class Car {//外部类String carName;int carAge;int carColor;class Engine{//内部类String engineName;int engineAge;}
}

内部类表示的事物是外部类的一部分
内部类单独出现没有任何意义
内部类的访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
什么时候用到内部类:
B类表示的事物是A类的一部分,且B单独存在没有意义
比如:汽车的发动机,ArratList的迭代器,人的心脏等等

内部类的分类

成员内部类
静态内部类
局部内部类
匿名内部类

成员内部类

写在成员位置的,属于外部类的成员
成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等
在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量

public class Car{//外部类String carName;int carAge;int carColor;class Engine{//成员内部类String engineName;int engineAge;}
}

获取成员内部类对象
方式一:在外部类中编写方法,对外提供内部类的对象

public class Outer{String name;private class Inner{}public Inner getInstance(){return new Inner();	}
}

方式二:直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
范例:Outer.Inner oi = new Outer().new Inner();

常见APL

记一下类名和类的作用
养成查询APL帮助文档的习惯

Math

是一个帮助我们用于进行数学计算的工具类
私有化构造方法,所有的方法都是静态的
Math的常用方法
public static int abs(int a)----获取参数绝对值
public static double ceil(double a)----向上取整
public static double floor (double a)----向下取整
public static int round(float a)----四舍五入
public static int max(int a , int b)–获取两个int值中的较大值
public static int min(int a , int b)–获取两个int值中的较小值
public static double pow(double a,double b)----返回a的b次幂
public static double random()----返回值为double的随机值,范围为[0.0,1.0 )

abs函数有bug
以int类型为例,取值范围:-2147483648~2147483647
如果没有正数与负数对应,那么传递负数结果有误
·-2147483648没有正数与之对应,所以abs结果产生bug

面对此bug可以使用absExact函数,当发生上述的bug时他会报出一个错误

pow函数的小细节
如果第二个参数0~1之间的小数
System.out.println(Math.pow(4,0.5))
建议:
***第二个参数:***一般传递大于等于1的正整数
Math.sqrt()开根号
Math.cbrt()开立方根