Java基础(一)——面向对象
一、对象
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基础(一)——面向对象的更多相关文章
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)
---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...
- Java基础之面向对象以及其他概念
一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. JR ...
- 【Java基础】面向对象下
面向对象下 这一章主要涉及其他关键字,包括 this.super.static.final.abstract.interface.package.import 等. static 在 Java 类中, ...
- 【java基础】面向对象的三大基本特征之-------继承
面向对象的三大特征:封装,继承,多态 java通过extends关键字来实现继承,而且是单继承,一个子类只可以有一个直接父类,但是父类还可以有父类... java.long.Object是所有类的父类 ...
- 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类
---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...
- 再探java基础——对面向对象的理解(1)
对象 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象具有属性和行为,在程序设计中对象实现了数据和操作的结合,使数 ...
- Java基础(6)- 面向对象解析
java面向对象 对象 知识点 java 的方法参数是按值调用,是参数的一份拷贝 封装 使用private将 属性值/方法 隐藏,外部只能调用 get,set方法/非private 的接口 获取 重载 ...
- Java基础总结--面向对象1
---面向对象的概念---1.面向过程与面向对象的区别面向过程:是一种思维习惯,解决一个问题的时候靠的是一个个方法调用--核心是动作面向对象:是一种更接近生活中解决问题的思维习惯,解决特定的问题靠对象 ...
- Java基础知识➣面向对象(八)
概述 Java和C#都是面向对象语言,面向对象编程是目前高级语言习惯的编程模式,与C++编写过程编程而言,面向对象使用起来高效.灵活:面向对象的三个特征:封装.继承和多态. Java面向对象 1.类封 ...
随机推荐
- Nacos 自动更新配置不生效问题
版本 Nacos 1.4.1 SpringCloud 2020.0.3 解决方案 bootstrap.properties 增加应用名配置即可 spring.application.name=serv ...
- 建立安全SSL连接PostgreSQL数据库服务器
建立安全SSL连接PostgreSQL数据库服务器当前物联网的挑战之一就是提供最高的安全级别.这就是为什么需要开启SSL连接到 PostgreSQL. 当你想要安全的存储数据到PostgreSQL数据 ...
- 2020年度钻石C++C学习笔记(1)《博学谷》
1.C语言概述 1.1 什么是C语言 一提到语言这个词语,自然会想到的是像英语.汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具. 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交 ...
- Java异常01——捕获和抛出异常
捕获和抛出异常 异常处理五个关键字 try , catch , finally , throw , throws try catch finally(快捷键:选中要要监控的代码语句 快捷键: ctrl ...
- 606页Android最新面试题含答案,助力成为offer收割机
如何才能通过一线互联网公司面试?相信这是很多人的疑惑,希望看完本篇文章能给大家一些启发. 下面是我花了将近一个月的时间整理的一份面试题库.这些面试题,包括我本人自己去面试遇到的,还有其他人员去面试遇到 ...
- .NET Core/.NET5/.NET6 开源项目汇总13:模板引擎
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- git submodule 操作
git submodule foreach git status 举一反三,对所有子库的操作,都可以使用 git submodule foreach 做前缀 foreach,可以记忆为for each ...
- Java-Mybatis动态SQL整理
XML映射器 SQL映射文件的几个顶级元素: cache - 该命名空间的缓存配置 cache-ref - 引用其他命名空间的缓存配置 resultMap - 描述如何从数据库结果集中加载对象 sql ...
- Java 多线程与并发【原理第一部分笔记】
Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...
- C++ 基于STL的演讲比赛流程管理系统(sort算法+小型算法(accumulate)+内建函数对象+string字符串拼接+字符串截取+多个容器基础操作+与用户交互+文件的读写+保存+重建+整体文件数据的清空)
1 /* 2 比赛规则: 3 学校举行一演讲比赛,共12个人参加,比赛两轮,第一轮为淘汰赛 第二轮为决赛 4 每名选手都有对应的编号:如10001~10012 5 比赛方式:分组比赛 每组6人 6 第 ...