Java的final、static关键字,接口的概念及使用2020.04.30

1.final关键字

1.1final关键字概述

​ final表示最终的,可以用来修饰类,方法和变量。

1.2修饰类
  • 代码

    public final class Person {
        String name;  //姓名
        int age;      //年龄
    }
    
    //继承Person类报错
    public class Student /*extends Person*/{
    }
    
  • 作用

    • 被final修饰的类不能被继承。太监类。
1.3修饰方法
  • 代码

    //父类
    public class AAA {
    
        public final void method(){
            System.out.println("父类的方法");
        }
    }
    
    //子类
    public class BBB extends AAA{
      /*
        @Override
      	//父类的method方法是最终方法 所以不能重写
        public void method() {
            System.out.println("子类的重写方法");
        }
        */
    }
    
  • 作用

    • 被final修饰的方法不能被重写。
1.4修饰变量
  • 代码

    public class Demo修饰变量 {
        public static void main(String[] args) {
    
            final int a = 10;
            System.out.println(a); //10
    
            //被final修饰的变量是最终变量 只能赋值一次
            //a = 20;
            //System.out.println(a); //20
    
        }
    }
    
  • 作用

    • 被final修饰的变量不能再次改变,只能赋值一次,不能二次赋值。
  • 基本类型和引用类型的区别

    • 用final修饰基本数据类型时,值不能改变
    • 用final修饰引用数据类型时,地址值不能改变
    public class Demo02修饰变量 {
        public static void main(String[] args) {
            //创建学生对象
            final Student s = new Student();
            s.name = "柳岩";
            s.age = 36;
    
            //修改姓名与年龄
            s.name = "老王";
            s.age = 40;
    
            //以下这个代码会就报错了
            //s = new Student();
        }
    }
    
回顾数据类型知识点:
数据类型:
	基本数据类型:
		整数:
			byte  short  int  long 
		小数:
			float double
		字符:
			char
		布尔:
			boolean
	引用数据类型:
		类:
			String   Student	ArrayList  类有无数种.....
		数组:
			int[]   double[]   String[]
		接口:
			今天要学
		枚举:
			后面要学

2.static关键字

2.1static概述
  • 概述:

    ​ static是静态修饰符,用来修饰成员。

    ​ 被static修饰的成员属于类,不属于单个这个类的某个对象。 static修饰的成员被多个对象共享。

    ​ static修饰的成员属于类,但是会影响每一个对象。被static修饰的成员又叫类成员,不叫对象的成员。

  • 访问方式:

    可以使用:
    	对象名.静态成员
    	类名.静态成员
    建议使用: 
    	类名.静态成员
    
  • 示例代码:

    public class Student {
    
        String name;    //姓名
        int age;        //年龄
    
        //所有的学生都是中国国籍,如果定义成员变量每个对象需要单独赋值有点麻烦
        //想要让多个对象共享同一个国籍 就可以定义成静态变量
        static String country; //国籍
    }
    
    public class Demo静态的演示 {
        public static void main(String[] args) {
            //创建学生对象
            Student s = new Student();
            s.name = "柳岩";
            s.age = 36;
    
            //建议使用类名访问静态变量 不建议使用对象名访问静态变量
            //s.country = "中国";
            Student.country = "中国";
    
            //创建学生
            Student s2 = new Student();
            s2.name = "大鹏";
            s2.age = 37;
            //s2.country = "美国";
            Student.country= "美国";
    
            //打印学生信息
            System.out.println(s.name + " " + s.age + " " + Student.country);
            System.out.println(s2.name + " " + s2.age + " " + Student.country);
        }
    }
    执行结果:
    		柳岩 36 美国
    		大鹏 37 美国
    
2.2静态内存图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6yQh4rN-1588231553778)(img\静态的内存图.png)]

2.3 static成员的访问规则
  • 访问规则
    • 成员方法可以访问非静态成员,也可以访问静态成员
    • 静态方法可以访问静态成员,不可以直接访问非静态成员(如果要访问需要先创建对象)
  • 示例代码
public class Demo02静态的访问规则 {

    //成员变量
    String a;

    //静态变量
    static String b;

    //成员方法
    public void method1(){
        //结论:成员方法可以访问非静态成员也可以访问静态成员
        //访问成员变量
        System.out.println(a);
        //访问成员方法
        method2();
        //访问静态变量
        System.out.println(b);
        //访问静态方法
        method3();
    }

    //成员方法
    public void method2(){

    }

    //静态方法
    public static void method3(){
        //结论:静态方法可以访问静态成员,不能访问非静态成员
        //访问成员变量
        //System.out.println(a);
        //访问成员方法
        //method2();
        //访问静态变量
        System.out.println(b);
        //访问静态方法
        method4();
    }

    //静态方法
    public static void method4(){

    }
}
2.4静态的注意事项
  1. 静态方法可以直接访问静态,不能直接访问非静态。
  2. 成员方法可以直接访问静态,也可以直接访问非静态。
  3. 静态在内存中优先于对象存在,所以静态方法中,不能使用this关键字。
