当前位置:网站首页 > Java基础 > 正文

java基础例子讲解



🔥博客主页: A_SHOWY
🎥系列专栏:力扣刷题总结录 数据结构  云计算  数字图像处理  力扣每日一题_

一、类变量和类方法

1.1 引出类变量

 类变量的快速入门:类变量被所有对象实例共享

 

 1.2 类变量内存布局

 两种说法,有一点是肯定的,静态变量是被对象共享的,一种说法是在堆里,另一种说法是在静态域(jdk8以前)里面。

两点共识:

  1. static变量被同一个类的所有对象共享
  2. static类变量,在类加载的时候就生成

1.3 类变量定义 

类变量也叫静态变量/静态属性,是该类所有对象共享的变量 

1.4 如何定义类变量

 

1.5 如何访问类变量

 
 

如果static前面变成private,那么另一个就不能访问他了,遵循基础规则

*1.6 类变量使用细节 

 

1.7 类方法基本介绍 

形式:只需要普通方法前面加一个static        

调用:类名.类方法名或者对象名.类方法名   (满足访问修饰符的权限)

小例子:总学费

 

 1.8 类方法经典使用场景

如果我们不创建实例,也可以掉某个方法,及当作工具来使用! ,这时把方法做成静态方法合适

 *1.9 类方法使用细节

 4)注释:不能用是因为类变量和类方法随着类的加载而加载,类的加载比对象的创建要早,如果使用this或者super的话,会找不到这个对象5)静态方法只能访问静态成员

 1.10 课堂练习

(1)答案:9,10,11

(2)答案:

1.id++那里错的,类方法中只能访问静态变量和静态方法

2.输出是0和1,注意构造器这里不能是static所以这里没错

(3)答案: 

1.在静态方法中不能使用this

2.total的值最后等于4

总结:

  1. 静态方法只能访问静态成员
  2. 非静态方法可以访问所有成员
  3. 编写代码时候仍要遵守访问权限规则 

1.11 main方法 

注释:

1.一定记住:main方法由虚拟机调用

2.把public去了就直接不能执行了

5.问:你这个字符串数组【String【】 args】形参从哪里传进去的:是在执行这个程序的时候,在后边传进去的参数形成的数组        

 

这就是为什么我们每次访问非静态成员,都要创建个对象 !         

 

 1.12 补充:在idea中传递参数给java程序

 

 

二、代码块 

 2.1 基本介绍

2.2 基本语法

 2.3 快速入门

代码块的调用要优先于构造器,就比如构造器重载的时候,三个构造器,第一个构造器是一个参数,第二个是两个参数,第三个是三个参数,但是他们的内容都是一样的,这样就不如搞一个代码块放在最前面

2.4 代码块细节

  1.  代码块前面加一个staitc表示静态代码块,作用就是对类进行初始化,随着类的加载而执行,只会执行一次。如果是普通代码块,每次创建一个对象就执行,每创建一次就执行一次
  2. (重要)类什么时候被加载:1)当创建对象实例的时候(new)2)创建子类对象实例的时候,父类也会被加载 (比如说父类中有一个代码块,子类中也有一个,然后创建一个子类对象,他就会先加载一个父类的代码块再加载一个子类代码块)  3)使用类的静态成员时(这个类中的代码块会被加载) 
  3. 注意,如果只使用类的静态成员,普通代码块并不会执行!!!,因为类加载和这个普通代码块没有关系,普通代码块是构造器的补充,普通代码块调用了,他就被调用了
     
  4. (重点+难点) 创建对象的时候,在一个类中的调用顺序
     
  5. 构造器的最前面其实隐藏了super和调用普通代码块
  6. (综合带继承)顺序总结:先把静态的走完,剩下的从父类开始各走各的
  7. 静态代码块只能调用静态成员,普通代码块能调用所有代码块

在new的时候首先要进行类的加载,再进行创建对象 所以类的加载和静态相关的部分全部执行。设计到创建对象的时候就从父类开始了,因为子类隐藏了super()和普通代码块和普通属性的初始化等。参考5,其实综合起来核心就是

 2.5 代码块相关题目

