一、对象

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. Nacos 自动更新配置不生效问题

    版本 Nacos 1.4.1 SpringCloud 2020.0.3 解决方案 bootstrap.properties 增加应用名配置即可 spring.application.name=serv ...

  2. 建立安全SSL连接PostgreSQL数据库服务器

    建立安全SSL连接PostgreSQL数据库服务器当前物联网的挑战之一就是提供最高的安全级别.这就是为什么需要开启SSL连接到 PostgreSQL. 当你想要安全的存储数据到PostgreSQL数据 ...

  3. 2020年度钻石C++C学习笔记(1)《博学谷》

    1.C语言概述 1.1 什么是C语言 一提到语言这个词语,自然会想到的是像英语.汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具. 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交 ...

  4. Java异常01——捕获和抛出异常

    捕获和抛出异常 异常处理五个关键字 try , catch , finally , throw , throws try catch finally(快捷键:选中要要监控的代码语句 快捷键: ctrl ...

  5. 606页Android最新面试题含答案,助力成为offer收割机

    如何才能通过一线互联网公司面试?相信这是很多人的疑惑,希望看完本篇文章能给大家一些启发. 下面是我花了将近一个月的时间整理的一份面试题库.这些面试题,包括我本人自己去面试遇到的,还有其他人员去面试遇到 ...

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

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

  7. git submodule 操作

    git submodule foreach git status 举一反三,对所有子库的操作,都可以使用 git submodule foreach 做前缀 foreach,可以记忆为for each ...

  8. Java-Mybatis动态SQL整理

    XML映射器 SQL映射文件的几个顶级元素: cache - 该命名空间的缓存配置 cache-ref - 引用其他命名空间的缓存配置 resultMap - 描述如何从数据库结果集中加载对象 sql ...

  9. Java 多线程与并发【原理第一部分笔记】

    Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...

  10. C++ 基于STL的演讲比赛流程管理系统(sort算法+小型算法(accumulate)+内建函数对象+string字符串拼接+字符串截取+多个容器基础操作+与用户交互+文件的读写+保存+重建+整体文件数据的清空)

    1 /* 2 比赛规则: 3 学校举行一演讲比赛,共12个人参加,比赛两轮,第一轮为淘汰赛 第二轮为决赛 4 每名选手都有对应的编号:如10001~10012 5 比赛方式:分组比赛 每组6人 6 第 ...