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.类封 ...
随机推荐
- solr(CVE-2020-13957)文件上传
影响版本 Apache Solr 6.6.0 - 6.6.5 Apache Solr 7.0.0 - 7.7.3 Apache Solr 8.0.0 - 8.6.2 环境搭建 下载环境 http:// ...
- 从Python到Go:初学笔记
本文记录了我在学习Go的过程时的一些笔记,主要是比较Python和Go之间的差异并作简单描述,以此使Python程序员对Go语言的特性有简略的了解.初学难免有纰漏,欢迎各位批评指正补充交流,谢谢. 数 ...
- Apache Superset1.2.0教程(四)—— CentOS环境安装
前文中,我们已经在windows环境进行了superset的安装,也对图表功能进行了展示.但是在平时使用以及生产环境中,还是需要在centos环境下进行操作. 本文将带大家详解在centos7环境进行 ...
- AQS学习(一)自旋锁原理介绍(为什么AQS底层使用自旋锁队列?)
1.什么是自旋锁? 自旋锁作为锁的一种,和互斥锁一样也是为了在并发环境下保护共享资源的一种锁机制.在任意时刻,只有一个执行单元能够获得锁. 互斥锁通常利用操作系统提供的线程阻塞/唤醒机制实现,在争用锁 ...
- Python--数据存储
新建测试文档测试.txt内容如下: 张三:今天天气真好. 李四:是的,真的太好了. 张三:阳光明媚. 李四:鸟语花香. 王五:装逼现场:请带好安全帽 张三:难得好天气,今天就不偷懒了. 李四:能把乞讨 ...
- Golang语言系列-04-运算符
运算符 Go语言内置的运算符有 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算术运算符 package main import "fmt" func main() { ...
- Windows内核-7-(IRP)I/O请求包
Windows内核-7-(IRP)I/O请求包 IRP(I/O Request Packet)就是一个进行I/O操作的请求包. IRP是一个结构体,谁分配谁就得释放,通常由执行体里的管理器,获取内核驱 ...
- metasploit的数据库配置
metasploit所处位置:/usr/share/metasploit-framework msf数据库连接命令:db_connect msf:msfadmin@127.0.0.1/msf 1.启动 ...
- Spring中的@Transactional必须要了解的概念
spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: 1 @Transactio ...
- Future有返回值的线程
//创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(100); //创建多个有返回值的任务 List<Future> ...