public class Coder{
String name; //姓名
int age; //年龄
double salary; //工资
}
public class Manager{
String name; //姓名
int age; //年龄
double salary; //工资
}
public class Hr{
String name; //姓名
int age; //年龄
double salary; //工资
}
public class Employee{
String name; //姓名
int age; //年龄
double salary; //工资
}
public class Coder extends Employee{
}
public class Manager extends Employee{
}
public class Hr extends Employee{
}
优点:
1. 提高了代码的复用性
2. 提高了代码的可维护性
3. 是多态的前提
弊端:
代码的耦合性增强了
类与类的关系过于紧密
继承的使用场景:
当发现多个类之间存在共性内容 (相同的内容), 并且还产生了 is...a 的关系, 这时候就可以考虑使用继承来优化代码
根据就近原则, 优先使用子类的
super
子类方法逻辑, 但这不是就近原则, 是子类的方法对父类方法进行了重写
在继承体系中,子类可以继承到父类的方法
但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改
这就需要采用方法的重写,方法重写又称方法覆盖
规则 :
子类重写父类方法,需要保证方法声明完全一致(方法名,参数,返回值类型需要保持一致)
注意事项 :
* 父类中私有的方法子类不能重写
* 子类重写父类方法的时候,访问权限需要大于等于父类可以使用注解 @Override 来校验当前方法是否是一个重写的方法
1.5.1单继承
Java只支持单继承,不支持多继承,但支持多层继承
* 单继承:一个类,只能有一个父类
* 多层继承:子类可以继承父类,父类可以继续继承爷爷类
public class A{
public void methodA(){
System.out.println("A...method");
}
}
public class B extends A {
public void methodB(){
System.out.println("B...method");
}
}
public class C extends B{
}
不可以, 因为构造方法要求方法名和类名保持一致
一定要!因为子类在初始化的过程中,很有可能会使用到父类的数据
因此,子类在初始化之前,一定要先完成父类数据的初始化.
思考,初始化一个对象,用的是什么方法?
构造方法
在所有构造方法中 (Object类除外),默认隐藏着一句话 super();
通过这句话来访问父类的空参构造方法
意义所在:子类可以将所需要的所有数据,通过有参构造方法接收,其中父类有的数据,就通过super()交给父类完成初始化!
final 关键字是最终的意思,可以修饰(方法,类,变量)
修饰方法:表明该方法是最终方法,不能被重写
修饰类:表明该类是最终类,不能被继承
修饰变量:表明该变量是常量,不能再次被赋值
常量的命名规范:
一个单词:所有字母大写
MAX
PI多个单词:所有字母大写,中间使用 _ 分隔
MAX_VALUE
MIN_VALUE————————————————————————————————————————
基本数据类型 : 数据值不可改变
引用数据类型 : 地址值不可改变成员变量初始化时机 :
1). 在定义的时候直接赋值(推荐)
2). 在构造方法结束之前完成赋值
static 是静态的意思,可以修饰成员变量,也可以修饰成员方法,被其修饰的成员只在内存中 [只存储一份],可以被 [共享] 访问、修改。
class User{
String name;
int age;
static int onLineNumber;
}
public class StaticTest1 {
public static void main(String[] args) {
User.onLineNumber++;
User u1 = new User();
u1.name = "张三";
u1.age = 23;
System.out.println(u1.name+"---"+u1.age+"---"+User.onLineNumber);
User u2 = new User();
u2.name = "李四";
u2.age = 24;
System.out.println(u2.name+"---"+u2.age+"---"+User.onLineNumber);
}
}
特点:
1. 被 static 修饰的成员变量, 被类的所有对象所共享
2. 多了一种调用方式, 可以通过类名.进行调用
3. 随着类的加载而加载, 优先于对象存在
1. 静态方法
2. 实例方法(非static的)
1. 静态方法
A : 类名调用 (推荐)
B : 对象调用 (不推荐)
2. 实例方法(非static的)
A : 只能对象调用
表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明成实例方法。
如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明成静态方法。
对于一些应用程序中多次需要用到的功能,可以将这些功能封装成静态方法,放在一个类中,这个类就是工具类。
一是方便调用,二是提高了代码复用
建议将工具类的构造器私有,不让工具类对外产生对象。
需求:在实际开发中,经常会遇到一些数组使用的工具类。请按照如下要求编写一个数组的工具类:ArraysUtils
请在ArraysUtils中提供一个工具类方法toString,用于返回整数数组的内容,返回的字符串格式如:[10, 20, 50, 34, 100](只考虑整数数组,且只考虑一维数组)经常需要统计平均值,平均值为去掉最低分和最高分后的分值,请提供这样一个工具方法getAerage,用于返回平均分。(只考虑浮点型数组,且只考虑一维数组)
定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果。
静态中只能访问静态, 静态中没 this
在Java类下,使用 { } 括起来的代码被称为代码块
局部代码块
位置:方法中定义
作用:限定变量的生命周期,及早释放,提高内存利用率构造代码块
位置:类中方法外定义
特点:每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行
作用:将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性静态代码块
位置:类中方法外定义
特点:需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
作用:在类加载的时候做一些数据初始化的操作同步代码块
多线程时再学习