1.static(静态):修饰成员变量,成员方法,静态块。
静态变量和静态方法的调用:类名和对象名调用。调用语法:类名.静态变量名或方法名();
对象名.静态变量名或方法名()。
正是因为静态的变量和静态方法属于类,所以它的生命周期从类加载到程序终止或挂掉。所以静态的变量和方法比较占用资源。
(1)静态变量:它属于我们类,这个类中所有的对象共享这个静态变量。
加载时间:在类加载时先加载静态变量再加载成员变量。
语法:public static 数据类型 变量名;
适用场景:当一个变量不属于任何一个对象或者是所有的对象共享时,咱们就可以用静态变量。
(2)静态方法:它属于类,这个类的所有对象共享。
语法:public static 返回值类型 方法名(){};
适用场景:当一个类为工具类,那这个类中的方法是工具方法就可以声明静态方法。
注:
a.在静态方法中只能直接调用静态方法和静态变量,不可以直接调用非静态的方法和非静态变量。
但是可以在静态方法中,通过对象名.非静态变量或方法()来调用。
eg:Student s1=new Student();
s1.show1();
b.在非静态方法中,既可以调用静态变量和方法也可以调用非静态变量和方法。
(3)静态块:在类加载时执行,而且只执行一次
语法:static{
静态语句块;
}
适用场景:作预处理或初始化。
2.继承:实现代码的复用性。场景:满足 “ 子类 is-a 父类”。
(1)关键字:extends。
(2)被继承的类:父类,超类,基类
继承的类:子类,衍生类
(3)继承的语法:
public class 父类名{
}
public class 子类名 extends 父类名{
}
(4)子类可以继承父类的公有的属性,方法;不能继承父类私有的属性和方法,构造方法。
(5)Java中所有的类都是直接或间接继承自Object类。
(6)继承的特性:
a.单根性:一个类只能直接继承一个父类。
b.继承的传递性:a类继承b类,b类继承c类,那么a类就间接的继承了c类。
teacher->people->object
(7)在New子类对象时,如果自己不调用父类构造,系统默认先调用父类的无参构造,再调用子类的构造。
在New子类对象时,如果自己调用父类构造,系统不会调用父类的无参构造,就会按照自己指定调用的父类构造执行,执行完了后,再调用子类构造。
只要New子类对象,一定先调用父类构造,再调用子类构造。
3.super:指代的是当前的父类对象。
super(参数列表):调用父类的构造方法。
用super调用父类构造时,只能写在构造方法中的第一句。
可以用super调用父类的属性和方法。
4.方法重写:
(1)适用场景:当父类的方法,子类继承过来后无法满足子类需求时,子类就要重写这个方法的方法体。就要用方法重写。
(2)方法重写的条件:a.有继承 b.子类要重写父类的方法体 c.重写的方法上一定要有@Override注解
d.重写的方法的方法名,参数列表一定要与父类相同,重写的方法的返回值类型只要与父类中被重写的方法兼容,重写的方法的访问修饰符比父类中被重写的方法的访问修饰符范围相同或者更大就可以。
(3)@Override用来检查当前的方法是否是方法重写。它会严格按照方法重写的要求检查方法。
5.Object:是所有类的父类。
(1)toString();
(2)==和equals的区别
==:是一个比较运算符,如果==左右两边的值是基本数据类型(int,double,long,boolean),比较的是值。
如果==左右两边的值是引用数据类型,比较的是内存中的地址。
equals():是一个方法。如果equals()方法子类不重写,它的效果是与==是一样。
如果equals()方法子类重写,它比较的就是值。
(3)在String类中重写父类object类中的equals(),所以两个字符串对象比较的时候,用equals()比较的是值
6.final:修饰类,成员变量,成员方法。
(1)常量:用final修饰的成员变量叫常量。 语法:public final 数据类型 常量名=常量值;
a.常量名全大定。
b.常量在对象初始化的时候就要赋值(在声明时赋值或在构造方法时赋值)。
c.常量只能赋一次值。
d.常量一旦赋值,值就不可以改。
(2)最终方法:用final修饰的成员方法叫最终方法。最终方法不能被重写。
eg:public final 返回值类型 方法名(参数列表) { };
(3)最终类(断子绝孙):用final修饰的类叫最终类。最终类不能被继承。
eg:String.
7.包:管理类,避免类重名。在同一个包中,不能同名的类;在不同的包中可以有同名的类。
包名命名规范:(包名全小写),com.公司名或者组织名.项目名.三层架构名。
声明包:package 包名;
在一个类中,如果想用另外一个包中的类,就要导包。
导包语法:import 包名.类名
import 包名.* 表示导入当前包中所有的类。
8.访问修饰符
修饰符 同一个类中 同一个包中 不同包
(子类中) 全局
Private Yes
Default Yes Yes
Protected Yes Yes Yes
Public Yes Yes Yes yes
9.对象数组:存储一组相同数据类型的数据,数组中每一个空间存一个对象。
对象数组:在外层看是一个数组遵循数组的使用原则,数组中每一个空间是一个对象,遵循对象的使用原则。
eg:/**
* 学生类
* @author sx
*
*/
public class Student {
/**
* 学生姓名
*/
public String stuName;
/**
* 点名的次数
*/
public int count;
}
public static void main(String[] args) {
//int[] nums=new int[5];
//初始化学生数组
Student[] stus=new Student[5];
//因为数组中每个空间中存的是一个学生对象,所以在用时一定要先New出来才能调用属性
stus[0]=new Student();
stus[0].stuName="科比";
stus[0].count=0;
stus[1]=new Student();
stus[1].stuName="詹姆斯";
stus[1].count=0;
stus[2]=new Student();
stus[2].stuName="安东尼";
stus[2].count=0;
stus[3]=new Student();
stus[3].stuName="保罗";
stus[3].count=0;
stus[4]=new Student();
stus[4].stuName="韦德";
stus[4].count=0;
Scanner input=new Scanner(System.in);
String answer;
do {
answer="n";
//生成一个随机数,用来点名
int r=(int)(Math.random()*5);
System.out.println("本次抽中的学员为:"+stus[r].stuName);
stus[r].count++;
System.out.println("是否继续抽取学员回答问题?(y/n)");
answer=input.next();
} while (answer.equals("y"));
System.out.println("谢谢使用!本次学员命中信息如下:");
System.out.println("姓名\t命中次数");
for (int i = 0; i < stus.length; i++) {
System.out.println(stus[i].stuName+"\t"+stus[i].count);
}
}