java se 学习笔记

发布于 2021-12-08  137 次阅读


空指针异常

例如代码

public class MAin{
    pubilc static void main(String[]args)
    {
        customer c=new customer();
        c=null;
        System.out.println("c.id");
    }
}
class customer
{
    int id;
}

堆中的对象没有“引用”指向了,在java语言中程序员无法直接操作堆内存的,所以,就飘走了,变成了堆内存中的垃圾等待被清理。

封装

1 什么是封装;

面向对象三大特征,继承得封装,多台得继承。

2 有什么用

生活中很多东西都是封装的,内部被一个壳保护起来。封装后使用者看不见内部的复杂结构,也不用关心内部有多复杂,我们只需要操作壳上的按钮就行了。

1,保证内部结构的安全。

2,屏蔽复杂,暴露简单。

3 代码级别上封装有啥用

封装后对于调用人员不需要关心代码的复杂性,将安全级别较高的数据封装起来,外部人员不能随意访问,保证数据的安全性。

4 set与get

设置用set反问用get

static关键字

翻译为“静态的”

1,所有static关键字修饰的都是类相关的,类级别的

2,所有static修饰的都是采用“类名.”的方式访问的

3,static修饰的变量为静态变量,方法为静态方法。

何时使用static修饰的变量

一个对象一份不一样则使用实例变量,这个类中所有对象都一样的变量课使用static静态变量。

静态变量存储在方法区。

static定义"静态代码块"

1,语法格式

static{
    //java语句;
}

2,静态代码块在类加载时执行,且只执行一次。

3,一个类中可写多个静态代码块,且从上到下执行

4,静态代码块的作用是什么,怎么用,用在哪儿,什么时候用;

——与具体需求有关,如:要求在类加载的时刻执行代码完成日志记录。那么就可以写在静态代码块中。

——静态代码块是java为程序员准备的一个特殊时刻,这个特殊时刻称为类加载时刻。若希望在此刻执行一段特殊程序,这段程序可以直接写在静态代码库里。

5,通常在静态代码块中执行预备工作。

继承

1,继承是面向对象三大特征之一,

2,基本作用是:代码复用。“最重要的作用”有了继承才有了以后的“方法覆盖”和“多态”

3,子类extends父类

4,java语言中继承只支持单继承,一个类不能提示继承多类

5,b类继承a类

a类称为父类,基类,超类,superclass

b类称为子类,派生类,subclass

6,私有的不支持继承,构造方法不支持继承,其他数据都可以继承。

7,虽然只支持继承一类但是可以间接继承多类例如:

c extends b{};
b extends a{};
a extends t{};

8,如果一个类没有继承什么类,那么默认继承jdk中的一个类。

方法覆盖

又称方法重写override/overwrite

1,当父类中的方法以及无法满足子类的业务需求,子类需要对方法进行重写/覆盖。

2,方法覆盖发生在具有继承关系的两个类之间,要求

方法名不能变,返回值类型不能变,传参不能变。

访问权限不能更低可以更高。例如,原public不能变成private,原private能变

public。

3,不能继承的方法当然不能覆盖。

多态

基础语法

1,java中允许向上/向下转型。无论向上还是向下,得有继承关系。

向上转型:自动类型转换,向下转型:强制类型转换。

(注意,自动类型转换和强制类型转换只用于基础数据类型);

2,代码如下时

父类 a = new 子类();
父类 b = new 子类();
调用 a/b的方法时执行的是子类中的方法。

3,多种形态,多种状态,既为多态。

java分为编译阶段和运行阶段

对于编译器来说,a/b为父类。所以编译器在检查语法是只会去寻找父类里的方法。

(找到,并绑定(属于静态绑定));

运行阶段,在堆内存中创建的a/b是子类,所以运行阶段会动态执行子类中的方法,

属于运行阶段绑定(属于动态绑定);

4,多态就是编译一种形态,运行一种形态,多种形态。

