Java开发必备的三大修饰符

 更新时间:2021年06月02日 15:26:16   作者:北夷烟雪江中雨  
JAVA的三个修饰:static,final,abstract,在JAVA语言里无处不在,但是它们都能修饰什么组件,修饰组件的含义又有什么限制,总是混淆.所以来总结一下,需要的朋友可以参考下

一、abstract 抽象的

抽象类:被abstract 修饰的类
语法: abstract class  类名{}

抽象方法 : 被abstract 修饰的方法
定义语法:
    访问修饰符  abstract 返回值类型 方法名(参数列表);
	abstract 访问修饰符   返回值类型 方法名(参数列表);
特点:
	1.当一个类中存在抽象方法 那么这个类也必须是抽象的
	2.一个抽象类中可以有抽象方法也可以有非抽象方法
	3.如果一个类继承了抽象类,这个类如果不想成为抽象类,那么这个类必须实现抽象类中的所有抽象方法
	4.抽象类不能创建对象,但是可以声明引用,抽象类的对象是存在的,是由子类创建子类对象时调用父类构造方法创建的,是无法自己手动去new 抽象类的对象的

抽象类的好处:强制使用多态

案例:

public class Demo{
    public static void main(String[] args) {
           
    }
    
}


abstract class Animal{
    //抽象方法
    public abstract void eat();
    public abstract  void sleep();
    public void m1() {
        System.out.println("m1");
        
    }
}

class Dog extends Animal{
    public  void eat(){
        System.out.println("狗吃屎");
        
    }
    public  void sleep(){
        System.out.println("狗睡");
    }
}


案例:
public class Demo{
    public static void main(String[] args) {
        Animal a = new Dog();  
    }
    
}


abstract class Animal{
    public  Animal() {
        System.out.println("动物类的构造被调用 创建了 对象");
        
    }
    
    
    //抽象方法
    abstract public  void eat();
    public abstract  void sleep();
    public void m1() {
        System.out.println("m1");
        
    }
}

class Dog extends Animal{
    public  void eat(){
        System.out.println("狗吃屎");
        
    }
    public  void sleep(){
        System.out.println("狗睡");
    }
}

二、static 静态的

static修饰成员变量:类变量 静态变量 静态属性
定义语法:
	访问修饰符  static   数据类型  变量名 = 变量值;
	static   访问修饰符     数据类型  变量名 = 变量值;
访问的方式(特点)
	1.类变量可以用 类名.属性名 访问
	2.可以通过创建对象 用引用去访问 (不推荐)

案例:
public class Demo{
    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();

        t1.a++;
        t1.b++;

        System.out.println(t2.a);//10
        System.out.println(t2.b);//21
        
        
    }
      
}

class Test{
   int a = 10;//实例变量
   static int b = 20;//类变量
 
}

案例2:
public class Demo{
    public static void main(String[] args) {
        /*Test t1 = new Test();
        Test t2 = new Test();

        t1.a++;
        t1.b++;

        System.out.println(t2.a);
        System.out.println(t2.b);*/

        System.out.println(Test.b);//20   
    }
      
}

class Test{
   int a = 10;//实例变量
   static int b = 20;//类变量
 
}
static修饰成员方法: 静态方法
语法:
	访问修饰符  static  返回值类型  方法名(形参列表){
		方法的实现;
	}
	static 访问修饰符    返回值类型  方法名(形参列表){
		方法的实现;
	}

特点:
	1.静态的方法中 不可以直接访问非静态的成员(成员变量 和  成员方法)
	2.如果要访问非静态的成员  必须创建对象 通过引用取访问
	3.静态方法可以通过 类名.方法名() 访问  也可以通过引用去访问(不建议)
	4.静态的方法可以被继承   静态的方法不能被非静态的方法所覆盖 只能被静态方法覆盖  但是没有多态(引用是什么类型 调用的方法就是这个类型中的方法)
	5.在静态方法中是不可以使用 this 和 super 关键字  因为 this 和 super都是和对象有关的  而静态的成员和对象无关 先于对象存在
案例:关于静态方法 访问非静态的成员
public class Demo{
    public static void main(String[] args) {
        /*Test t1 = new Test();
        Test t2 = new Test();

        t1.a++;
        t1.b++;

        System.out.println(t2.a);
        System.out.println(t2.b);*/

        //System.out.println(Test.b);//20
        
        
        
    }
      
}

class Test{
    int a = 10;//实例变量
    static int b = 20;//类变量
    
    //静态方法
    public  static void m1() {
        m2();
        //System.out.println(a);
    }
    //成员方法
    public void m2() {
        
    }
}

案例:关于 静态方法的使用  和  通过引用去访问非静态的成员
public class Demo{
    public static void main(String[] args) {
        
        //Test.m1();
        Test t = new Test();
        t.m1();
        
    }
      
}

class Test{
    int a = 10;//实例变量
    static int b = 20;//类变量
    
