今日内容
1 Java中的关键字
1.1 static关键字
- static关键字 :
- 静态的意思 , 可以修饰变量 , 也可以修饰方法 , 被static修饰的成员 , 我们叫做静态成员
static特点 :
- 静态成员被所类的所有对象共享
- 随着类的加载而加载 , 优先于对象存在
- 可以通过对象调用 , 也可以通过类名调用 , 建议使用类名
package com.itheima.static_demo;
/*
1 static概述
2 静态成员特点
1) 静态成员可以被本类所有的对象共享
2) 静态成员可以通过类名调用也可以通过对象调用 , 推荐使用类名调用!
3) 静态成员随着类的加载而加载 , 优先于对象存在
3 静态方法的注意事项
1) 非静态方法可以访问任何成员
2) 静态方法中只能访问静态成员 , 要要想访问非静态成员需要使用对象调用
3) 静态方法中不能使用this关键字
掌握:
1.如何定义静态方法 static修饰
2.如何访问静态方法 类名访问
3.注意:静态只能直接访问静态
*/
public class StaticDemo {
public static void main(String[] args) {
//静态变量访问
Student.school = "黑马";//给静态变量赋值
//静态成员可以被本类所有的对象共享
//创建Student对象
Student s1 = new Student();
s1.name = "张三";
Student s2 = new Student();
s2.name = "李四";
System.out.println(s1.name+","+s1.school);//张三,黑马
System.out.println(s2.name+","+s2.school);//李四,黑马
//非静态成员变量,不能共享,每个对象都有自己专属的数据。
//静态成员可以被本类所有的对象共享
//==========================
//静态方法只能调用静态方法
show();//
//通过类名调用静态方法
Student.study();
//非静态方法就得借助对象调用
//Student.eat();
new Student().eat();
}
public static void show() {
}
}
package com.itheima.static_demo;
public class Student {
public String name;// 非静态变量
public int age;// 非静态变量
public static String school; //静态变量
public static void study(){// 静态方法
//静态方法只能直接访问本类的静态成员
//System.out.println(name);//非静态报错
//对象访问
System.out.println(new Student().name);
System.out.println(school);
//eat(); //非静态报错
test();
//不能存在this
// this
}
public void eat() { //非静态方法
System.out.println(name);
System.out.println(school);
}
public static void test(){}
}
static内存图解
static关键字的注意事项
final关键字 : 翻译中文代表最终的意思 , 是java的一个关键字 也是一个修饰符 , 可以修饰类 , 可以修饰方法 , 也可以修饰变量
final关键字修饰的特点
- final修饰的类 : 不能被继承 , 没有子类(太监类)
- fina修饰的方法 : 不能被重写
- final修饰的变量
- 基本数据类型 : 值不能改变
- 引用数据类型 : 地址不可发生改变 , 对象的属性可改变
- 注意 :
- 被final修饰的变量 , 我们叫做自定义常量 , 命名规范 : 每个字母需要大写 , 多个单词之间用下划线分割
- final修饰成员变量需要注意初始化时机的问题 , 1) 直接赋值 , 2) 在构造方法执行完毕前赋值
package com.itheima.final_demo;
/*
final的特点
final修饰的类 , 不能被继承, 也就是没有子类
final修饰的方法 , 不能被重写
final修饰的变量
基本数据类型 : 值不可以发生改变
引用数据类型 : 地址不可发生改变 , 对象的内容可以发生改变
注意 :
1 被final修饰的变量 , 我们叫做自定义常量 , 命名规范 : 每个字母需要大写 , 多个单词之间用下划线分割
2 final修饰成员变量需要注意初始化时机的问题
1) 直接赋值
2) 在构造方法执行完毕前赋值
*/
public class FinalDemo1 {
public static void main(String[] args) {
// final修饰的基本数据类型变量 , 值不能被修改
// final int num = 10;
// num = 20;
// System.out.println(num);
final int[] arr = {1, 2, 3, 4, 5};
// final修饰的引用数据类型 , 地址不可改发生改变
// arr = new int[3];
// final修饰的引用数据类型 , 对象中的内容可以发生改变
arr[0] = 100;
}
}
// final修饰的类 , 不能被继承, 也就是没有子类
//final class Person {
//
//}
class Person {
// final修饰的方法 , 不能被重写
public final void eat() {
}
}
class Student extends Person {
// final修饰成员变量需要注意初始化时机的问题
// 要么直接赋值 , 要么在构造方法执行完毕前赋值
// final int num = 10;
final int num;
public Student() {
num = 100;
}
// @Override
// public void eat() {
// super.eat();
// }
}
1.3 Java中的权限修饰符
public — protected — 默认的 — private
```java package com.itheima.permissions_demo; public class Animal { public String str1 = “public”; protected String str2 = “protected”; String str3 = “package-private”; private String str4 = “private”; //本类: 所有权限都能使用 public void show() {System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(str4);
}
}
package com.itheima.permissions_demo; public class Cat extends Animal { //同包中子类 只有private不能访问 public void show() {
System.out.println(str1); System.out.println(str2); System.out.println(str3); //System.out.println(str4);//private
}
}
package com.itheima.permissions_demo; public class Demo { public static void main(String[] args) {
//同包无关类 只有private不能访问 Animal a = new Animal(); System.out.println(a.str1); System.out.println(a.str2); System.out.println(a.str3); //System.out.println(a.str4);
}
}
package com.itheima.permissions_demo.other; import com.itheima.permissions_demo.Animal; public class Dog extends Animal { //不同包中的子类: public void show() {
System.out.println(str1);//public System.out.println(str2);//protected //System.out.println(str3);//包私有 //System.out.println(str4);//私有
}
}
package com.itheima.permissions_demo.other; import com.itheima.permissions_demo.Animal; public class Demo2 { public static void main(String[] args) { //不同包无关类 只能访问public Animal a = new Animal(); System.out.println(a.str1); //System.out.println(a.str2); //System.out.println(a.str3); //System.out.println(a.str4); } }
<a name="d48c0e63"></a>
## 2 代码块
<a name="edb81bf0"></a>
### 2.1 构造代码块
- 构造方法块 : 用一对大括号表示, 定义在类中方法外
- 执行时机 : 每次构造方法执行前, 都会执行构造代码块
- 作用 : 抽取构造方法中共性内容
```java
package com.itheima.code_block;
/*
构造代码块
*/
public class Student {
final int NUM;
{
NUM = 10;
System.out.println("构造代码块...");
}
public Student() {
System.out.println("空参构造...");
}
public Student(int a) {
System.out.println("有参构造...");
}
}
class StudentTest {
public static void main(String[] args) {
Student s = new Student();
Student s2 = new Student(10);
}
}
2.2 静态代码块
- 静态代码块 : 在一对大括号前加上static关键字 , 定义在类中方法外
- 执行时机 : 随着类的加载而加载 , 只加载一次
作用 : 一般用于给静态成员初始化
package com.itheima.code_block.static_demo; /* 静态代码块 : 1 定义格式 : 在构造代码块前加上static关键字 2 执行时机 : 随着类的加载而加载 , 只执行一次 3 作用 : 可以给静态成员赋值 */ public class Demo { public static void main(String[] args) { new Student(); new Student(); new Student(); } } class Student { public static String schoolName;//静态 public String name; //非静态 static { System.out.println("静态代码块1"); schoolName = "黑马"; //静态只能直接访问静态成分 //name = "张三"; } public Student() { System.out.println("构造方法2"); } }
2.3 局部代码块
成员代码块 : 用一对大括号表 , 可以定义在任何的局部位置 , 方法中居多
- 执行时机 : 正常执行(从上往下依次执行)
控制变量的局部变量的声明周期
package com.itheima.code_block.local_demo; public class Demo01 { public static void main(String[] args) { { int a = 10; System.out.println(a); } //System.out.println(a); for (int i = 0; i < 10; i++) { int sum=0; sum += i; } //System.out.println(i); //System.out.println(sum); } }
3 接口
3.1 接口的介绍
接口 : 如果一个类中都是抽象方法 , 那么这个类应该是定义规则的类 , 我们应该把此类定义成接口,接口是一种引用数据类型
作用 :
定义接口的关键字使用interface
- public interface 接口名{ … }
- 类与接口之间的关系是实现关系 , 用关键字implements进行连接
- public class 类名 implements 接口名 { … }
- 接口不能实例化
- 接口的子类我们叫做实现类
- 要么重写接口中所有的抽象方法
- 要么实现类是一个抽象类
- 注意 : 类与接口的关系是实现关系 , 一个类可以实现多个接口,调用逗号分隔 , 还可以继承一个类的同时 , 实现多个接口
package com.itheima.interface_demo;
public interface Inter {
public abstract void show();
public abstract void method();
}
interface Inter2 {
}
```java
package com.itheima.interface_demo;
public class InterImpl extends Object implements Inter ,Inter2{
@Override
public void show() {
}
@Override
public void method() {
}
}
package com.itheima.interface_demo;
/*
1 定义接口的关键字使用interface
public interface 接口名{ ... }
2 类与接口的关系是实现关系 , 使用implements进行连接
public class 类名 implements 接口名{ ... }
3 接口不能实例化(不能创建对象)
4 接口的子类,我们叫做实现类
要么重写接口中所有的抽象方法
要么这个实现类是一个抽象类
注意 : 类与接口的关系是实现关系 , 一个类可以实现多个接口
还可以继承一个类的同时 , 实现多个接口
*/
public class InterfaceDemo1 {
public static void main(String[] args) {
// 接口不能实例化(不能创建对象)
// Inter inter = new Inter();
}
}
3.3 接口的成员特点
- 成员变量 : 都是常量 , 默认修饰符 public static final
- 构造方法 : 没有构造方法
成员方法 : 只能是抽象方法 , 默认修饰符public abstract
关于JDK8和JDK9版本对接口增加了一些方法新特性
package com.itheima.interface_demo; public interface Inter { // 是一个常量 , 默认修饰符 public static final public static final int num = 10; // 不存在构造方法 // public Inter(){} public abstract void show(); public abstract void method(); } interface Inter2 { }
public class InterfaceDemo1 { public static void main(String[] args) { // 接口不能实例化(不能创建对象) // Inter inter = new Inter(); // 成员变量被static修饰 System.out.println(Inter.num); // 是一个常量 , 只能赋值一次 // Inter.num = 20; } }
3.4 接口的案例
package com.itheima.interface_demo.interface_test; public interface player { public abstract void play(); public abstract void pause(); public abstract void stop(); }
package com.itheima.interface_demo.interface_test; public class MP3 implements player { @Override public void play() { System.out.println("MP3开始播放音乐"); } @Override public void pause() { System.out.println("MP3开始暂停"); } @Override public void stop() { System.out.println("MP3开始关闭音乐"); } }
package com.itheima.interface_demo.interface_test; public class MP4 implements player { @Override public void play() { System.out.println("MP4播放音乐"); } @Override public void pause() { System.out.println("MP4暂停音乐"); } @Override public void stop() { System.out.println("MP4关闭音乐"); } }
package com.itheima.interface_demo.interface_test; /* 需求 : 1 创建一个播放接口 player 2 定义三个抽象方法 , 播放(play),暂停(pause),停止(stop) 3 定义MP3类,MAP4类,手机类,实现接口,重写抽象方法 */ public class PlayerTest { public static void main(String[] args) { MP3 mp3 = new MP3(); mp3.play(); mp3.pause(); mp3.stop(); System.out.println("============="); MP4 mp4 = new MP4(); mp4.play(); mp4.pause(); mp4.stop(); } }
3.5 接口中成员方法的特点
DK8版本之前 : 只能是抽象方法
- JDK8版本 :
- 默认方法
- JDK8可以在接口中定义非抽象方法(带有方法体的方法) , 需要使用default进行修饰 , 其实就是默认方法
- 作用 : 解决接口升级的问题
- 格式 : public default 返回值类型 方法名(参数) { … }
- 注意事项 :
- 默认方法不是抽象方法 , 可以继承 , 也可以重写 , 重写需要去掉default关键字
- public 可以省略 , default不能省略
- 如果实现类实现了多个接口 , 有相同的方法声明 , 那么实现类必须重写该方法
- 静态方法
- JDK8可以在接口中定义静态方法 , 也是有方法体的方法
- 作用 : 方便调用此功能
- 格式 : public static 返回值类型 方法名(参数){ … }
- 注意事项
- 静态方法只能通过接口名调用 , 不能通过实现类名字和对象调用
- public可以省略 , static不能省略
- 默认方法
JDK9版本 :
枚举 : 当列举固定有限数据时,可以把这些数据定义为枚举类型。
- 作用 : 数据更好理解,见名之意
定义
权限修饰符 enum 枚举名称 { 枚举项1,枚举项2...; } //枚举项之间使用逗号分隔,最后使用分号结束 //使用枚举描述性别数据: public enum Sex { BOY,GIRL; }
使用 : 通过枚举类型名直接引用枚举项即可,例如Sex.BOY、Sex.GIRL
注意 : 每个枚举项都相当于枚举的对象- 案例代码
交通信号灯有固定的三种颜色:红,黄,绿。判断灯的颜色,输出对应的通行方案 ```java package com.itheima.enum_demo; /**
package com.itheima.enum_demo; public class SignalDemo { public static void main(String[] args) { change(Signal.YELLOW); } public static void change(Signal signal) { switch (signal) { case RED: System.out.println(“红灯停!”); break; case GREEN: System.out.println(“绿灯行!”); break; case YELLOW: System.out.println(“黄灯亮了等一等!”); break; default: System.out.println(“灯坏了,注意安全”); } } }
- 枚举的本质 :
- 枚举其实本质上是一个类,每一个枚举项是本枚举类类型的一个对象。我们可以使用JDK提供的反编译命令,将枚举的字节码进行反编译查看
- 枚举本质上就是最终类
- 枚举项,就是枚举类的对象,而且是静态的常量。
- 有私有的构造方法
- 静态代码块
- 继承了lang包下的Enum
- 组成部分 :
- 构造器,成员方法,成员变量等 , 但是定义的成分一定要在枚举项之后,而且最后一个枚举项必须要有分号结束。<br />案例:将Sex枚举加上成员变量,成员方法,构造方法
```java
package com.itheima.enum_demo;
public enum Sex {
BOY("男孩"),GIRL("女孩");
//成员变量
private String msg;
//构造方法:一定是私有,外界不用
private Sex() {
}
private Sex(String msg) {
this.msg = msg;
}
//成员方法
public void show() {
System.out.println(msg);
}
}
- 说明:
1.YAO 对象就是由无参构造方法创建的
2.BOY和GIRL是有参构造方法创建的
3.构造方法权限一定是私有的,即使省略也是private权限。
4.show方法可以直接用枚举实例调用:Sex.BOY.show();