多态指的就是;父类型引用指向子类型对象。

编译阶段;绑定父类方法

运行阶段;绑定子类方法

如果此时需要使用子类中特有的方法,需要向下转型,

格式 子类 c = (子类) a; 不过向下装换有风险需注意

例如反向例子

animal a = new bird();
cat y = (cat)a;
y.catchMouse();

这样就不行,会编译成功但是运行会出错

5,如何避免以上的问题的发生

instanceof运算符

可在运行阶段动态判断引用指向的对象的类型,

语法: “引用”+instanceof+"类型"

instanceof结果只能是true/false.

返回true则代表“引用”指向的对内存中的类型是那个类型。

向下转型时一定要使用instanceof判断

父类型的引用允许指向子类对象。(称为向上转型);

多态在实际开发的作用

super关键字

与this对比学习:

this 能出现在实例方法和构造方法中

语法this.this() ;

this不能使用在静态方法

this()只能出现在构造方法第一行,通过当前的构造方法调用“本类”中的其他的构造方法,目的是代码复用。

super

super 能出现在实例方法和构造方法中

语法super.super() ;

super不能使用在静态方法

super()只能出现在构造方法第一行,通过当前的构造方法调用“父类”中的构造方法,目的是代码复用。目的是创建子类对象时,先初始化父类。

final关键字

1,final 是一个关键字

2, final表示“最终的,不可变的”

3, 可以修饰变量,方法,类等。

4, final修饰的变量?

final 修饰的局部变量,一旦赋值,则无法重新赋值

5, final修饰的方法?

无法被覆盖,无法被重写。

6, final修饰的类?

final 修饰的类 无法被子类所继承。

7, final修饰引用

无法new,不能改变其指向的地址值,无法再指向其他对象,但可以通过引用的函数修改其他内容。

8, final修饰的实例变量?

final修饰实例变量必须手动给初始化赋值。

抽象类

抽象类无法实例化,无法创建对象

1, 什么是抽象类

类和类之间具有共同的特征,将这些共同特征提取出来就是抽象类。

2, 抽象类也属于引用数据类型

3, 语法

[修饰符列表] abstract class 类名

4, 抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。

5, final不能和abstract联合使用

6, 抽象类的子类可以是抽象类

7, 抽象方法

没有实现的方法,没有方法体。

前面有abstract关键字修饰

8, 抽象类中不一定有抽象方法,抽象方法必须在抽象类里。

9, 非抽象子类继承有抽象方法的父类时,需将抽象方法重写或覆盖 ,否则汇报错。

10, 面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。

接口

1, 接口的基础语法。

1,接口也是一种引用数据类型

2,接口是完全抽象的。(抽象类是半抽象的)或者可以说接口是特殊的抽象类。

3,接口的定义语法

[修饰符列表] interface 接口名 {};

4,接口编译后也是class字节码文件

5,接口支持多继承,一个接口可以继承多个接口。

6,接口中只包含 常量和抽象方法。

7,接口中所有的元素都是public修饰。定义时,public abstract可以省略。

8,类与接口间的关系为实现

继承 -- extends

实现 -- implements

9,继承和实现同时存在的话

extends 关键字在前,implements 关键字在后。

内部类

1, java 中允许将一个类A声明在另一个类B中,则A为内部类B为外部类。

2, 内部类的分类

成员内部类

局部内部类(方法内,代码块内)

3,成员内部类

1,作为外部类的成员。

可以调用外部类的结构。

可以用static修饰

可以被四种不同权限修饰。

2,作为一个类。

类内可以定义属性,方法,构造器。

可以被final修饰,表示此类无法被继承。

可以被abstract修饰。

4,如何实例化成员内部类的对象

静态成员内部类。

person.Dog dog = new person. dog() 

非静态成员内部类

person p=new person();
person.Bird bird = p.new Bird();

5,如何在成员内部类中区分调用外部类的结构

6,开发中局部内部类的使用