文章目录
前言
众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。 — 辛弃疾 《青玉案·元夕》
1 static和final关键字
1.1 static关键字
-
在Java中,被static关键字修饰的成员是静态成员(属于类),没有被static修饰的成员是实例成员(属于对象)
-
static关键字可以用来修饰成员变量和成员方法
有static修饰的变量为静态变量,也称为类变量;
无static修饰的方法为静态方法,也称为类方法
- 静态成员:类名访问;实例成员:对象访问。
1.1.1 静态变量
静态变量是有static关键字修饰的变量
1. 定义和使用
// 1.定义
修饰符 static 数据类型 变量名 = 初始值;
// 2.使用
类名.静态变量
2. 代码示例
package com.syh;
public class Esther {
// 1.定义静态变量
public static String country = "中国";
public static void main(String[] args) {
// 2.使用静态变量
System.out.println(Esther.country);
}
}
1.1.2 实例变量
实例变量是没有static关键字修饰的变量,对于实例变量,只需要了解其访问格式即可。
格式:对象.实例变量
1.1.3 静态方法
静态方法是有static关键字修饰的方法
1. 定义及使用
// 1.定义
修饰符 返回值类型 方法名(参数){
方法体;
}
// 2.使用
类名.静态变量
2. 代码示例
package com.syh;
public class Esther {
public static void main(String[] args) {
/**
* 静态方法调用
*/
Esther.print();
}
/**
* 静态方法
*/
public static void print() {
System.out.println("少年辛苦终身事,莫向光阴堕寸功!");
}
}
1.1.4 实例方法
实例方法是没有static关键字修饰的方法,对于实例方法,只需要了解其访问格式即可。
格式:对象.实例方法
1.2 final关键字
1.2.1 概述
final关键字: 表示修饰的内容不可改变,最终的含义。可以用于修饰类、方法和变量。
- 类:被修饰的类,不能被继承。
- 方法:被修饰的方法,不能被重写。
- 变量:被修饰的变量,有且仅能被赋值一次。
1.2.2 使用方式
1. 修饰类
final修饰的类,不能被继承。代码示例如下:
final class Fu {
}
// class Zi extends Fu {} // 报错,不能继承final的类
2.修饰方法
final修饰的方法,不能被重写。代码示例如下:
class Fu2 {
final public void show1() {
System.out.println("Fu2 show1");
}
public void show2() {
System.out.println("Fu2 show2");
}
}
class Zi2 extends Fu2 {
// @Override
// public void show1() {
// System.out.println("Zi2 show1");
// } // 报错,不能被重写
@Override
public void show2() {
System.out.println("Zi2 show2");
}
}
3.修饰变量(局部变量)
final关键字修饰局部变量,被final修饰后,只能赋值一次,代码示例如下:
public class FinalDemo1 {
public static void main(String[] args) {
// 声明变量,使用final修饰
final int a;
// 第一次赋值
a = 10;
// 第二次赋值
a = 20; // 报错,不可重新赋值
}
}
4.修饰变量(成员变量)
final关键字修饰成员变量,被final修饰后,只能赋值一次,代码示例如下:
public class Student {
final int num = 10;
}
注意:被final修饰的常量名称,一般都有书写规范,所有字母都大写。
2 Java中的包
包名一般是公司域名的倒写。例如:黑马是www.itheima.com,包名就可以定义成com.itheima.技术名称。
2.1 导包
1. 什么时候需要导包?
情况一:在使用Java中提供的非核心包中的类时
情况二:使用自己写的其他包中的类时
2. 什么时候不需要导包?
情况一:在使用Java核心包(java.lang)中的类时
情况二:在使用自己写的同一个包中的类时
3 权限修饰符
3.1 权限修饰符概述
在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限
-
public:公共的,所有地方都可以访问。
-
protected:受保护的,本类 ,本包,其他包中的子类都可以访问。
-
默认:默认是空着不写,本类 ,本包可以访问。
-
private:私有的,当前类可以访问。
public > protected > 默认 > private
3.2 权限列表
public | protected | 默认 | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中的类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
4 抽象类
4.1 抽象类概述
- 抽象方法 : 没有方法体的方法。
- 抽象类:包含抽象方法的类。
4.2 abstract关键字
abstract是抽象的意思,用于修饰方法方法和类,修饰的方法是抽象方法,修饰的类是抽象类。
1.抽象方法
使用abstract
关键字修饰方法,没有方法体。
// 1.定义格式:
修饰符 abstract 返回值类型 方法名 (参数列表);
// 2.代码实例:
public abstract void run();
2.抽象类
如果一个类包含抽象方法,那么该类必须是抽象类。
// 1.定义格式:
abstract class 类名字 {
}
// 2.代码示例:
public abstract class Animal {
public abstract void run();
}
3.抽象类的使用
继承抽象类的子类必须重写父类所有的抽象方法
代码示例:
package com.syh;
/**
* 父类(抽象类)
*/
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Animal{name = " + name + ", age = " + age + "}";
}
/**
* 抽象方法
*/
public abstract void eat();
}
package com.syh;
/**
* 猫类(子类)
*/
public class Cat extends Animal {
private String name;
private int age;
public Cat() {
}
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Cat{name = " + name + ", age = " + age + "}";
}
/**
* 子类实现父类抽象方法
*/
@Override
public void eat() {
System.out.println("猫吃猫粮!");
}
}
package com.syh;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Cat cat = new Cat("小白",3);
System.out.println("猫的名字:" + cat.getName());
System.out.println("猫的年龄:" + cat.getAge());
cat.eat();
}
}
注意:1.抽象类不能创建对象
2.抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类。
5 接口
5.1 接口概述
- 接口是更加彻底的抽象。
- 接口中全部是抽象方法。
- 接口同样是不能创建对象的。
1. 接口定义
接口使用interface关键字定义
//接口的定义格式:
interface 接口名称{
// 抽象方法
}
2. 抽象方法和常量
- 接口中只有常量和抽象方法
- 接口中的常量默认会自动加上public static final修饰,常量名全部大写,多个单词用下划线连接。
- 接口中的抽象方法默认会自动加上public abstract修饰,程序员无需自己手写!
3. 代码示例
package com.syh;
public interface Esther {
// 1.常量默认会加 public static final
String NAME = "Esther";
// 2.抽象方法默认会加 public abstract
void run();
}
5.2 基本的实现
1. 类实现接口
- 类与接口的关系为实现关系,即类实现接口,
- 实现使用
implements
关键字。 - 接口是可以被多实现的
/**
* 实现接口
*/
class 类名 implements 接口1,接口2,接口3...{
}
注意:必须重写实现的全部接口中所有抽象方法。
2.代码示例
package com.syh;
/**
* 运动员接口
*/
public interface SportMan {
void run(); // 抽象方法,跑步。
}
package com.syh;
/**
* 博尔特类
*/
public class Bolt implements SportMan {
@Override
public void run() {
System.out.println("博尔特在跑步!!");
}
}
package com.syh;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
// 创建实现类对象。
Bolt bolt = new Bolt();
bolt.run();
}
}
注意:类与接口之间的关系是多实现的,一个类可以同时实现多个接口。
6 内部类
6.1 内部类概述
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
6.2 内部类的分类
1.按定义的位置来分
- 成员内部内,类定义在了成员位置 (无static修饰的内部类)
- 静态内部类,类定义在了成员位置 (有static修饰的内部类)
- 局部内部类,类定义在方法内
- 匿名内部类,没有名字的内部类
2.成员内部类
成员内部类是没有static修饰的内部类,格式如下:
// 创建成员内部类的对象
外部类.内部类 变量 = new 外部类().new 内部类();
代码示例
package com.syh;
public class Outer {
/**
* 成员内部类
*/
public class Inner{
public void method(){
System.out.println("成员内部类");
}
}
}
package com.syh;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
/**
* 创建内部类的对象
*/
Outer.Inner oi = new Outer().new Inner();
oi.method();
}
}
3. 静态内部类
静态内部类是有static修饰的内部类,格式如下:
// 创建静态内部类的对象
外部类.内部类 变量 = new 外部类.内部类构造器;
代码示例
package com.syh;
public class Outer {
/**
* 静态内部类
*/
public static class Inner{
public void method(){
System.out.println("静态内部类");
}
}
}
package com.syh;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
/**
* 静态内部类
*/
Outer.Inner oi = new Outer.Inner();
oi.method();
}
}
4. 局部内部类(了解即可)
局部内部类是定义在方法中的类,格式如下:
class 外部类名 {
修饰符 返回值类型 方法名(参数列表) {
/**
* 局部内部类
*/
class 内部类 {
}
}
}
5. 匿名内部类
匿名内部类是内部类的简化写法。他是一个隐含了名字的内部类。格式如下:
new 类名或者接口名() {
重写方法;
};
代码示例:
package com.syh;
/**
* 游泳接口
*/
interface Swim {
public abstract void swimming();
}
package com.syh;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
/**
* 创建匿名内部类并调用
*/
new Swim() {
@Override
public void swimming() {
System.out.println("匿名内部类");
}
}.swimming();
}
}