格式:
修饰符 返回值类型 方法名(参数列表)
{
// 代码
return 结果;// 如果返回值类型不为 void
}
格式:数据类型[] 数组名称 = new 数据类型[数组长度]
标准格式:数据类型[] 数组名称 = new 数据类型[] {元素 1、元素 2、...}
省略格式:数据类型[] 数组名称 = {元素 1、元素 2、...}
int[] arrayA = {10, 20, 30};
int[] arrayB; arrayB = new int[5];
int arrayC; arrayC = new int [] {1, 2, 3 };
封装性在 Java 体现:
对于基本数据类型当中的 boolean 值,Getter 方法一定要写成 isXxx 的形式,而 setXxx 规则不变
构造方法是专门用来创建对象的方法,当我们通过关键字 new 来创建对象时,其实就是在调用构造方法
public 类名称(参数类型 参数名称)
{
方法体
}
用于生成随机数
public int nextInt(int n)
返回一个 [0,n) 之间的随机数。
数组的长度不可以发生变化,ArrayList 集合的长度是可以随意变化的。
如果希望向 ArrayList 当中存储基本类型数据,必须使用基本类型对应的“包装类”
基本类型 | 包装类(引用类型) |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
程序中所有双引号字符串,都是 String 类的对象
字符串常量池,在堆中开辟的一块空间。 使用 “” 直接创建的字符串都存放在字符串常量池中。
如果需要对字符串的内容进行比较,可以使用如下方法:
public boolean equals(Object obj); // 严格区分大小写
public boolean equalsIgnoreCase(Object obj); // 忽略大小写
split
方法的参数其实是一个正则表达式,如果要按照英文 . 进行切分,必须写 “\\.” (两个反斜杠)
用来修饰成员变量和成员方法,被修饰的成员属于类的,而不是单单是属于某个对象的。
static
修饰成员变量,该变量称为类变量,该类的每个对象都共享同一个类变量的值。static 数据类型 变量名;
static
修饰成员方法时,该方法称为类方法。静态代码块:定义在成员位置,使用 static
修饰的代码块 {}
格式:
public class className
{
static {
/// 执行语句
}
}
java.util.Arrays
是一个与数组相关的工具类,里面提供了大量的静态方法,用来实现数组常见操作。
toString(数组)
将参数数组变成字符串
sort(数组)
按照默认升序对数组的元素进行排序:注意 如果数组内是自定义类型,那么这个自定义类需要有 Comparable
或者 Comparator
接口的支持。
abs(double num)
绝对值
ceil(double num)
向上取整
floor(double num)
向下取整
round(double num)
四舍五入
Math.PI
圆周率
子类继承父类的属性和行为,使得子类对象具有父类相同的属性、相同的行为,子类可以直接访问父类中的非私有的属性和行为。
优点:
1、提高代码的复用性
2、类与类之间产生了关系,是多态的前提。
子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有变量时,需要使用 super
关键字修饰父类成员变量。
如果子父类中出现了同名的成员方法,这是的访问是一种特殊情况-称之为方法重写
Java 中指支持单继承,不支持多继承。
父类中的方法,被他的子类们重写,子类各自的实现都不尽相同,那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了,我们把没有方法主体的方法称为抽象方法。包含抽象方法的类就是抽象类。
抽象方法,方法前加 abstract
关键字,去掉关键字,直接分号结束。
定义格式:
修饰符 abstract 返回值类型 方法名(参数列表);
抽象类:抽象方法所在的类,必须是抽象类才行,在 class 之前写上 abstract
即可。抽象类可以定义正常方法。
定义格式:
abstract class 类名字
{
///xxx
}
注意:
接口是 Java 中的一种引用类型,是方法的集合,如果类的内部封装了成员变量,构造方法和成员方法,那么接口的内部主要就是封装了方法。接口不是类,是一种引用数据类型,其他的引用数据类型还包括:数组、类。
接口可包含五部分:常量、抽象方法、默认方法、静态方法、私有方法
定义格式:
public interface 接口名称
{
// 抽象方法,继承类必须全部实现
// 默认方法,default 修饰符修饰,可以继承可以重写,必须通过实现类来调用
// 静态方法,只能通过接口名调用,不可通过实现类名或者实现类对象调用
// 私有方法,私有成员方法只有默认方法可以调用、私有静态方法只有默认方法和静态方法可以调用
}
接口使用步骤:
public class 实现类名称 implement 接口名称
注意事项:
public class 类名称 implements 接口 A, 接口 B {}
格式: public abstract 返回值类型 方法名称(参数列表);
实现类必须覆盖重写接口所有抽象方法,除非实现类是抽象类。
接口中的默认方法可以解决接口升级的问题。
格式:public default 返回值类型 方法名称(参数列表);
不能用接口实现类的对象来调用接口中的静态方法,应该直接使用接口名称直接调用静态方法。
格式:public static 返回值类型 方法名称(参数列表);
抽取公共方法用来解决多个默认方法之间重复代码的问题,但这个共有方法不应该让实现类使用,应该是私有化的。
格式:private default 返回值类型 方法名称(参数列表);
、private static 返回值类型 方法名称(参数列表);
接口中可以定义“成员变量”,但必须使用 public static final
三个关键字进行修饰(可省略)。从效果上看,这其实就是接口的“常量”。一旦使用 final
关键字,说明不可变
格式:public static final 数据类型 名称 = 数据值;
注意事项:
public static final
关键字。含义不变。default
关键字。public static final
修饰,可以省略、对象具有多个形态
代码中体现多态性,父类引用指向子类对象。格式:父类名称 对象名 = new 子类名称();
或 接口名称 对象名 = new 实现类名称();
多态访问成员变量的两种方式:
多态访问成员方法:
看 new 的是谁,就优先用谁,没有则向上找。
口诀:
多态访问成员变量:编译看左边,运行也看左边
多态访问成员方法:编译看左边,运行看右边。
多态的好处:无论右边 new 的是哪个子类对象,左边声明的类和调用的方法可以保持一致。
其实就是多态的写法:父类名称 对象名 = new 子类名称();
含义:右侧创建一个子类对象,把它当做父类看待使用。
注意事项:向上转型一定是安全的。类似于基本数据类型的类型转换 (float -> double)
弊端:一旦向上转型为父类,那么就无法调用子类原本特有的内容。(解决方案-使用向下转型)
其实是一个还原的动作。格式:子类名称 对象名 = (子类名称)父类对象;
含义:将父类对象,还原为本来的子类对象
注意事项:
必须保证对象创建的时候就是向下转型的类型。
instanceof
关键字返回一个 boolean 值,判断前面的对象能不能当做后面类型的实例。
格式:对象名 instanceof 类名
final
关键字用于修饰不可改变的内容
final
用法final
的,那么其中所有的成员方法都无法对其进行覆盖重写abstract
关键字和 final
关键字不能同时使用,因为矛盾。final
之后必须手动赋值,不会再有默认值。final
的成员变量,要么使用直接赋值,要么使用构造方法赋值,两者取其一。final
修饰的成员变量赋值,必须保证类中所有重载的构造方法,都最终会对 final
的成员变量进行赋值。final
修饰的常量名称,一般有书写规范,所有字母均大写。public > protected (专门给不同包子类用的) > (default) > private
public | protected | (default) | private | |
---|---|---|---|---|
同一个类(我自己) | YES | YES | YES | YES |
用一个包(我邻居) | YES | YES | YES | NO |
不同包子类(我儿子) | YES | YES | NO | NO |
不同包非子类(陌生人) | YES | NO | NO | NO |
格式:
修饰符 class 外部类名称
{
修饰符 class 内部类名称
{
xxx
}
}
内部类可以直接访问外部类的成员,包括私有成员。
外部类要访问内部类的成员,必须建立内部类的对象。
即 : 内用外,随意访问。外用内需要借助内部类对象。
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
如果出现重名现象,使用格式:外部类名称.this.外部类成员变量名
实例:
public class Outer
{
int num = 10;
public class Inner
{
int num = 20;
public void methodInner()
{
int num = 30;
System.out.println(num); // 局部变量,就近原则
System.out.println(this.num); // 内部类的成员变量
System.out.println(Outer.this.num); // 外部类的成员变量
}
}
}
如果一个类定义在一个方法内部,那么就是局部内部类。
“局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了。
局部内部类如果要访问所在方法的局部变量,那么这个局部变量必须是【有效 final 的】即 用 final 声明的变量或者事实上只赋值一次的变量。
原因:new 出来的对象在堆内存中,局部变量跟着方法走,在栈内存中。方法运行结束立刻出栈,局部变量立即消失。但是 new 出来的对象会在堆中持续存在,直到垃圾回收消失。
public 或 (default)
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用匿名内部类
定义格式:
接口名称 对象名 = new 接口名称()
{
/// 覆盖重写接口中所有的抽象方法。
}
对格式 “new 接口名称(){…}” 进行解析:
注意事项:
interface
作为成员变量使用接口作为成员变量以便随时更换实现方式,这种设计更为灵活,增强了程序的扩展性。
接口作为成员变量时,对他进行复制的操作,实际上是赋给他接口的一个子类实现对象。
接口作为参数数,传递它的子类对象;
接口作为返回值类型是,也是返回它的子类对象。