
(以下内容全部来自上述课程)
1.static--静态--共享
static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。
1.静态变量
被static修饰的成员变量,叫做静态变量。
特点:
- 被该类所有对象共享
- 不属于对象,属于类
- 随着类的加载而加载,优先于对象存在
调用方式:
- 类名调用(推荐)
- 对象名调用
2.静态方法
被static修饰的成员方法,叫做静态方法。
特点:
- 多用在测试类和工具类中
- javabean类中很少会用
调用方法:
- 类名调用(推荐)
- 对象名调用
3.static内存图
静态变量是随着类的加载而加载的,优先于对象出现的。
4.工具类
JavaBean类:用来描述一类事物的类。
测试类:用来检查其他类是否书写正确,带有main方法的类,是程序的入口。
工具类:不是用来描述一类事物的,而是帮我们做一些事情的类。
1.规则:
- 类名见名知意
- 私有化构造方法
- 方法定义为静态
2.练习:
需求:在实际开发中,经常会遇到一些数组使用的工具类。
请按照如下要求编写一个数组的工具类:ArrayUtil
-
提供一个工具类方法printArr,用于返回整数数组的内容。
返回的字符串格式如:[10,20,50,34,100](只考虑整数数组,且只考虑一维数组)
-
提供这样一个工具方法getAerage,用于返回平均分。(只考虑浮点型数组,且只考虑一维数组)
-
定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果。
工具类:
java
package a02staticdemo2;
public class ArrayUtil {
//私有构造方法
//目的:是不让其他类创建本类对象
private ArrayUtil(){}
//需要定义为静态的,方便调用
public static String printArr(int[] arr){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length - 1){
sb.append(arr[i]);
}else{
sb.append(arr[i]).append(", ");
}
}
sb.append("]");
String s = sb.toString();
return s;
}
//返回平均值
public static double getAvg(int[] arr){
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
int avg = sum / arr.length;
return avg;
}
}
测试类:
java
package a02staticdemo2;
public class TestDemo {
public static void main(String[] args) {
//测试工具类中的两个方法是否正确
int[]arr = {1,2,3,4,5};
double avg = ArrayUtil.getAvg(arr);
System.out.println(avg);
String s = ArrayUtil.printArr(arr);
System.out.println(s);
}
}
5.注意事项
- 静态(公有)方法中,只能访问静态。
- 非静态(私有)方法可以访问所有。
- 静态方法中没有this关键字。(非静态中存在隐藏this,在形参之前,由虚拟机赋值)
2.继承
面向对象的三大特征:封装、继承、多态。
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
1.定义
- java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。
java
public class Student extends Person{}
- Student称为子类(派生类),Person称为父类(基类或者超类)。
2.好处
- 可以把多个子类中重复的代码抽取到父类中,提高了代码的复用性。
- 子类可以在父类的基础上,增加其他的功能,使子类更强大。
3.什么时候用继承
当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码。
4.继承的特点
java只支持单继承(一个爹),不支持多继承(好几个爹),但支持多层继承(子孙三代)。
每一个类都直接或者间接的继承于Object(爷爷)。
5.例子

1.Animal
java
package a01loopextendsdemo1;
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
public void drink(){
System.out.println("动物喝水");
}
}
2.Cat
java
package a01loopextendsdemo1;
public class Cat extends Animal{
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
3.Dog
java
package a01loopextendsdemo1;
public class Dog extends Animal{
public void lookHome(){
System.out.println("狗看家");
}
}
4.布偶猫
java
package a01loopextendsdemo1;
public class Ragdoll extends Cat{
}
5.狸花猫
java
package a01loopextendsdemo1;
public class LIHua extends Cat{
}
6.哈士奇
java
package a01loopextendsdemo1;
public class Husky extends Dog{
public void breakHoom(){
System.out.println("哈士奇拆家");
}
}
7.泰迪
java
package a01loopextendsdemo1;
public class Teddy extends Dog{
public void touch(){
System.out.println("泰迪狗蹭来蹭去");
}
}
8.测试类
java
package a01loopextendsdemo1;
public class Test {
public static void main(String[] args) {
//创建对象并调用方法
//1.创建布偶猫的对象
Ragdoll ragdoll = new Ragdoll();
ragdoll.eat();
ragdoll.drink();
//2.创建狸花猫的对象
LIHua liHua = new LIHua();
liHua.eat();
//3.创建哈士奇的对象
Husky husky = new Husky();
husky.eat();
husky.drink();
}
}