2.5静态的使用场景
  • 当类中所有对象需要共享一个变量时使用静态修饰(比如刚才国籍例子)

  • 静态修饰的成员可以使用类名直接访问比较方便,经常有变量用static 和 final同时修饰

    比如,圆周率就是定义在Math里面的一个static final修饰的变量

    public static final double PI = 3.14159265358979323846;
    
    使用方式:
    	System.out.println(Math.PI);
    

3.接口

3.1接口的概念
  • 概念:

    • 接口其实是一个规范。在java中接口用interface来表示。
    • 接口的使用和类很像。
  • 格式:

    public interface 接口名{
        
    }
    
3.2接口的实现

​ 接口和抽象类相似,他们都是父类,接口存在的意义就是要有子类实现

  • 格式:

    //BBB与AAA是实现类与接口的关系,
    //因为实现和继承的关系很像,所以我们口头习惯叫子类和父类
    public class BBB implements AAA {
    }
    
3.3接口的成员
  • 接口中的变量:

    • 接口中的变量其实都是常量,会默认被public static final修饰
  • 抽象方法:

    • 接口中定义的普通方法,会默认被public abstract修饰

    • JDK8默认方法 [一般不用]

    • JDK8静态方法 [一般不用]

    • JDK9私有方法 [一般不用]

  • 结论

    • 在接口中常用的就是【变量】和【抽象方法】,后面的三种方法基本不用。
  • 代码演示

    //接口
    public interface AAA {
    
        //接口中的变量其实都是常量(不可改变的),会默认被public static final修饰
        int a = 10;
    
    
        //接口中定义的普通方法,会默认被public abstract修饰
        //void method();
    
    
        //默认方法
        //能够让子类继承直接使用
        public default void method2(){
            method6();
            System.out.println("默认方法");
        }
        public default void method4(){
            method6();
            System.out.println("默认方法");
        }
    
        //静态方法
        //可以直接使用 接口名.静态方法 调用
        public static void method3(){
            System.out.println("静态方法");
        }
    
        //私有方法
        //存放其他方法中重复的代码,提高代码的复用性
        private void method6(){
            System.out.println(1);
            System.out.println(2);
            System.out.println(3);
        }
    
    }
    
3.3接口的注意事项

​ 1.我们习惯把实现和被实现的关系也叫做是子类和父类的关系

​ 2.接口中的成员变量是常量,默认有三个修饰符 public static final

​ 3.接口的普通方法都是抽象方法,默认有两个修饰符 public abstract

​ 4.接口中不能有构造方法,接口也不能被创建对象, 接口是比抽象类更抽象的

​ 5.接口的实现类必须重写接口的所有抽象方法,或者实现类是一个抽象类

3.4类和接口的关系
  • 类和类的关系:

    • 类和类是继承关系,java中类只支持单继承。(一个人只能有一个亲爹)
  • 类和接口的关系:

    • 类和接口是实现的关系。java中一个类可以实现多个接口。(一个人可以有多个干爹)
  • 接口和接口的关系:

    ​ (我们不会这么写代码,上面的两个是重点)

    • 接口和接口是继承关系。java中接口允许多继承。
  • 结论

    • 在开发中常用的写法是一个类继承一个父类再实现多个接口(一个人有一个亲爹还有多个干爹)

      //类
      public class DDD extends CCC implements AAA,BBB{
      }
      
      DDD是类,CCC是父类,AAA和BBB是接口
      
3.5 可能会遇到的矛盾问题

(一个都不用记,一般不会遇到,就算遇到了直接idea生成就可以了)

亲爹和干爹都有一个method1()方法,子类都能继承,在调用的时候,他会执行亲爹的方法还是干爹的方法呢?亲爹

多个干爹定义了相同的默认方法method1(),不知道该调用谁的方法,所以子类必须自己重写。

如果多个父类有相同的抽象方法,子类只需要重写一次就可以了

如果多个父类抽象方法的方法名和参数相同,而返回值类型不同,那么就报错无法实现

可能还有别的情况......(不用看了)
总结
final关键字
	类
		类不能被继承
	方法
		方法不能被重写
	变量
		变量不能被改变
			基本类型变量值不能改变
			引用类型变量地址值不能改变
			
			
static静态
	修饰成员变量和成员方法
	
	访问规则:
		静态只能直接访问静态,不能直接访问非静态。
		只要以后因为静态程序报错了,就一定是因为你用静态访问了非静态!!!
		
		
接口
	接口和类特别相似,接口的关键字interface
	接口是被实现的,实现的关键字叫implements
	
	接口成员:
		变量(默认会有 public static final)
		抽象方法(默认会有 public abstract)
		默认方法
		静态方法
		私有方法 (这三个方法很少用)
		
	类和接口的关系:
		类和类是单继承
		类和接口是多实现
		接口和接口是多继承(不用)
		
	接口的注意事项:
		接口不能创建对象,接口也没有构造方法
		接口的子类必须重写接口的抽象方法,或者子类是一个抽象类
	
	一个子类有多个父类的矛盾情况:
		不需要你记
		
	综合案例
		
面向对象是java的核心思想,我们前三天都是在学思想,概念很多。这三天的代码都是为概念服务的。
	
	
	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值