面向对象的特征:
封装、继承和多态
多态的实现方法:
1.通过子类对父类方法的重写(override)实现多态
1)子类中使用与父类中同名的方法,且方法的参数(个数、类型、排列顺序)和返回类型完全一样
2)向上追溯原则
在Java语言中,当调用一个对象的方法时,首先在对象所在的类中寻找这个方法,因此调用时子类方法优先于父类方法。如果没有找到的话,Java会把这个方法调用传到类层次的上一级(直接父类),直到找到这个方法就引用。如果还找不到,继续向上一级传递(父类的父类),直到找到这个方法的签名为止。如果到顶层类也找不到,则系统将提示未能找到的错误信息。
3)子类范围必须大于等于父类范围
2.同一类中定义同名方法即重载(overload)实现多态
super 关键字的使用
1、调用父类中被重写的方法
super.方法名(参数) super.display();
2、用来访问父类中被隐藏的成员变量
super.成员变量名
3、调用父类中的构造方法
super(参数);
访问控制修饰符
Static:静态变量,静态方法
静态变量只初始化一次,与C中得全局变量相似; 多个对象共有静态变量存储空间,不会为每个对象分配相应的空间存储静态变量。因此,静态变量可以直接用类名引用。 静态变量可以用类名或对象引用。
java中值传递和引用传递
//用不同方法交换两个变量的值。
//MethodExample1.java
public class MethodExample1
{
int n1,n2; //定义成员变量n1,n2
/***下边定义方法swap_value,该方法的功能是交换变量n1,n2的值。
*n1,n2的值由调用者的实际参数值传递而来。
*/
public void swap_value(int n1,int n2) //定义成员方法带两个整型参数
{//按值传递
int n0; //定义方法变量n0,
n0=n1; //先将n1的值赋给n0
n1=n2; //再将n2的值赋给n1
n2=n0; //最后将n0 (原n1) 的值赋给n2
System.out.println("在方法swap_value中:n1="+n1+"; n2="+n2);
}
/**下边定义方法swap,该方法的功能是交换对象中成员变量n1,n2的值。
*对象n调用者的实际参数传递而来。
*/
public void swap(MethodExample1 n)
{//按引用传递
int n0; //借助方法变量n0,交换成员变量n1,n2的值
n0=n.n1;
n.n1=n.n2;
n.n2=n0;
System.out.println("在方法swap中:n.n1="+n.n1+"; n.n2=" +n.n2);
}
public static void main(String [] arg) //以下定义main()方法
{
int n1=1,n2=10; //定义方法变量
MethodExample1 numbers=new MethodExample1(); //生成本类对象
numbers.swap_value(n1,n2); //变量n1,n2的值为实参调用swap_value
System.out.println("在main()方法中:n1="+n1+" n2="+n2);
numbers.n1=5; //为对象的成员变量n.n1赋值
numbers.n2=20; //为对象的成员变量n.n2赋值
numbers.swap(numbers); //以对象numbers为实参调用方法swap
System.out.println("在main()方法中:numbers.n1="+numbers.n1+" numbers.n2="+numbers.n2);
}
}
用不同方法交换两个变量的值。
//MethodExample1.java
public class MethodExample1
{
int n1,n2; //定义成员变量n1,n2
/***下边定义方法swap_value,该方法的功能是交换变量n1,n2的值。
*n1,n2的值由调用者的实际参数值传递而来。
*/
public void swap_value(int n1,int n2) //定义成员方法带两个整型参数
{//按值传递
int n0; //定义方法变量n0,
n0=n1; //先将n1的值赋给n0
n1=n2; //再将n2的值赋给n1
n2=n0; //最后将n0 (原n1) 的值赋给n2
System.out.println("在方法swap_value中:n1="+n1+"; n2="+n2);
}
/**下边定义方法swap,该方法的功能是交换对象中成员变量n1,n2的值。
*对象n调用者的实际参数传递而来。
*/
public void swap(MethodExample1 n)
{//按引用传递
int n0; //借助方法变量n0,交换成员变量n1,n2的值
n0=n.n1;
n.n1=n.n2;
n.n2=n0;
System.out.println("在方法swap中:n.n1="+n.n1+"; n.n2=" +n.n2);
}
public static void main(String [] arg) //以下定义main()方法
{
int n1=1,n2=10; //定义方法变量
MethodExample1 numbers=new MethodExample1(); //生成本类对象
numbers.swap_value(n1,n2); //变量n1,n2的值为实参调用swap_value
System.out.println("在main()方法中:n1="+n1+" n2="+n2);
numbers.n1=5; //为对象的成员变量n.n1赋值
umbers.n2=20; //为对象的成员变量n.n2赋值
numbers.swap(numbers); //以对象numbers为实参调用方法swap
System.out.println("在main()方法中:numbers.n1="+numbers.n1+" numbers.n2="+numbers.n2);
}
}
按值传递
Java语言与C/C++语言相比,参数的传递方法有所不同。对基本的数据类型,Java中只有一种传递方法,即通过值传递(pass by value)),方法接收的是原来值的一份拷贝(复制),方法接收参数的值,但不能改变这些参数的值。
按引用传递
在main()方法中,调用语句: numbers.swap(n); 实参numbers为本类对象。
调用方法将此对象传递给swap方法声明的形参n,然后n作为对象在方法体内参与运算。这种按引用传递的方式改变了原来对象(实参)的属性值。 当给一个方法传递一个对象或一个数组时,则是按引用传递的。
因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。数组中的元素既可是基本类型的数据,也可以是对象。
抽象的两种形式
抽象类和接口
抽象类
1.包含抽象方法的类必须是抽象类,一个抽象类对抽象方法的个数不限制
2.抽象方法没有方法体,普通方法必须有方法体
3.抽象类只能被继承,不能实例化
4.抽象类继承并不要求强制实现父类所有抽象方法,但是非抽象子类必须实现所有未实现的抽象方法。
5.一个类不能既是抽象类又是final 类
接口
特殊的抽象类,java类可以实现多个接口,接口成员默认属性public static final,可以省略,成员方法默认public abstract,也可以省略,也可定义带方法体的方法,需要使用default修饰。
随机生成0-10的整数
import java.util.Random;
Random random=new Random();
A=random.nextInt(10);
用空格将字符串分开
String[] words=line.trim().split(" ");
格式化输出不足6位数的数字(字符串类型)
String rr=String.format("%06d", x);
格式化输出当前时间
import java.text.SimpleDateFormat;
import java.util.Date;
SimpleDateFormat ft = new SimpleDateFormat ("yyyyMMdd");
String date=ft.format(new Date());
数组的创建
一维数组
(1)int []x =new int[100];
(2)ArrayList<Integer> x = new ArrayList<>(); // 创建一个动态整数数组列表
二维数组
(1)int numRows = 3;
int[][] matrix = new int[numRows][];
(2)ArrayList<ArrayList<Integer>> matrix = new ArrayList<>();
输出数组x中的最小值
System.out.println(Arrays.stream(x).min().getAsInt());
int min=Math.min(x1,x2);
获取最大值
Integer.MAX_VALUE
字符串的反转
StringBuffer str1=new StringBuffer(scanner.nextLine());
字符串中的某个字符
str.charAt(index);