    //静态方法
    public  static void m1() {
        Test t = new Test();
        System.out.println(t.a);
        t.m2(); 
    }
    //成员方法
    public void m2() {
        System.out.println("m2");
    }
}

案例:关于 静态方法被继承
public class Demo{
    public static void main(String[] args) {
        /*Dog d = new Dog();
        d.eat();*/

        Dog.eat();
       
        
    }
      
}

//定义动物类
class Animal{

    public static  void eat() {
        System.out.println("动物吃");
        
    }
}

class Dog extends Animal{

    
}

案例:关于 静态方法中是否能使用 this 和 super  
public class Demo{
    public static void main(String[] args) {
        /*Dog d = new Dog();
        d.eat();*/

        //Dog.eat();
       
        /*Animal a = new Dog();
        a.eat();*/

        Dog.eat();
    }
      
}

//定义动物类
class Animal{
    String sex = "狗妖";
    public static  void eat() {
        System.out.println("动物吃");
        
    }
}

class Dog extends Animal{
    
    /*static String name = "金毛";
    static int age = 3;*/
    String sex = "母";//成员变量
    public static void eat() {
        String sex = "公"; //局部变量
        System.out.println(super.sex);
        
        /*System.out.println(name);
        System.out.println(age);
        System.out.println("狗吃");*/
        
    }
    
    
    
}
初始代码块:定义在类中 方法外 用于在创建对象时 和 成员变量 按照从上向下的顺序执行初始化的操作 也叫做 动态代码块
语法:
	{初始化代码块 }
	
案例:
public class Demo{
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.a);
        System.out.println(t.b);
        System.out.println(t.c);
        
    }
      
}

class Test{
    int a = 10;
    int c;
    int b;
    {//初始化属性的
        c = 30;
        b = 20;
    }
}

static 修饰初始化代码块:静态代码块

静态代码块的作用:在类加载时 和静态的属性 按照顺序执行 为类进行初始化操作
语法:
static{
        
} 

案例:
public class Demo{
    public static void main(String[] args) {
        System.out.println(Test.a);
        System.out.println(Test.b);
        
        
    }
      
}

class Test{
    static int a = 20;
    static{
        b = 40;
    }
    static int b;
    
}
注意:静态变量 时有默认值  先进行赋默认值 再初始化
==================================================================
类加载:当jvm第一次使用一个类时 需要通过classpath 找到.class = 字节码文件 
读入这个类中的信息(包名  类名   属性   方法  静态的变量   静态的方法 。。。)并保存在虚拟机中  类加载只进行一次

类加载的时机:
	1.创建对象时
	2.类名访问静态成员(静态属性  静态方法)
	3.子类进行类加载时 会先进行父类的类加载
	
案例:关于 1和2 两种情况类加载
public class Demo{
    public static void main(String[] args) {
        //1.创建对象
        //Test t = new Test();
        //2. 访问静态的成员
        System.out.println(Test.a);
        
      
        
    }
      
}

class Test{
    static int a = 20;
    static{
        System.out.println("父类 类加载了");
        
    }
}

案例:关于 3 情况的类加载
public class Demo{
    public static void main(String[] args) {
       
        //创建子类的对象
        //Sub s = new Sub();
        System.out.println(Sub.b); 
    }    
}

class Test{
    static int a = 20;
    static{
        System.out.println("父类 类加载了");
        
    }
}

class Sub extends Test{
    static int b = 30;
    static{
        System.out.println("子类进行类加载了");
        
    }
}

三、final 最终的

修饰变量

局部变量:final修饰的局部变量只能赋值一次 值一旦赋值不可以改变
常量的定义:
	 public static final double PI = 3.14159265457;
案例:
public class Demo{
    public static void main(String[] args) {
        int a = 20;//局部变量
        final int b = 10; 
        a++;
        b++;
        System.out.println(a);
        System.out.println(b);
        
    }   
}

public class Demo{
    public static void main(String[] args) {
        final int a ;//声明
        a = 10;
        a = 20;//报错
        System.out.println(a);
        
    }   
}

实例变量
	特点:
	1.final修饰的实例变量没有默认值
	2.final修饰的实例变量只能赋值一次
	3.final修饰的实例变量可以在构造方法中初始化 但是要保证每个构造都必须能够为这个变量初始化
案例:
public class Demo{
    public static void main(String[] args) {
        Animal a = new Animal(250);
        //System.out.println(a.a);//0
        System.out.println(a.b);
        
        
        
    }   
}

class Animal{
    /*int a = 10;//实例变量
    final int b = 20;*/

    int a;
    final int b = 20;

    public  Animal(int b) {
        this.b = b;
    }  
}

public class Demo{
    public static void main(String[] args) {
        Animal a = new Animal(250);
        //System.out.println(a.a);//0
        System.out.println(a.b);
        
        
        
    }   
}

