java基础-day07总结
封装:
- 数据隐藏
- 将程序中的相同代码进行抽取封装成方法
- 将一些复杂的操作封装成较简单的操作
继承:
- is-a的关系,接口(like-a),组合(has-a):在另一个类中有其他对象
- 子父类:
- 方法的重写:
0 .权限修饰符和异常可变:
1 .权限需要大于等于父类中方法的权限;
2 .异常要小于等于父类中方法抛出的异常
多态:
- 前提是要有继承和实现关系,重写了父类或父接口的方法。
- 一个对象具有多种形态【数据类型】;
- 成员变量:编译看左边,运行看左边。
- 成员方法:编译看左边。运行看右边。
变量不存在重写,创建子类对象要先创建父类对象。
static关键字:
- static能修饰类(内部类),方法和变量
- static修饰的数据[方法和变量]被该类的所有对象所共享;
- static只能修饰全局变量不能让修饰局部变量;
被static修饰的变量和方法叫做类变量和方法;
全局变量(成员变量和类变量)和局部变量 - static修饰的数据(静态数据)可以直接访问静态数据;不能直接访问非静态数据,因为静态数据是随着类的加载而出现的。
- 在子父亲、类继承关系中,父类方法的静态方法不能被重写为非静态方法
static修饰的方法不能被重写(重写的话不会报错,相当于覆盖父类的方法) - 静态数据可以使用类名直接调用,虽然对象也可以调用但是不推荐。如果使用对象去掉用静态数据,实际上是该对象委托该类去调用。(就算对象是空类型,也可以调用)sysetem.out.println不能输出空对象;
- 静态代码块:伴随着类的加载儿执行,至少执行一次。主要用于对程序的静态资源显式初始化
static{}
构造代码块:伴随着构造器的执行而执行,并且优先于构造器执行。主要是对程序中的成员变量进行显示初始化。
{} - 静态导入
import static java.lang.System.*;
导入后 代码可直接写out.print
.练习:
A{
static{syso(1)}
{2}
public A(){3}
}
B extends A{
static{syso(4)}
{5}
public B(){6}
}
test{
main(){
new B;
}
}
1,4,2,3,5,6
final关键字:
- 修饰类【不能被继承,String】,方法【不能被重写】,变量【修改值】
- final修饰的变量不能更改值所以称为常量。
- 当final修饰的是全局变量时,在定义该变量时必须初始化,当final修饰的是局部变量时可以不用显示初始化,但是在使用
之前必须赋值,之后其值不能改变。 - final也可以修饰方法的形式参数。方法的形式参数相当于该方法的局部变量
访问控制符:
- public:任意类中都可以使用,能修饰类,方法,变量
- default(什么都不写):
- protected:受保护的,能修饰方法和变量
- private:私有的,只能在类访问:能修饰类(内部类)
同包同类 同包不同类 同包子父类 不同包不同类 不同包子父类
public √ √ √ √ √
protected √ √ √ × √
default √ √ √ × ×
private √ × × × ×
抽象类和接口:
-
抽象类:
- 在java语法中使用使用abstract修饰的类
- 抽象类中有构造器,也可以自定义构造器,单不能通过抽象类子的构造器直接创建抽象类的对象:抽象类不能被实例化;
- 抽象类的使用主要通过创建新的类,子类继承抽象类创建子类对象,重写父类的抽象方法,然后调用;也可以通过匿名
内部类的形式访问抽象类中的数据。 - 创建的新的类继承了抽象类,但是不重写抽象方法。则该类必须定义成抽象类。
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类;
- 抽象类和抽象方法不能被private修饰。
- 抽象类中可以有普通方法。
-
接口:
- 接口是对抽象类更高层次的抽象。
- 接口中的方法全部都是抽象方法:默认由public abstract修饰,但是在JDK1.9以上,接口也可以有普通方法;
- 接口中的只有成员变量,并且该变量是public static final修饰;
- 接口没有构造器,不能创建对象,只能通过接口的实现类【显示定义实现类,匿名类】的对象来使用接口。
- 如果定义的子类没有实现全部的抽象方法,则该子类也要被定义成抽象方法。
- 类只能单继承,接口可以单实现也可以多继承。5.内部类:
内部类:
- 定义在一个类的内部的类。
在一个外部类的内部的成员位置【方法的外面】定义的类称为成员内部类
变量隐藏:
1.在局部位置有一个和成员位置同名非变量,此时如果直接访问变量,则会访问局部位置的变。
内部类访问内部类:x,this.x,coutClass。this.x
2.外部类访问内部类的资源需要先创建外部类对象,再创建内部类对象,然后通过该成员累不累对象访问,内部了地访问内部的资源则直接无条件访问
3.静态内部类
将成员内部类使用static修饰
1.静态内部类访问内外部类中的非静态数据需要先创建对象在访问,访问外部类中的静态数据则直接访问
2.在外部类中直接创建内部类对象访问内部类中的数据
3.在第三方类中访问静态内部类中的数据,通过new外部类。内部类()形式创建内部类对象,访问内部类中的数据new Outer.Inter().x。
4.局部内部类:定义在局部位置【除了成员位置的其他位置】的类称为局部内部类
1.在局部内部类中可以直接访问外部类中的数据
2.局部内部类里不能有static关键字
外部类中如果要访问局部类中的数据,先创建外部类的对象调用局部内部类所在的方法,然后在该方法中创建局部内部类对象,访问局部内部类的数据。
3.在jdk1.8以前版本,局部内部类所在的方法中的局部变量可以不用显示的用final修饰,1.8级以后,jvm会自动判断,当该变量在局部内部类使用了,则jvm认为该变量时final修饰的,如果该变量没有在局部内部类中使用,则jvm认为是普通的局部变量。
5.匿名内部类:
没有名字的内部类称之为内部类:匿名内部类一般不会单独出现,而是结合抽象类或接口作为方法的实际参数出现
1.匿名内部类一般不会单独出现
2.匿名内部类不能修改该类所处的方法中的局部变量的值
6.和equals方法:
1.都用于比较。–能比较任意类型的数据。equals只能比较引用类型的数据
2.当比较的是基本数据类型时,比较的是基本数据的值。
3.equals属于object类的方法,二object是类java体系中的父类
4.默认情况下【不重写equals方法时】,在比较引用类型的数据时和equals方法的比较结果相同。
5.如果重写了equals方法,则安照重写之后的规则比较。
6.一般在比较基本数据类型使用,比较引用类型用equals方法
7.包装器类
1.java是一门纯面向对象语言:
2.包装器类就是讲8大基本数据类型精心封装形成引用类型的类:
byte
short
int
long
float
double
char
boolean
3.自动装箱(自动调用valueOf,)和自动拆箱(intValue()) Long i=100不行,应为灭有这个方法。
1.自动装箱:jvm会自动将基本数据类型妆花成包装器类型
2.自动拆箱:自动装箱反着来
integer(所有整数)只会缓存-128~127的值,在其范围之内的数直接赋值。不在则进行创建新的对象。
4.集合中只能存储应用类行的数据:所以需要基本数据类型的包装器类型
7.String类和Object类
1.String类是final修饰的类
2.String类的所有对象的值都存储在常量池中。
String的赋值,如果赋值中右边有变量,则jvm会在堆内存开一个新的内存去缓存常量池的值,载内存指向堆。
3.Object类是所有类的父类