题目一:答案:in static block ,total = 100,total = 100(因为类加载以后静态代码块就不再执行了)

题目二(重点题目):答案:

java基础例子讲解

静态成员sam初始化,static块执行,|(该普通成员了),Sam1成员初始化 ,|(该构造器了)Test默认构造函数被调用

三、单例设计模式 

 3.1 什么是单例模式

单例:就是单个的实例,大概意思是指该类只能有一个对象实例 

3.1.1 饿汉式

(因为是私有的,在类内创建,所以在还没有使用到的时候就已经创建好了, 饿汉式可能造成创建了对象没有使用就造成了浪费

 注:私有化的目的是防止直接new一个对象 

这里有个很奇妙的点,就是为什么创建的对象和这个提供的公共方法都必须是static因为首先如果方法不是static那么需要先创建类才能调用,但是这个是个私有的,没法创建类,所以必须是static,而静态方法只能用静态成员,所以内部创建的对象也必须static ,形成了完美闭环,非常的神奇。

 

3.1.2 懒汉式

单例模式的对象通常是重量级的对象,如果你创建了没有用就浪费了。饿汉式可能造成创建了对象但是没有使用的弊端。

 

代码中判断是否为空的目的,是假如说他再次创建对象肯定就不是空的了,这时候就不需要再重新创建一个对象,直接返回原有Cat对象即可,保存的单例模式的特征。 

四、final关键字 

4.1 基本介绍

4.2 细节

关于final修饰的静态属性初始化位置: 可以这样理解:因为是static和final,那么在类加载的时候就要创建好相应的属性,所以在构造器的时候修改,就违反了final不可修改的规定 。同时static在类加载的时候就要给值,它等不到你构造器创建对象!

 注释5:它都不能被继承了,都没有重写的必要了,一般我们重写都是继承了以后,想要特殊功能

注释7:从下列代码和结果可以看到直接使用类的静态成员导致类加载,但是final能抑制这个类加载,所以不会输出静态代码块! 

 

 

4.3 练习

4.3.1 练习1

 

4.3.2 练习2 

错误,++x修改了final修饰的值,但是形参加上final是对的 

五、抽象类

 5.1 抽象类的引出

父类方法的不确定性:当父类的某些方法需要声明,但是又不确定如何实现的时候,可以将其声明为抽象方法,那么这个类就是抽象类 ,一般来说抽象类会被继承,由其子类来实现

  5.2 抽象类的细节

  1. 抽象类不能被实例化
  2. 抽象类可以没有抽象方法 
  3. 一旦包含了抽象方法,那么这个类必须声明为抽象类
  4. abstract只能修饰类和方法,但是不能修饰属性和其他的
  5. 抽象类的本质还是类,所以类内部还是可以拥有任何可以拥有的方法
  6. 抽象类不能有主体,即不能实现
  7. 如果一个类继承了抽象类,它必须实现抽象类的所有方法,除非他自己也声明了抽象类//只要有方法体{}就称为实现了
  8. 抽象方法不能使用private ,final,static修饰,因为这些关键字和重写都是冲突的,private和final好理解,static的话:static修饰的方法是静态方法,其可以直接被类调用。而abstract是修饰的方法是抽象方法,即无代码体的方法,不能被直接调用,需要子类或者实现类去编写完整的方法处理逻辑了才能使用。

5.3 抽象类练习          

1)错误,因为final不能被继承,所以你这里抽象了,后边没法实现

2)错误static关键字和方法重写无关,具体看上面的第八条。

3)不行,因为私有的别人不能重写

4)太简单了不写了

5.4 抽象类**实践——模板设计模式 

 思路1:最容易想到的

 发现代码冗余,他们都有公共的代码部分,就是计算开始和结束时间,我们可以分别把这个抽出来,然后去改job但是还是很麻烦

 

思路2:抽象模板类(抽象类+动态绑定机制)

其实核心思想就是普通方法嵌套抽象方法,这样子只需要改抽象方法就行了

 

六、接口

6.1 快速入门

 

 这里在computer类中其实在形参部分有一个向上转型的思想,父类的引用指向子类的对象

