参数传递
类、接口作为形式参数和返回值
- 类作为形式参数和返回值
类作为形式参数:调用方法实际传递的是该类对象
类作为返回值类型:实际返回的也是该类的对象
class Cat {
public void eat() {
System.out.println("猫吃鱼");
}
}
class CatOperator {
public void useCat(Cat c) { //Cat c = new Cat();
c.eat();
}
public Cat getCat() {
Cat c = new Cat();
return c;
}
}
public class CatDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
CatOperator co = new CatOperator();
Cat c = new Cat();
co.useCat(c);
Cat c2 = co.getCat(); //new Cat()
c2.eat();
}
}
- 抽象类作为形式参数和返回值
抽象类作为形式参数:调用方法实际传递子类对象
抽象类作为返回值类型:实际返回的是该类的子类对象
abstract class Animal {
public abstract void eat();
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
class AnimalOperator {
public void useAnimal(Animal a) { //Animal a = new Cat();
a.eat();
}
public Animal getAnimal() {
Animal a = new Cat();
return a;
}
}
public class AnimalDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
AnimalOperator ao = new AnimalOperator();
Animal a = new Cat();
ao.useAnimal(a);
Animal a2 = ao.getAnimal(); //new Cat()
a2.eat();
}
}
- 接口作为形式参数和返回值类型
接口作为形式参数:调用方法实际传递实现类对象
接口作为返回值类型:实际返回的是实现类对象
interface Jumpping {
void jump();
}
class JumppingOperator {
public void useJumpping(Jumpping j) { //Jumpping j = new Cat();
j.jump();
}
public Jumpping getJumpping() {
Jumpping j = new Cat();
return j;
}
}
class Cat implements Jumpping {
@Override
public void jump() {
System.out.println("猫可以跳高了");
}
}
public class JumppingDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
JumppingOperator jo = new JumppingOperator();
Jumpping j = new Cat();
jo.useJumpping(j);
Jumpping j2 = jo.getJumpping(); //new Cat()
j2.jump();
}
}
内部类
内部类的基本使用
- 内部类概念
- 在一个类中定义一个类。举例:在一个类A的内部定义一个类,类B就被称为内部类 - 格式&举例:
/*
格式:
class 外部类名{
修饰符 class 内部类名{
}
}
*/
class Outer {
public class Inner {
}
}
-
内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类成员,必须创建对象 -
示例代码
/*
内部类访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
*/
public class Outer{
private int num=10;
public class Inner{
public void show() {
System.out.println(num);
}
}
public void method(){
Inner i=new Inner();
i.show();
}
}
成员内部类
-
成员内部类的定义位置
- 在类中与类中方法,成员变量是一个位置
-
外界创建成员内部类格式
- 格式:外部类名.内部类名 对象名=外部类对象.内部类对象;
- 举例:Outer.Inner oi=new Outer().new Inner();
-
成员内部类的推荐使用方案
- 将一个类,设计为内部类的目的,大多数都是不想染发外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法。方法内部创建内部对象并调用。
-
示例代码:
class Outer {
private int num = 10;
private class Inner {
public void show() {
System.out.println(num);
}
}
public void method() {
Inner i = new Inner();
i.show();
}
}
public class InnerDemo {
public static void main(String[] args) {
//Outer.Inner oi = new Outer().new Inner();
//oi.show();
Outer o = new Outer();
o.method();
}
}
局部内部类
- 局部内部类定义位置
- 局部内部类是在方法中定义的类 - 局部内部类方式方法
- 局部内部类,外界是无法直接使用,需要再方法内部创建对象并使用
- 该类可以直接访问外部类成员,也可访问方法内的局部变量 - 实力代码
class Outer {
private int num = 10;
public void method() {
int num2 = 20;
class Inner {
public void show() {
System.out.println(num);
System.out.println(num2);
}
}
Inner i = new Inner();
i.show();
}
}
public class OuterDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
匿名内部类
- 匿名内部类的前提
-存在一个类或是接口,这里的类可以是具体类也可以是抽象类 - 匿名内部类的格式
- 格式:new 类名(){重写方法}
new 接口名(){重写方法}
- 举例:
new Inner(){
@Override
public void method(){}
}
-
匿名内部类的本质
- 本质:是一个继承了该类或者实现了该接口的子类匿名对象 -
匿名内部类的细节
- 匿名内部类可以通过多态形式接受
Inter i = new Inter(){
@Override
public void method(){
}
}
- 匿名内部类直接调用方法
interface Inter{
void method();
}
class Test{
public static void main(String[] args){
new Inter(){
@Override
public void method(){
System.out.println("我是匿名内部类");
}
}.method(); // 直接调用方法
}
}
匿名内部类在开发中的使用
- 当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统代码
常用API
Math类
Math 类包含用于执行基本数学运算的方法,它的方法都是static修饰的,直接用类名调用即可。
public final static double PI
圆周率是一个常量,等于3.141592653...
public static double abs(double a)
返回 double 值的绝对值。
public static double max(double a, double b)
返回两个 double 值中较大的一个
public static float min(double a, double b)
返回两个 double 值中较小的一个
public static double pow(doubel a,double b);
求a的b次幂
public static double floor(double a)
对小数向下取整 3.5 --> 3.0 ; 3.1 -> 3.0
public static double ceil(double a)
对小数向上取整 3.5 --> 4.0 ; 3.1 -> 4.0
public static int round(double a)
对小数进行四舍五入 3.5 --> 4 ; 3.1 -> 3
public static double random()
生成一个[0,1.0)的小数
System类
public static void exit(int status)
退出Java虚拟机
public static void gc()
运行垃圾回收器,在空闲的时候回收未用的垃圾
public static long currentTimeMillis()
获取当前系统时间的毫秒值
(以1970年1月1日0时0分0秒为时间的起点,到现在一共过了多少毫秒)
Object类
Object是所有类的根类(顶层的父类),任何一个类都可以使用它的方法。
public String toString()
把一个对象转化为字符串 默认格式为:"类名+@+哈希码值十六进制" (看做地址值)
建议:alt+insert复写toString方法 返回对象的属性值组成的字符串
public boolean equals(Object obj)
用来比较两个对象的地址是否相同,底层就是使用"=="进行比较的.
但是,子类重写equals方法可以按照自己的方式进行比较。
建议:alt+insert复写equals方法 对对象的属性值进行比较。
冒泡排序
- 把相邻的两个元素进行比较,把小的往前放,大的往后放
- 比较的轮数是长度-1
- 每一轮比较的次数依次递减
int[] array=[5,4,2,3,1,6];
//比较的轮数是长度-1
for(int i=0;i<array.length-1;i++){ //i=0,i=1,i=2,i=3,i=4
//每一轮比较的次数依次递减
for(int j=0;j<array.length-1-i;j++){ //j=[0,4],j=[0,3],j=[0,2],j=[0,1],j=[0,0]
//把相邻的两个元素进行比较,把小的往前方,大的往后放
if(array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
//把数组中的元素按照指定的规则组成一个字符串:[元素1, 元素2, ...]
public static String arrayToString(int[] arr){
StringBuilder sb=new StringBuilder();
sb.append("[");
for(int i=0;i<arr.length;i++){
if(int[i]==arr.length-1){
sb.append(arr[i])}else{
sb.append(arr[i]).append(",");
}
}
sb.append("]");
String s=sb.toString();
return s;
}
Arrays工具类
Arrays是用来操作数组的工具类,它的方法都是静态的
public static void sort(int[] array)
对数组中的元素进行排序
public static int binarySearch(int[] a, int key)
使用二分查找法查找数组中指定的元素的索引
注意:使用二分查找【必须保证元素有序,元素不能重复】
public static String toString(int[] a)
把一个数组转化为字符串 如:[10, 20, 40, 60, 70, 80, 90]