-
1.4.3 静态初始化块
-
2 封装性
-
- 2.1 定义
-
2.2 封装的实现步骤
-
2.3 内部类
-
- 2.3.1 内部类的定义
-
2.3.2 内部类的种类
-
3 继承性
-
- 3.1 super 和 this 的区别
-
3.2 继承时构造方法的区别
-
3.3 继承的初始化顺序
-
3.4 final 关键字
-
3.5 Object 类
-
4 多态性
===========================================================================
类是一个抽象的概念,而对象是一个具体实体。比如“手机”是类,而 iPhone SE 就是“手机”类的一个对象,Mi11 就是“手机”类的另一个对象……
-
类(class)是对象(object)的模板;
-
类构造对象的过程称为创建类的实例(instance)。
构造方法的语法格式为:
//在实际操作中,构造方法可以不写,可以写无参,可以写有参,也可以是一个,也可以是多个。
// 不过要注意的是,构造方法没有返回值,同时必须与类同名。
public 构造方法名(参数){
//初始化代码块
}
-
构造方法如果不写,系统仍然会自动添加无参的构造方法;
-
构造方法如果是有参的,那么在对象的实例化,需要提供对应的参数;
-
构造方法如果是多个,调用时会自动根据不同的参数选择相应的方法。
其中,成员变量的作用域还需要通过下面的访问修饰符来决定。
Java 一共有四种修饰符,它们的作用域分别如下:
-
private:表示除类的内部方法之外的任何人都不能访问的元素,它就像一堵墙,当有人试图访问它时,就会在编译时得到错误信息;
-
默认访问权限:这种权限通过被称为包访问权限,因为在这种权限下,类可以访问在同一个包中的其他类的成员,但是在包之外,这些成员如同指定了private一样;
-
protected:除了默认访问权限之外还有子类的访问;
-
public:表示紧随其后的元素既可以在同一个包内的不同类访问,又可以在不同包内的类访问。
-
实例域:只有当创建实例(对象)之后才被激活使用,这个域是属于实例化对象的;
-
静态域:这个域是属于类的,不需要类的实例化就可以使用。
1.4.1 为什么使用静态域
我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了。
Java 中被 static 修饰的成员称为静态成员或类成员,它被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。
1.4.2 静态方法
从本质上来说,静态方法与静态域相同,唯一要注意的就是静态方法与非静态方法之间的调用。
-
静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如果想要在静态方法中调用非静态变量,可以通过在静态方法创建类的对象,然后通过对象来访问非静态变量;
-
在非静态方法中,则可以直接访问同类的非静态变量和静态变量;
-
静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
1.4.3 静态初始化块
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块,此时如果使用 static 修饰初始化块,就称为静态初始化块。
静态初始化块只会执行一次,即在该类第一次实例化的时候执行一次。同时静态初始化块只能给静态变量赋值,不能给普通的成员变量赋值。
示例:
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。
========================================================================
封装是面向对象语言的三大特性之一,另外两个特性是继承和多态。
封装指的是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的 setter/getter 方法来实现对隐藏信息的操作和访问。
封装的实现步骤为:
-
修改属性的可见性为 private;
-
创建 getter/setter方法用于属性的读写;
-
在 getter/setter 方法中加入属性控制语句。
1)不加封装的代码:
public class Move {
public static void main(String[] args) {
Hero sharm = new Hero();
System.out.println(“该人物的生命值为”+sharm.lifeValue);
//如果类中的属性不是私有域,就可以通过如下的方式直接修改对象的域,这就破坏了封装性。
sharm.lifeValue = 4000;
System.out.println(“该人物的生命值为”+sharm.lifeValue);
//新建一个对象时,类中的属性还是原来的值
Hero zhao = new Hero();
System.out.println(“该人物的生命值为”+sharm.lifeValue);
}
}
class Hero {
int lifeValue = 5000;
}
2)加入封装的代码:
public class Move {
public static void main(String[] args) {
Hero sharm = new Hero();
//3.1 只有通过getter方法来显示属性的值
System.out.println(“该人物的生命值为”+sharm.getLifeValue());
//3.2 这个时候只能通过setter方法来修改属性的值
sharm.setLifeValue(4000);
System.out.println(“该人物的生命值为”+sharm.getLifeValue());
//新建一个对象时,类中的域还是原来的值
Hero zhao = new Hero();
System.out.println(“该人物的生命值为”+sharm.getLifeValue());
}
}
class Hero {
//1 修改属性的可见性,即作用域为private
private int lifeValue = 5000;
/**
-
2 创建getter/setter方法
-
@return
*/
public int getLifeValue() {
return lifeValue;
}
public void setLifeValue(int lifeValue) {
this.lifeValue = lifeValue;
}
}
2.3.1 内部类的定义
内部类(Inner Class)是在另一个类里面的一个类,包含内部类的类称为外部类。
内部类的作用如下:
-
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其它类访问该类;
-
内部类的方法可以直接访问外部类的所有数据,包括私有的数据。
2.3.2 内部类的种类
1)成员内部类
-
Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等;
-
Inner 类中定义的方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响;
-
定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:
外部类 外部对象名 = new 外部类;
内部类 内部对象名 =外部对象名.new 内部类( );
2)静态内部类
静态内部类是 static 修饰的内部类,这种内部类的特点是:
4. 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员
的方式访问 ;
5. 如果外部类的静态成员与内部类的成员名称相同,可通类名.静态成员
访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过成员名
直接调用外部类的静态成员;
6. 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类()
。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
,同时减轻大家的负担。**
[外链图片转存中…(img-Jl1lDHxo-1715703420604)]
[外链图片转存中…(img-gRimDAOs-1715703420605)]
[外链图片转存中…(img-5sxHUw58-1715703420605)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!