java核心技术卷-读书笔记(一)

继承

  • 定义子类
    extends关键字
public class Manager extends Employee
{
}
  • 覆盖方法
public class Manager extneds Employee
{
           public double getSalary()
           {
                   return salary + bonus;//wont work
           }
}
不能运行,manager类的getSalary方法不能直接访问超类的私有域,
,也就是说 :尽管每个manager对象拥有一个salary的域。
但在manager类的getsalary方法不能访问salary,
只有employee类能访问,如果子类一定要访问必须借助超类公有的端口,关键字super
public double getSalary()
{
    double baseSalary = super.getSalary();
    return baseSalary + bonus;
}
  • 子类构造器
public Manager(String name, double salary, int  year, int month,int day)
{
     super(name,salary,year,month,day);
     bonus = 0;
}
由于manager类的构造器不能访问employee类的私有域
得通过超类的构造器对这部分私有域进行初始化super(.....)
super调用构造器的语句必须是子类构造器的第一条语句
如果子类的构造器没有显示的调用超类的构造器,则将自动地调用超类默认的构造器(没有参数)

多态

一个Employee变量既可以引用一个employee类对象
也可以引用一个Employee类的任何一个子类的对象

Manager boss = new Manager(..);
Employee[] staff = new Employee[3];
staff[0] = boss;

但是,不能将一个超类的引用赋给子类变量
方法调用
1.查看对象的声明类型和方法名
2.重载解析
3.如果是private,static,final方法,编译器将可以准确地知道调用哪个方法(静态绑定)

  • 阻止继承:final类和方法
public final class Executive extends Manager
{
}
不能定义子类
public class Employee
{
      .....
      public final String getName()
      {
          return name;
      }
} 
子类不能覆盖方法
  • 只能在继承层次内进行类型转化
  • 在将超类转化成子类之前,应该使用instanceof进行检查
if( staff[1] instanceof Manager)
{
     boss = (Manager) staff[1];
}

抽象类

abstract关键字

为了提高代码的清晰度,有抽象方法的类必须定义成抽象类
public abstract class Person
{
     ....
     public abstract String getDescription();
}

抽象类可以包含具体的方法和参数(和纯虚函数不一样)

public abstract class person
{
        private String name;
        public person(String name)
        {
             this.name =name;
        }
        public abstract String getDescription();
        public String getName()
        {
        return name;
        }
         
} 

(抽象类不能实例化)

Person[] people = new Person[2];
people[0] = new Employee(...);
people[1]  = new Students(..);
for(Person p : people)
System.out.println(p.getName() + "," + p.getDescription());

由于不能构造抽象类的对象p不会引用person,而是引用子类的具体方法

object:所有类的超类

  • equals方法
    如果子类能拥有自己的相等概念,则对称性将强制采用getclasss进行检测。
    如果由超类决定 instanceof
    编写equals方法的建议
public boolean equals(Object otherObject )
{
   if( this == otherObject) return true;//比较引用
   if(getClass() != otherObject.getClass()) return false;
   if(!(otherObject instanceof ClassName)) return false;
   className other = (ClassName) otherObject
   return field1 == other.fileld1
   && Objects.equals(field2,other.field2)
   && ...;
   子类super.equals(other)
}

 - hashCode方法
 

```java
public int hashCode()
{
     return Object.hash(name,salary,hireDay);
}
  • toString(没啥内容)

  • 泛式数组
    ArrayList
    add(n,e)//可以中间插入,也可末尾
    size()
    set(i,harry)
    remove()

## 对象包装器与自动装箱
有时,需要将int这样的基本类型转化成对象,:Integer,Long,Float,Double,Short,Byte,Character,Void,Boolean
自动装箱
## 参数数量可变的方法
...是java代码的一部分。表示可以接受任意数量的对象

```java
public static double max(double... values)
{
      double largest = Double.NEGATIVE_INFINTY;
      for(double v : values) if(v > largest) largest = v;
      return largest;
      
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值