类/方法
class
class Demo { //定义一个叫 Demo 的类 如果被 public 修饰则要求该文件的文件名必须与该类名相同
int i = 10; //成员变量 类中方法外 这个类公用的变量
public Demo() { //构造方法 与类同名 不用加返回值 是在其他类创建这个类时调用 可以无参或有参
}
public static int a(int a) { //public static:权限修饰符 int:返回值类型(void:无返回值) a:方法名称 (int a):输入的参数((int... a):可变参数可以添加多组数据,底层为数组)
return 15; //返回值为15 返回值为我们调用这个方法所得到的结果
}
}
一个类就相当于一个Java文件
Java方法是Java代码块在一起执行一个功能
一般类名采用大驼峰命名法,而方法采用小驼峰命名法
大驼峰命名法: 首字母大写 之后每个单词首字母大写
小驼峰命名法: 首字母小写 之后每个单词首字母大写
修饰符
default //默认 在同一包内可用(可以不用写)
private //私有 只在本类中可用
public //公开 所有类都可用
protected //保护 只在本类和继承本类的子类中可用
static //静态 代码块:与类一起加载只执行一次 变量:无论声明多少对象变量都为同一个 方法:类名.方法名可以直接调用(静态方法不能使用非静态变量) 被 static 所修饰的内容都为单例,即只有一个对象
final //最终 变量:不可改变 成员变量:直接赋值或在构造方法中赋值 方法:可以被继承,但不能被重写 类:不能被继承
abstract //抽象 方法:无内容,必须由子类重写 类:有抽象方法必须为抽象类
枚举:
enum
public enum Season {
SPRING("春"){ //枚举是静态的,可以直接"枚举类.枚举项"调用
@Override //每个枚举项都是该枚举类的对象,故若枚举类中有抽象方法则枚举项中必须重写
public void show() {
System.out.println(this.name);
}
},
SUMMER("夏"){
@Override
public void show() {
System.out.println(this.name);
}
},
AUTUMN("秋"){
@Override
public void show() {
System.out.println(this.name);
}
},
WINTER("冬"){
@Override
public void show() {
System.out.println(this.name);
}
};
public String name; //枚举项的定义必须在枚举类开头,变量需定义在枚举项之下
private Season(String name){ //构造方法
this.name = name;
}
public abstract void show(); //抽象方法
}
枚举类.枚举项名.name();
获取枚举项名
枚举类.枚举项名.ordinal();
返回该枚举索引值
枚举类.枚举项名.compareTo(枚举对象);
比较两个枚举项 返回索引的差值
枚举类.value();
获取所有枚举项 返回枚举类[]
Enum.valueOf(class, 枚举项名);
获取枚举类中的枚举项 Enum:所有枚举类的父类
泛型
<?>
泛型通配符,可以匹配所有类型 <? extends 类名>
匹配该类和其所有父类泛型 <? super 类名>
匹配该类和其所有子类泛型
public class Demo {
public static void main(String[] args) {
String s = "ABC";
B b = new B();
A<String> a = new A<>(s); //这里指定 E 为String字符串类型 所以构造方法输入的参数 s 为String字符串类型
A<B> ab = new A<>(b); //这里指定 E 为B这个类 所以构造方法输入的参数 b 为B这个类的对象
System.out.println(a.e); //ABC 这里的 e 是String字符串类型 内容为"ABC"
System.out.println(ab.e); //BCD 这里的 e 表示的是B这个类的对象 内容为B这个类的toString方法输出的"BCD"
System.out.println(ab.b(s)); //ABC 这里指定 T 为String字符串类型 此处打印的是 A这个类 的b方法的返回值
}
}
class A<E> { //指定E为泛型,一般用单个大写字母表示 表示通配任意类型
public E e;
public A(E e) { //此处E与创建类时所指定的E的类型一样
this.e = e;
}
public <T> T b(T t) { //指定T为泛型,与E无关
return t;
}
}
class B {
@Override
public String toString() {
return "BCD";
}
}
泛型表示可以通配任意类型对象
注解
//元注解: 标注注解的注解
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) //指定注解使用的位置(成员变量, 类, 方法)
@Retention(RetentionPolicy.RUNTIME) //指定该注解的存在时间
@Inherited //指定该注解可以被继承
pulic @interface 注解名{ //声明这是一个注解
属性类型 属性名() default 默认值;
属性类型 属性名(); //若没有赋默认值,则需定义时赋值
String value(); //特殊: 若只有value需要赋值,则value可以省略,直接写定义值
}
@Override
重写方法
@Deprecated
方法过时
@SuppressWarnings(value = "all")
压制警告
内部类
类中的类
成员内部类
类名.内部类名 对象名 = 外部类对象.new 内部类名();
public class Demo {
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
Demo1.Demo2 demo2 = new Demo1().new Demo2(); //创建 Demo1的内部类Demo2 的对象
System.out.println(demo1.a); //10
System.out.println(demo2.a); //15
}
}
class Demo1 {
int a = 10;
class Demo2 {
int a = 15;
}
}
静态成员内部类
类名.内部类名 对象名 = new 外部类名.内部类名();
public class Demo {
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
Demo1.Demo2 demo2 = new Demo1.Demo2(); //创建 Demo1的静态内部类Demo2 的对象
System.out.println(demo1.a); //10
System.out.println(demo2.a); //15
}
}
class Demo1 {
int a = 10;
static class Demo2 {
int a = 15;
}
}
匿名内部类 / lambda表达式
匿名内部类: 没有类名的内部类 一般由创建对象时创建内部类来重写其方法
public class Demo {
public static void main(String[] args) {
Demo1 demo1 = new Demo1() { //使用匿名内部类的方式重写 Demo1 中的抽象方法并创建对象
@Override
public int a(int a) {
return a + 1;
}
@Override
public int b(int a) {
return a - 1;
}
};
System.out.println(demo1.a(10)); //11
System.out.println(demo1.a(10)); //9
}
}
class Demo1 {
int a(int a) {
return 1;
}
int b(int a) {
return 2;
}
}
lambda表达式: 匿名内部类的简化书写方式 要求外部类只能为接口,并且有且只有一个抽象方法
public class Demo {
public static void main(String[] args) {
Demo1 demo1 = new Demo1() { //匿名内部类
@Override
public int a(int a) {
return a + 1;
}
};
Demo1 demo11 = (a) -> { //lambda表达式 意义与上方匿名内部类完全相同 可省略大部分重复代码 (变量名) -> {代码块}
return a + 1;
};
System.out.println(demo1.a(10)); //11
System.out.println(demo11.a(10)); //11
}
}
interface Demo1 {
int a(int a);
}
面向对象
封装
new
import java.util.Random; //导包 说明我们用到的类的位置(全类名)
public class Demo {
public static void a() {
Random r = new Random(); //类名 对象名 = new 类名(); 创建一个类的对象 即将此类封装成一个叫 r 的对象
int a = r.nextInt(100); //对象名.方法名 调用这个对象的这个方法 可以用一个变量承接返回值
}
}
静态方法可直接类名.方法名;
调用
继承
extends
public class Demo1 extends Demo { //class 类名 extends 父类:继承父类的非私有的方法和变量(不能多继承,但可以多重继承)
int i = 10;
public void b() {
int a1 = this.i; //10 this:声明为本类中的变量
int a2 = super.i; //100 super:声明为父类中的变量
}
@Override //重写父类方法 以本类调用此方法时将不再调用父类方法
public int a() { //需与父类 方法名,参数 都相同
return 1;
}
}
class Demo { //父类
int i = 100;
public int a(){
return 12;
}
}
父类的方法和自己独有的方法都可以调用
抽象
abstract
class Demo1 extends Demo { //若继承的类有抽象方法则此类必须重写抽象方法
@Override
public int b() {
return 1;
}
}
abstract class Demo { //有抽象方法的类也必须被abstract修饰
public int a() {
return 1;
}
abstract int b(); //abstract:定义一个抽象方法
}
抽象方法即没有方法体的方法,由继承此类的类重写
接口
interface
implements
public class Demo1 implements Demo { //implements实现一个接口 可以多实现 所有抽象方法必须被重写
@Override
public int a() {
return 1;
}
@Override
public int b() {
return 0;
}
}
interface Demo { //interface:定义一个接口 即只有抽象方法的类
int a();
int b();
}
接口即只有抽象方法的类
变量默认添加修饰词 public static final
开放 静态 最终
方法默认添加修饰词 public abstract
开放 抽象 不可用static修饰
多态
父类 对象名 = new 子类
class Demo1 extends Demo {
public int c() {
return 1;
}
@Override
public int b() {
return 1;
}
}
abstract class Demo {
public int a() {
return 1;
}
abstract int b();
}
可以使用父类变量承接子类对象
但不能调用子类独有方法
{
Demo demo = new Demo1();
demo.a();
//可以
demo.b();
//可以
demo.c();
//不可以
}
异常
弹出异常
throw new 异常名
弹出异常
public class Demo {
public static void main(String[] args) throws Exception { //throws 异常名 跟在在类名之后,表示有可能会遇到该异常,若遇到则抛出给调用者 (Exception 最上级异常,所有异常的父类)
throw new Exception("异常: Exception"); //弹出异常
}
}
运行结果:
自定义异常
继承RuntimeException并创建构造方法
public class Demo {
public static void main(String[] args) throws Exception { //抛出异常
throw new A("异常: A"); //弹出异常
}
}
class A extends RuntimeException { //自定义异常 A
public A(String s) {
super(s);
System.out.println(s);
}
}
运行结果:
异常处理:
{
try{
//有可能出现异常的代码
}catch(异常名 e){
//捕捉异常之后封装为异常对象并继续运行此处代码
}finally{
//表示不管有没有异常,此处代码一定会执行,除非JVM退出
}
}
public class Demo {
public static void main(String[] args) {
try {
a(); //a方法添加了 throws Exception 若遇到异常将抛出到此处
System.out.println("未遇到异常A"); //此打印语句在异常之下,若异常未起作用将打印
} catch (Exception e) {
System.out.println("遇到异常A");
e.printStackTrace(); //默认异常处理机制 即打印异常
} finally {
System.out.println("异常A 已处理完");
}
System.out.println("其他代码");
}
public static void a() throws Exception { //抛出异常给调用者
throw new A("异常: A"); //弹出异常
}
}
class A extends RuntimeException {
public A(String s) {
System.out.println(s);
}
}
运行结果: