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静态的注意事项
- 静态方法可以直接访问静态,不能直接访问非静态。
- 成员方法可以直接访问静态,也可以直接访问非静态。
- 静态在内存中优先于对象存在,所以静态方法中,不能使用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的核心思想,我们前三天都是在学思想,概念很多。这三天的代码都是为概念服务的。