写点什么

Java 面向对象精讲【下】

作者:XiaoLin_Java
  • 2021 年 12 月 07 日
  • 本文字数:2766 字

    阅读完需:约 9 分钟

Java 面向对象精讲【下】

简介

📢博客主页:https://www.infoq.cn/profile/F7BF297568FAA8/publish

📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!

📢本文由 XiaoLin_Java 原创🙉

📢不要等待机会,而要创造机会。✨

十、修饰符(static、final)

10.1、static 修饰符

static 修饰的字段和方法都直接属于类,不属于该类的对象(字段和方法属于谁,就让谁来调用)


  • 有 static 修饰的变量和方法:属于类,直接用类名调用即可,在同一个类中调用可以省略类名不写

  • 没有 static 修饰的变量和方法:属于对象,必须先创建对象,然后用对象调用


注意:static 方法不能使用 super 和 this 关键字


因为static是类级别的,super和this是对象级别的,存在类的时候不一定存在对象,也就说使用类名调用static方法时,此时可能是没有对象的。
复制代码

10.1.1、静态方法

static 修饰的方法称为静态方法,归类所有,也称为类方法


修饰符 static 返回值类型 方法名(形参列表){
}
复制代码


静态方法有两种访问方式:


  1. 类名.静态方法名()

  2. 对象.静态方法名()Java 是不推荐这种访问机制的


静态方法的特性


  1. 静态方法中可以访问静态变量和其他静态方法

  2. 实例方法中可以访问静态成员变量以及静态成员方法

10.1.2、静态变量

在类中,用 static 关键字修饰的成员变量称为静态变量,归类所有,也称为类变量,类的所有实例对象都可以访问,被类的所有实例或者对象共享


static 数据类型 成员变量
复制代码


静态变量的访问


  1. 类名.静态变量

  2. 类的对象.静态变量(Java 不推荐

10.2、final 修饰符

final 的含义是最终的,不可改变的,可以修饰类、方法、变量,他是来限制某个类不可以有子类,不可以覆盖方法


final 修饰的类


表示最终的类,该类不可以再拥有子类


final public class Super {}public class Sub  extends Super{  //此行语法报错}
复制代码


final 修饰的方法


最终的方法,该方法不可以被子类覆盖


public class Super {  final public void doWork() {  }}
public class Sub extends Super{ public void doWork() { //此行语法报错 }}
复制代码


final 修饰的变量


表示常量,该变量只能赋值一次,不可以再重新赋值


  • 基本数据类型:表示的值不能再改变

  • 引用数据类型:所引用的地址不可以再改变


final int age = 17;age = 100;  //此行语法报错
final Dog d = new Dog();d.setAge(5); //d的字段值是可以改变的 d = new Dog(); //此行语法报错
复制代码

十一、代码块

直接使用{}括起来的一段代码区域,代码块里面的变量属于局部变量,仅在{}内有效


他有三种存在形式:普通代码块、构造代码块、静态代码块

11.1、普通代码块

直接定义在方法内部的代码块,一般的,不会直接使用局部代码块的,结合 if、while、for 等关键字使用,表示一块代码区域,作用域可以嵌套


public class CodeBlockDemo {  public static void main(String[] args) {    System.out.println("begin...");    {      //直接使用代码块,一般不用      int age = 17;    }    System.out.println(age);  //此行报错,超出age作用范围,就不能访问到了    if (100 > 5) {      System.out.println("100 > 5");    }    System.out.println("end...");  }}
复制代码

11.2、构造代码块

构造代码块在类的内部,方法的外部,随着一个对象的创建而执行一次,在构造方法前执行


package day09_ObjectAdvanced.Classing.StaticBlock;
/** * @author Xiao_Lin * @version 1.0 * @date 2020/12/9 16:29 */public class Dog { private String name; static String age="111";
{ System.out.println("我是构造代码块"); } public Dog(){ System.out.println("我是无参构造方法"); }
public Dog(String name){ System.out.println("我是有参构造方法"); }
public void shut(){ System.out.println("我是叫方法"); }
}
复制代码



如果需要在构造方法执行前加载一些资源(如读配置文件、XML 文件等等),我们可以把构造对象前的一切操作都放在构造代码块中执行

11.3、静态代码块

用 static 关键字所修饰的代码块称为静态代码块,位于类的内部、方法的外部,且只执行一次,在构造代码块、构造方法前执行


package day09_ObjectAdvanced.Classing.StaticBlock;
/** * @author Xiao_Lin * @version 1.0 * @date 2020/12/9 16:29 */public class Dog { private String name; static String age="111";
static { System.out.println("我是静态代码块"); }
{ System.out.println("我是构造代码块"); } public Dog(){ System.out.println("我是无参构造方法"); }
public Dog(String name){ System.out.println("我是有参构造方法"); }
public void shut(){ System.out.println("我是叫方法"); }
}
复制代码


十二、内部类

12.1、类的组织方式

12.1.1、类和类的平行关系

一个文件可以定义多个类,但只能存在一个 public 类,且文件的名字和 public 类的名字要保持一致


public class Dog{    }class Cat{    }
复制代码



Dog 和 Cat 地位一样,和分开定义两个文件是一模一样的

12.1.2、类和类之间包含关系

public class Outer {  public class Inner{ }}
复制代码


Outer 和 Inner 是包含关系,Outer 称为外部类,而 Inner 称为内部类,内部类 Inner 作为一个 Outer 的成员而存在


12.2、内部类的概述

什么是内部类,把一个类定义在另一个类的内部,把里面的类称之为内部类,把外面的类称之为外部类,内部类的分类有:


  1. 成员内部类

  2. 静态内部类

  3. 方法内部类

  4. 匿名内部类

12.3、匿名内部类

当一个类只使用一次,可以声明成匿名内部类


匿名内部类 必须有实现存在,多以实现接口居多


public class Outer {  public void print(){/*class Inner implements AInterface{@Overridepublic void showInfo() {System.out.println("inner.showInfo");}}new Inner().showInfo();*/      /*AInterface aInterface = new AInterface(){@Overridepublic void showInfo() {System.out.println("inner.showInfo");}};aInterface.showInfo();*/      // 通过匿名类创建匿名对象    new AInterface(){      @Override      public void showInfo() {        System.out.println("inner.showInfo");      }    }.showInfo();  }}
复制代码

十三、枚举类

枚举是一种特殊的类,固定一个类只能有哪些对象

13.1、枚举类的定义

public enum 枚举类型{  常量对象A、常量对象B、常量对象C}
复制代码


publicc enum Story{    HISTORY、ENGLISH、MATH}
复制代码


我们自定义的枚举类都是在底层直接继承了 java.lang.Enum 类,枚举中都是全局公共的静态常量,可以直接用枚举类名调用


Stroy story = Story.ENGLISH;
复制代码


因为 java.lang.Enum 类是所有枚举类的父类,所以所有的枚举对象可以调用 Enum 类中的方法


String  name = 枚举对象.name();      //  返回枚举对象的常量名称int  ordinal  = 枚举对象.ordinal();  //  返回枚举对象的序号,从0开始
复制代码


注意:枚举类不能使用创建对象

发布于: 3 小时前阅读数: 7
用户头像

XiaoLin_Java

关注

问啥啥都会,干啥啥不行。 2021.11.08 加入

问啥啥都会,干啥啥不行。CSDN原力作者,掘金优秀创作者。

评论

发布
暂无评论
Java 面向对象精讲【下】