zoukankan      html  css  js  c++  java
  • 0123 final关键字,static 关键字

    1、final关键字

    (1)final关键字修饰类,那么这个被修饰的类叫做太监类,不可以被继承,没有子类。

    (2)final修饰方法,这个方法可以被继承但是不可以被重写,普通方法被重写后可以被final修饰

    (3)final修饰变量:一次赋值终身不变

    (4)final修饰成员变量(基本数据类型,引用数据类型):必须显示赋值,或者通过构造方法赋值

    (5)final修饰局部变量(基本数据类型,引用数据类型):定义时可以不赋值,用的时候再赋值

    创建一个爷爷类

    public class Ye {
    
    	public final void eat(){
    		System.out.println("爷爷吃饭");
    	}
    	public void sleep(){
    		System.out.println("爷爷睡觉");
    	}
    }
    

      创建一个父类

    public final class Fu extends Ye {
    	/*public void eat(){
    		
    	}*/
    	public final void sleep() {
    		// TODO Auto-generated method stub
    		super.sleep();
    	}
    
    }
    

      创建一个子类

    //不可以继承final修饰的父类
    public class Zi /*extends Fu*/{
    //
    	final int a=1;
    	/*public Zi(int a){
    		this.a=a;
    	}*/
    }

    注:Fu类是被final修饰的类,所以Zi类不可以继承Fu类。Fu类继承Ye类,不可以重写Ye类被final修饰的eat方法,重写Ye类中的sleep方法后可以再用final修饰。

    在Zi类中定义的int a被final修饰,要么定义时显示赋值,要么通过构造方法进行赋值,如果通过构造方法赋值,则需要以后每一个构造方法都需要再写赋值语句。一次赋值终身不变

      创建一个测试类,该测试类不依照上方的类测试

    public class Demo01 {
    
    	public static void main(String[] args) {
    		final int a;
    		a=2;
    		final Person p=new Person("bbb",18);
    		p.setName("aaa");
    		
    	}
    
    }
    

      在测试类中被final修饰的int a;定义时没有给赋值,用到的时候给a赋值了一个2。用final修饰引用数据类型时,创建对象可以直接赋值bbb,18,可以再将bbb改成aaa,原因是final修饰的引用数据类的地址值,地址值并没有发生改变,改变的是这个地址的属性,所以可以改动。

    2、static关键字

    被static修饰的成员变量属于类,不属于类的某个对象,也就是说,多个对象调用这个被static修饰的成员变量时,只要一个对象修改了这个成员变量的属性值,则所有调用这个成员变量的对象都发生了改变

    例:创建一个Student类

    public class Student {
    
    	private String name;
    	static String schoolname;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Student(String name) {
    		super();
    		this.name = name;
    	}
    	public Student() {
    		super();
    	}
    }
    

      创建一个测试类

    public class Demo01 {
    
    	public static void main(String[] args) {
    		Student s1=new Student("小红帽","清华大学");
    		Student s2=new Student("小兰帽","清华大学");
    		Student s3=new Student("小白帽","清华大学");
    		s3.schoolname="北京大学";
    		System.out.println(s1.getName()+"..."+Student.schoolname);
    		System.out.println(s2.getName()+"..."+Student.schoolname);
    		System.out.println(s3.getName()+"..."+Student.schoolname);
    	}
    }
    

      那么这个运行结果是

    小红帽...北京大学

    小兰帽...北京大学

    小白帽...北京大学

    图解:

    那我们说被static修饰的成员变量属于类,类需要用public修饰,可以直接通过类名调用,上述中用对象调用是不合适的,

    那更改一下代码、

    创建一个苏student类 里写一个静态方法

    public class Student {
    
    	private String name;
    	public static String schoolname;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Student(String name) {
    		super();
    		this.name = name;
    	}
    	public Student() {
    		super();
    	}
    	public static void eat(){
    		System.out.println("这是静态方法");
    	}
    }
    

      创建一个测试类

    public class Demo01 {
    
    	public static void main(String[] args) {
    		Student s1=new Student("小红帽");
    		Student s2=new Student("小兰帽");
    		Student s3=new Student("小白帽");
    		Student.schoolname="北京大学";
    		System.out.println(s1.getName()+"..."+Student.schoolname);
    		System.out.println(s2.getName()+"..."+Student.schoolname);
    		System.out.println(s3.getName()+"..."+Student.schoolname);
    		Student.eat();
    	}
    }
    

      static 修饰方法,静态方法不能访问非静态方法,非静态方法可以访问静态方法

     例:

           非静态方法get2可以访问静态的方法get
             public static void get(){
    		System.out.println("静态方法");
    	}
    	public  void get2(){
    		get();
    	}        
    

      注意事项:静态内容优先于对象的存在,只能访问静态,不能使用this和super关键字。在同一个类中静态成员只能访问静态成员。

    在多态种,所有的方法都是用的非静态方法和非静态成员变量,所以在调用成员变量时,编译运行都看左边,调用成员方法时,编译看左边,运行看右边

    如果在多态中,全部使用的静态成员变量和静态成员方法,则无论是调用成员变量还是成员方法,都是编译运行看左边

    例:创建一个Fu类

    public class Fu {
        static int a=1;
        static int b=2;
        public static void eat(){
    	System.out.println("父类吃饭");
        }
        public static void sleep(){
    	System.out.println("父类睡觉");
        }
    }
    

      创建一个子类继承Fu类

    public class Zi extends Fu{
        static int a=10;
        static int c=30;
        public static void eat(){
    	System.out.println("子类吃饭");
        }
        public static void play(){
        	System.out.println("子类玩耍");
        }
    }
    

      创建一个测试类

    public class Demo02 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		Fu f=new Zi();
    		System.out.println(f.a);
    		System.out.println(f.b);
    		//System.out.println(f.c);
    		f.eat();
    		f.sleep();
    		//f.play();
    	}
    
    }
    

      运行结果

    1
    2
    父类吃饭
    父类睡觉

    因为所有的成员变量和成员方法都用了static修饰,所以创建多态对象时,不能调用子类独有的变量和方法,编译运行时都以父类为基础(在这里不担心父类会有抽象方法,因为抽象方法abstract关键字与final关键字和static 关键字冲突,有static就不会有抽象方法)

    定义静态常量

    是用public static final 关键字修饰完成的

    定义格式 public static final 数据类型 变量名 = 值;

    当我们想使用类的静态成员,可以直接使用类名调用成员变量或者方法名

    注:在接口中每个成员变量都是默认的用public static final 来修饰的,所有接口中的成员变量已经是静态形式,因为接口中没有构造方法,所以必须显示赋值,可以直接通过接口名进行访问

  • 相关阅读:
    C语言内存调试技巧—C语言最大难点揭秘
    include .h 以及.cpp的记录
    VS2010中<无法打开包括文件:“iostream.h”:>错误解决方法
    #include<iostream>与#include<iostream.h>的区别
    VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
    【Oracle】Oracle日期格式详解
    【EasyUI】 日期格式化
    【TortoiseGit】TortoiseGit将本地库push到远端
    【Tomcat】解决Eclipse无法添加Tomcat Service问题
    【Tomcat】配置Tomcat
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14318060.html
Copyright © 2011-2022 走看看