一、对象

1、成员变量和局部变量的区别

  两类变量同名时,局部变量具有更高的优先级。

  作用域不同:局部变量的作用域仅限于定义它的方法,作用于函数或者语句中;成员变量的作用域在整个类中。

  初始值不同:Java会给成员变量一个初始值;Java不会局部变量赋予初始值。

  在内存中的位置:成员变量存在堆内存中,因为对象的存在而存在;局部变量存在栈(局部变量表)内存中。

2、构造函数

  特点:函数名与类名相同。不用定义返回值类型。不可以写return语句。

  注意:默认构造函数的特点。多个构造函数是以重载的形式存在的。一般函数不能调用构造函数。

3、构造代码块

  在类的声明中,可以包含多个构造代码块,当创建类的实例时,会依次执行这些代码块 。

  作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。

  与构造函数的区别:构造代码块是给所有对象进行统一初始化,是对不同对象的共性进行初始化,而构造函数是给对应的对象初始化。

代码示例:

 1 public class Test {
2 // 构造代码块
3 {
4 num = 200;
5 }
6 public int num = 10;
7
8 public static void main(String[] args) {
9 Test test = new Test();
10
11 System.out.println(test.num); // 10
12 }
13 }
14
15
16 public class Test {
17 public int num = 10;
18 {
19 num = 200;
20 }
21
22 public static void main(String[] args) {
23 Test test = new Test();
24
25 System.out.println(test.num); // 200
26 }
27 }

面试点

4、对this的理解

  this到底代表什么?

  this代表本类的对象。代表它所在函数所属对象的引用(函数和变量是属于哪个对象的。或者说是哪个对象在调用这个函数,这个变量,他就属于哪个对象)。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。

  this的作用:用于区分成员变量和局部变量。用于构造函数之间的调用。

  this的应用:当定义类中函数时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。但凡是本类功能内部用到本类对象时,用this。this语句:用于构造函数之间的相互调用。且只能用this (不能直接访问)。且必须是构造函数中的第一个语句,因为初始化要先执行。

1 class Person {
2 public Person() {
3 Person("kk"); // this("kkk");
4 }
5
6 public Person(String name) {
7
8 }
9 }

会报编译错误

二、静态static

1、介绍

  static关键字,只能用于修饰成员(成员变量和成员函数)。

①、被修饰后的成员具有以下特点

  • 随着类的加载而加载(重点理解)。消失而消失。
  • 优先于对象存在(重点理解)。
  • 被所有对象所共享。
  • 可以直接被类名调用。

②、存储区

  • 类变量随着类的加载而存在于方法区。
  • 实例变量随着对象的建立而存在于堆内存中。

③、生命周期

  • 类变量随着类的存在而存在,消失而消失。它的生命周期最长。
  • 实例变量生命周期随着对象的消失而消失。

④、注意

  • 静态方法只能访问静态成员,无法从静态上下文访问非静态变量。
  • 静态方法中不可以写this,super关键字。因为静态优先于对象存在。
  • 主函数是静态的。
  • 静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!

2、main函数

  主函数是一个特殊的函数,作为程序的入口,格式是固定的,可以被JVM调用。JVM在调用主函数时,传入的是new String[0]。定义如下:

  public:代表该函数访问权限是最大的。

  static:代表主函数随着类的加载就已经存在了。

  void:主函数没有具体的返回值。

  main:不是关键字,但是是一个特殊的单词,可以被JVM识别。

  String[] args:函数的参数,参数类型是一个字符串数组。