6.2 基本介绍

 demo:

 

如果一个类 implements实现接口,需要将接口的所有抽象方法全部都实现 !

6.3 应用场景

核心就是统一管理

这里其实又用到了向上转型,这里用个static就是为了不创建对象了简单测试一下 

6.4 注意事项和使用细节 

 1.接口不能实例化,接口的作用是让别的类去实现它,再用实现它的类去实例化

2.接口中所有的方法是public方法,接口抽象方法中可以不用 abstract修饰

3.一个普通类实现接口就必须把该接口的所有接口都实现,可以使用alt+enter解决

4.抽象类实现接口,可以不用实现接口的方法

5.一个类可以同时实现多个接口 

 

6.接口中的属性,其实都是public static final 的,比如int a  = 1;其实就是public static final int a = 1;(必须初始化)

7.接口中属性的访问形式:接口名.属性名

8.一个接口不能继承其他的,但是能继承多个其他接口

9.接口的修饰符只能是public和默认 

6.5 接口练习

这三个都完全正确,static属性可以被直接使用,在这里有点像继承,这里要注意当final修饰类的时候才说明不能被继承

6.6 接口和继承类的比较

简单理解:实现机制对我们单继承机制的补充 ,就比如小猴子继承了老猴子的东西,但是想学飞行或者游泳需要实现小鸟的飞行和小鱼的游泳

6.7 接口的多态特性

 1.其实就是向上转型:父类的引用指向子类的对象

2. 多态数组

用到了判断运行类型instanceof + 向下转型去调用特有方法

 

3.接口存在多态传递的现象

6.8 接口课堂练习 

第一句话接口里面的等价于 public static final int x = 0;

pX函数父类是B,接口是A,这个x不明确是谁,以下方式可以解决

总结:

七、内部类

7.1 基本介绍

补:类的五大成员

属性、方法、构造器、代码块、内部类 

7.2 内部类的分类

7.3 局部内部类

说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名 

 

7.4 匿名内部类(最重要)

说明:匿名内部类是定义在外部类的局部位置,比如方法中并且没有类名

1) 本质是类 2)内部类 3)该类没有名字 4)同时还是一个对象

我的理解是就是这个匿名内部类起到一个简化作用,在做一个基于接口或者基于别的类的时候,只想用一次,每次调用接口都要创建一个新的类,那你创建一个匿名内部类省略了创建类的步骤 ,简化开发。这个匿名内部类用一次就没有了,你再new就不行了就是这个Outer04,但是返回的实例那个对象可以反复使用

demo1基于接口的匿名内部类

 

demo2基于类的匿名内部类

 

7.5 匿名内部类实践(使用场景)

demo1 用作实参直接传递

 

demo2  上一个demo的实例(自己能做出来牛逼)

 

7.6 成员内部类

说明:成员内部类是定义在外部类的成员位置,并且没有static修饰 

1.需要成员内部类定义在外部内的成员的位置上

2.可以添加任意的访问修饰符,因为他本身就是一个成员(public,protected等)

第六点比较重要,外部其他类去使用成员内部类,主要有两种方法

 

7.如果外部类和内部类的成员重名了,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员可以使用外部类名.this.成员去访问,和前面那个局部内部类是一样的

7.7 静态内部类 

说明:静态内部类是定义在外部类的成员位置,并且有static修饰

 

补:小总结

7.8 习题1 

判断输出结果

  • 上一篇: 电脑java基础
  • 下一篇: java视频基础教程
  • 版权声明


    相关文章:

  • 电脑java基础2025-04-14 14:18:05
  • java循环基础入门2025-04-14 14:18:05
  • 太原java基础2025-04-14 14:18:05
  • java最基础问题2025-04-14 14:18:05
  • java数据基础2025-04-14 14:18:05
  • java视频基础教程2025-04-14 14:18:05
  • java基础培训电话2025-04-14 14:18:05
  • JAVA基础原理书籍2025-04-14 14:18:05
  • java基础考核题目2025-04-14 14:18:05
  • java 基础手册2025-04-14 14:18:05