JAVA核心卷1-5继承

JAVA核心卷1-5继承

(目前本书 把子类父类叫做子类超类

//使用extends关键字进行继承
public class Manager extends Employee
{
//添加方法和域
}

覆盖方法
情况:超类中的某些方法对子类并不适用,比如Manager加了奖金实体,超类的getSalary不能直直接用,就需要在子类中写新的getSalary
但是子类中的getSalary方法不能够访问超类的私有域,还是需要用超类的getSalary来获取salary实体,于是可以使用关键字super

在覆盖方法时,子类方法不能低于超类方法的可见性:超类如果是public,子类一定也要是public

public class Manager extends Employee
{
   private double bonus;
   public double getSalary()
   {
   		/*double baseSalary = getSalary();
   		//这样不可行
   		*/
   		double baseSalary = super.getSalary();//使用super关键字,获取超类私有域
   		return bonus + baseSalary;
   }
}

子类中可以增加域、增加方法、覆盖超类方法,但是不能删除继承的域和方法

用final修饰类或者方法,final类不允许扩展,final方法不允许被覆盖

public final class Executive extends Manager{
    //...不允许扩展
}
public class Employee{
    public final String getName()
    {
        //该方法不允许被覆盖
    }
}

子类构造器

子类构造器不能访问超类的私有域,所以必须使用超类的构造器对这部分私有域初始化

public Manager (String name,double salary,int year,int month,int day){
    super(name,salary,year,month,day);//使用super调用构造器的语句必须是子类构造器的第一条语句
    bonus = 0;
}
//这里的super(n,s,year,month,day)是调用超类Employee中带这五个参数构造器的简写

如果子类构造器没有显式地调用超类的构造器,则将自动地调用超类无参构造器。

如果超类中没有无参构造器,并且子类没有调用超类其他构造器,则编译器报错

可以将子类的对象赋给超类变量, 不能把超类的引用赋给子类变量(否则ArryStoreException异常)

Employee e;
e = new Employee();
e = new Manager();

数据类型转换

只能在继承层次内进行类型转换

在将超类转换为子类之前,应使用instanceof进行检查

if(staff[1] instanceof Manager)
{
    Manager boss = (Manager) staff[1];
}

abstract关键字 声明抽象方法、抽象类

子类访问超类以protected声明的域,java中的protected概念要比cpp中的安全性差
思考:为啥差
Java中protected部分对所有子类以及同一个包中的所有其他类都可见

Object类:所有类的超类
可以使用Object类型变量引用任何类型的对象

Object obj = new Employee("Harry Hacker",35000);

image-20220825111919078

对于数组类型的域, 可以使用静态的 Arrays.equals 方法检测相应的数组元素是否相等

?散列码

ArrayList类,增删时有自动调节数组容量的功能

当ArrayList内部数组满了且还需要进行add操作时,数组列表自动创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大数组

Arraylist<Employee> staff = new ArrayList<>();//中括号中也可以填数字设置初始容量
//将雇员对象添加到数组列表
staff.add(new Employee("Tony Tester",...));
//获取 修改元素用get set方法
staff.set(i,harry);
Employee e = staff.get(i);
import java.util.ArraList<E>
ArrayList<e>();
//构造一个空数组列表
ArrayList<e>(int initialCapacity);
//用指定容量构造一个空数组列表
boolean add(E obj);
//在数组列表尾端添加一个元素(永远返回true
int size();
//返回数组列表中当前元素数量<=数组列表容量
void ensureCapacity(int capacity);
//?确保数组列表在不重新分配存储空间的情况下就能保存给定数量元素
void trimToSize();
//将数组列表的存储容量削减到当前尺寸

image-20220825162602893

import java.lang.Integer;
int intValue();
//以int形式返回Integer对象的值
static String toString()
    
static int parseInt(String s)
static int parseInt(String s,int radix)
//返回s表示的整型数值,默认十进制,radix指定进制
    
static Integer valueOf(String s)
static Integer valueOf(String s,int radix)

参数数量可变的方法

//printf方法
public class PrintStream
{
public PrintStream printf(String fmt , Object... args) { return format(fmt, args); }
}
//自定义可变参数方法,下面示例是计算若干数值中的最大值
public static double max (double... values)
{
double largest = Double.NECATIVEJNFINITY;
for (double v : values) if (v > largest) largest = v;
return largest;
}

枚举类

public enum Size{SMALL,MEDIUM LARGE EXTRA_LATGE};
Size.SMALL.toString();//返回字符串"SMALL"
//toString 的逆方法是静态方法valueOf
Size s = Enum.valueOf(Size.class,"SMALL");//将s设置成Size.SMALL
Size[] values = Size.values();//每个枚举类型都有一个静态的 values 方法, 它将返回一个包含全部枚举值的数组。
//返包含元素 Size.SMALL...Size.EXTRA_LARGE 的数组。
//ordinal 方 法 返 冋 enum 声 明 中 枚 举 常 量 的 位 置, 位 置 从 0 开始计数。
Size.MEDIUM. ordinal();//返回1

int compareTo(E other)
    
//如果枚举常量出现在other之前 则返回负 ==则0 在之后则正数    

Class类

Employee e;
Class c1 = e.getClass();//获得Class类型实例
e.getClass().getName();//获得e的类名
String className = "java.util.Random";
Class c2 = Class.getName(className);//通过类名获得对于Class对象
e.getClass().newInstance();//利用获取到的类 创建该类的实例

捕获异常

try 
{}
catch (Exception e)
{
    e.printStackTrace();
}
posted @ 2022-08-26 10:38  小草今天又在摸鱼吗  阅读(22)  评论(0编辑  收藏  举报