3、静态代码块

  先看代码(无继承关系)。下面再解释。

 1 public class StaticTest {
2 static {
3 System.out.println("StaticTest 静态代码块");
4 }
5
6 {
7 System.out.println("StaticTest 构造代码块");
8 }
9
10 public StaticTest() {
11 System.out.println("StaticTest 构造器");
12 }
13
14 public static void main(String[] args) {
15 System.out.println("-------------A----------");
16
17 new T().method();
18 new T();
19
20 System.out.println("-------------B----------");
21
22 new StaticTest();
23 }
24 }
25
26 class T {
27 static {
28 System.out.println("1");
29 }
30
31 {
32 System.out.println("2");
33 }
34
35 public T() {
36 System.out.println("3");
37 }
38
39 public void method() {
40 System.out.println("T-----method");
41 }
42 }
43
44 // 结果
45 StaticTest 静态代码块
46 -------------A----------
47 1
48 2
49 3
50 T-----method
51 2
52 3
53 -------------B----------
54 StaticTest 构造代码块
55 StaticTest 构造器

面试点

  解释:首先,记住几个知识点:

①、静态代码块随着类的加载而执行,因为一个类只会被加载一次,所以静态代码块也只执行一次。且优先于main函数。

②、先有类,再有对象。构造代码块优先于构造函数(这个下一节还会提到)。

  这样,就不难得出上面的结果。

①、因为main方法是StaticTest类的,所以执行main之前,需要装载StaticTest类,那么装载StaticTest,就会执行他的静态代码块。

②、new T().method();需要创建 T 的对象,就需要装载 T 类,同理,装载 T 类会执行 T 的静态代码块,后面是 2  3 不难理解。然后调用method()方法。

③、new T();由于一个类只会被装载一次。所以后面再是 2  3 。 没有 1 。接着后面的打印也不难理解。

  再看代码(有继承关系)。

 1 // 有继承关系
2 public class Son extends Father {
3 static {
4 System.out.println("6");
5 }
6
7 {
8 System.out.println("7");
9 }
10
11 public Son() {
12 // 会默认调用父类的无参构造器 super();
13 System.out.println("8");
14 }
15
16 public static void main(String[] args) {
17 new Son();
18 }
19 }
20
21 class Father {
22 static {
23 System.out.println("1");
24 }
25
26 {
27 System.out.println("2");
28 }
29
30 public Father() {
31 System.out.println("3");
32 }
33 }
34
35 // 结果
36 1 6 2 3 7 8

面试点

  解释:一点,先父类后子类。再结合上面的知识点,不难理解结果。

三、对象的初始化过程

  知识点:

①、类先于对象。

②、父类先于子类。

③、对象中,成员变量初始化步骤。默认初始化(int num = 0)-->显示初始化、构造代码块初始化-->构造器初始化。

  特别注意:这里的显示初始化、构造代码块初始化,没有绝对的先后顺序,取决于你源代码中的顺序执行。还记得本文中,第一个贴代码"面试点"的位置么?

 1 public class Test {
2 public static void main(String[] args) {
3 new KK();
4 }
5 }
6
7 class KK {
8
9 {
10 System.out.println("1");
11 }
12
13 {
14 System.out.println("2");
15 }
16
17 public KK() {
18 System.out.println("KK");
19 }
20
21 Y y = new Y();
22 }
23
24 class Y {
25 public Y() {
26 System.out.println("Y");
27 }
28 }
29
30 // 结果
31 1 2 Y KK

面试点

  Y y = new Y();在类 KK 中的位置不同,结果不同,读者可自己验证。

四、封装、继承、多态

  这个不多阐述,请读者自行百度。

1、封装

2、继承

3、多态

4、final关键字

  final可以修饰类,方法,变量和属性。

①、特点:

  • final修饰的类不可以被继承。
  • final修饰的方法不可以被覆盖。
  • final修饰的变量是一个常量,只能被赋值一次。
  • 内部类只能访问被final修饰的局部变量。

final修饰属性不会进行隐式的初始化,必须显示赋值。或在构造方法中显示初始化,但二者只能选其一。

五、抽象类和接口

  这里不阐述他们的区别之类的,请读者自行百度。

  后面会专门有小节做详细介绍。