class Animal{
    /*int a = 10;//实例变量
    final int b = 20;*/

    int a;
    final int b ;

    public  Animal(int b) {
        this.b = b;
    }

    public  Animal() {
        b = 30;
    }  
}


类变量
特点:
	1.final修饰的类变量没有默认值
	2.final修饰的类变量可以通过静态代码块进行初始化
案例:
public class Demo{
    public static void main(String[] args) {
        System.out.println(Animal.a);
        System.out.println(Animal.b);
        
        
        
    }   
}

class Animal{
    static int a ;
    final static int b ;

    static{
        b = 250;
    }
    
    
}


修饰方法

成员方法:
特点:
	1.final修饰的成员方法可以重载
	2.final修饰的成员方法不可以被覆盖
语法:
public final void m1() {
        
}
final public  void m1() {
        
}
案例:
public class Demo{
    public static void main(String[] args) {
       
        
        
        
    }   
}

class Animal{
    
    public   void m1() {
        System.out.println("m1");
        
    }
}

class Dog extends Animal{

    public  final void m1() {
        System.out.println();
        
    }
    
    
}


静态方法:
特点:
	1.final修饰的静态方法可以重载
	2.final修饰的静态方法不可以被覆盖
案例:
public class Demo{
    public static void main(String[] args) {
           
    }   
}

class Animal{
    
    public final static  void m1() {
        System.out.println("m1");
        
    }

    public final static void m1(int a) {
        System.out.println("m1");
        
    }
}

class Dog extends Animal{
    
    
}


修饰类

语法:
final class Animal{
}
特点:final修饰的类没有子类 俗称断子绝孙类

jdk的类库中有哪些final修饰的类?
String  Math  System 

案例:
public class Demo{
    public static void main(String[] args) {
      	
    }   
}



class Dog extends System{
    
}

四、关于修饰符混搭的原则

class Animal{

public final static  void m1() {
    System.out.println("m1");
    
}

public final static void m1(int a) {
    System.out.println("m1");
    
}

}

class Dog extends Animal{

}

##### 修饰类

```java
语法:
final class Animal{
}
特点:final修饰的类没有子类 俗称断子绝孙类

jdk的类库中有哪些final修饰的类?
String  Math  System 

案例:
public class Demo{
    public static void main(String[] args) {
      	
    }   
}



class Dog extends System{
    
}

五、关于修饰符混搭的原则

在这里插入图片描述

在这里插入图片描述

到此这篇关于Java开发必备的三大修饰符的文章就介绍到这了,更多相关Java三大修饰符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解使用Jenkins自动编译部署web应用

    详解使用Jenkins自动编译部署web应用

    本篇主要介绍基于Jenkins实现持续集成的方式,通过案例介绍线上自动编译及部署的配置过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Maven Optional依赖属性的含义及妙用

    Maven Optional依赖属性的含义及妙用

    这篇文章主要为大家介绍了Maven Optional依赖属性的含义及妙用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 基于java中的流程控制语句总结(必看篇)

    基于java中的流程控制语句总结(必看篇)

    下面小编就为大家带来一篇基于java中的流程控制语句总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java 抽象类定义与方法实例详解

    Java 抽象类定义与方法实例详解

    这篇文章主要介绍了java 抽象类与接口的区别介绍的相关资料,需要的朋友可以参考下...
    2017-04-04
  • Java控制台版五子棋的简单实现方法

    Java控制台版五子棋的简单实现方法

    这篇文章主要给大家介绍了关于Java控制台版五子棋的简单实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 使用Java实现大小写转换实例代码

    使用Java实现大小写转换实例代码

    最近在开发项目中遇到一个比较好用的方法,那就是对字符串中的字母大小进行转换,所以下面这篇文章主要给大家介绍了关于如何使用Java实现大小写转换的相关资料,需要的朋友可以参考下
    2022-06-06
  • HttpClient实现文件上传功能

    HttpClient实现文件上传功能

    这篇文章主要为大家详细介绍了利用HttpClient实现文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 将idea中xml文件背景颜色去除的图文教程

    将idea中xml文件背景颜色去除的图文教程

    这篇文章主要介绍了将idea中xml文件背景颜色去除,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java打印数组的三种方法整理

    Java打印数组的三种方法整理

    许多学编程专业的同学面试的时候,考官都会问到Java如何打印数组这样的问题,下面这篇文章主要给大家介绍了关于Java打印数组的三种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 深度剖析Java成员变量、局部变量和静态变量的创建和回收时机

    深度剖析Java成员变量、局部变量和静态变量的创建和回收时机

    这篇文章主要介绍了深度剖析Java成员变量、局部变量和静态变量的创建和回收时机,成员变量是定义在类中的变量,每个类的实例都会拥有自己的成员变量。它们的生命周期与对象的创建和销毁相对应,下面我将详细介绍它们的特点和生命周期,需要的朋友可以参考下
    2023-07-07

最新评论