Java基础(一)——面向对象的更多相关文章

  1. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  2. 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)

    ---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...

  3. Java基础之面向对象以及其他概念

    一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. JR ...

  4. 【Java基础】面向对象下

    面向对象下 这一章主要涉及其他关键字,包括 this.super.static.final.abstract.interface.package.import 等. static 在 Java 类中, ...

  5. 【java基础】面向对象的三大基本特征之-------继承

    面向对象的三大特征:封装,继承,多态 java通过extends关键字来实现继承,而且是单继承,一个子类只可以有一个直接父类,但是父类还可以有父类... java.long.Object是所有类的父类 ...

  6. 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类

    ---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...

  7. 再探java基础——对面向对象的理解(1)

    对象 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象具有属性和行为,在程序设计中对象实现了数据和操作的结合,使数 ...

  8. Java基础(6)- 面向对象解析

    java面向对象 对象 知识点 java 的方法参数是按值调用,是参数的一份拷贝 封装 使用private将 属性值/方法 隐藏,外部只能调用 get,set方法/非private 的接口 获取 重载 ...

  9. Java基础总结--面向对象1

    ---面向对象的概念---1.面向过程与面向对象的区别面向过程:是一种思维习惯,解决一个问题的时候靠的是一个个方法调用--核心是动作面向对象:是一种更接近生活中解决问题的思维习惯,解决特定的问题靠对象 ...

  10. Java基础知识➣面向对象(八)

    概述 Java和C#都是面向对象语言,面向对象编程是目前高级语言习惯的编程模式,与C++编写过程编程而言,面向对象使用起来高效.灵活:面向对象的三个特征:封装.继承和多态. Java面向对象 1.类封 ...

随机推荐

  1. winform制作简易屏幕保护工具

    效果如下: 具体实现代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  2. C/C++入门

    C:面向过程-函数 C++:面向对象-类:向下兼容C 程序包含头文件+主函数 简单数据类型 long long型赋超过int型范围的初值,需要在初值后面加上LL,否则可能会编译错误 不要使用float ...

  3. openssl not found 离线安装的openssl问题

    离线安装问题 正常我们在Linux中按照 nginx的openssl依赖都是通过 yum来安装的,但是由于一些特殊的服务器公司不让服务器连接互联网,所以就导致我们必须通过离线方式来进行安装,但是我们离 ...

  4. XCTF-ics-05(文件包含+preg_replace函数/e修正符下的代码执行漏洞)

    记一道preg_replace函数/e模式下的代码执行漏洞利用的题. 只有设备维护中心页面可以进入,页面没有什么可点击的,查看源代码,发现这里有个参数. 拼接到url,页面显示index,拼接/etc ...

  5. Android面试大揭秘!从技术面被“虐”到征服CTO,全凭这份强到离谱的pdf

    在笔者面试这一个月,看了不少文章,也刷了不少面试题,但真正有深度,适合4年及以上Android高工的内容少之又少 在面试准备阶段,笔者准备了三个月左右的时间,结合相关资料及源码,完成了一系列的深度学习 ...

  6. .NET Core/.NET5/.NET6 开源项目汇总13:模板引擎

    系列目录     [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...

  7. Build a Beautiful oh-my-zsh Themes

    Selection Criteria double line; provide username, hostname, current directory; provide information o ...

  8. 解决SecureCRT中删除会话后无法重建问题

    SecureCRT和SecureFX中创建一个会话(例如名为"10.0.2.47")后,如果删除这个会话,然后再创建一个同样名字的会话,就会报错,原因是SecureCRT在C盘上创 ...

  9. [源码解析] 机器学习参数服务器Paracel (3)------数据处理

    [源码解析] 机器学习参数服务器Paracel (3)------数据处理 目录 [源码解析] 机器学习参数服务器Paracel (3)------数据处理 0x00 摘要 0x01 切分需要 1.1 ...

  10. Typora+Markdown便捷发布blog

    参考文章:https://www.cnblogs.com/Heroge/p/12459762.html 需要下载Typora和dotnet Typora下载链接:https://www.typora. ...