《head first java》 学习笔记

  • 2015-09-18
  • 浏览 (59)

面向对象的三大特性:抽象、封装、多态

String是对象。
对象有状态和行为两种属性,分别由实例变量和方法来表示,状态影响行为,行为影响状态。

封装:调用和设置对象的实例变量只能通过方法来获取。
private int height;
public void setHeight(int ht){
    if(ht>9){
         height=ht;
    }
}
上面方法是设置对象的高度变量,这样做有很多好处,如:如果有人用到了你的公有变量,万一有一天你发现这个公有变量需要检查,那这些人都要跟着改成调用setter方法。别人只调用了setHeight()方法,日后你想修改这个方法可以尽管修改而不会使调用这个方法的代码也要跟着要修改。

实例变量和局部变量的区别:
1、实例变量是声明在类内而不是方法中;
2、局部变量是声明在方法中的;
3、局部变量在使用前必须初始化。

局部变量没有默认值,实例变量永远都有默认值。

继承的意义:
1、避免了重复的代码;
2、定义出共同的协议(继承让你可以确保某个父型之下的所有类都会有父型所持有的全部可继承的方法)。
对象声明、创建与赋值的3个步骤:
Dog dog = new Dog();
1、声明一个引用变量:
Dog dog
2、创建对象:
new Dog();
3、连接对象和引用
Dog dog = new Dog();

Animal myDog = new Dog();
myDog.eat();                        // This is ok!
myDog.bark();                       // It has a problem.The Animal hasn't the method of bark().
Dog d = (Dog) myDog;
d.bark();                          // This is Ok now! The Dog has the method of bark();

你可以将整个类标识成final,表示没有任何的方法可以被覆盖。如果你想防止特定的方法被覆盖,可以将该方法上final这个修饰符。
有些类不应该被初始化(比如Animal这个类是不应该有实例的(Animal是什么样的?))。
抽象类代表没有人能够创出该类的实例。
只有抽象类才能有抽象方法。
一个非抽象类继承了一个抽象类,这个非抽象类必须实现抽象类的所有抽象方法。

Object是所有类的源头,它是所有类的父类。
hashCode()该方法返回的值一般是通过将该对象的内部地址转换成一个整数来实现的。

java不支持多重继承。

接口(interface)的方法一定是抽象的。
何时使用接口:如果想要定义出类可以扮演的角色,使用接口。
使用接口的好处:多态!接口有无比的适用性,若你以接口取代具体的子类或抽象的父类作为参数的类型或返回类型,则你可以传入任何实现该接口的东西。这么说吧,使用接口你就可以继承超过一个以上的来源。类可以extends过某个父类,并且实现其他的接口。同时其他的类也可以实现同一个接口。因此你就可以为不同的需求组合出不同的继承层次。
public interface Pet{
    public abstract void beFriendly();
}

public abstract class Animal{
    public void eat(){
        System.out.println("I am eating now!");
    }
}

public class Dog extends Animal implements Pet{
    public void beFriendly(){
        System.out.println("I am very friendly!");
    }
}

public class Cat extends Animal implements Pet{
    public void beFriendly(){
        System.out.println("I am very friendly!");
    }
}

public class Wolf extends Animal{

}

public class MultipleTest{
    public static void main(String[] args){
        MultipleTest m = new MultipleTest();
        Dog dog = new Dog();
        Cat cat = new Cat();
        Wolf wolf = new Wolf();
        m.method0(dog);
        m.method0(cat);
        m. method0(wolf);
        m.method1(dog);
        m.method1(cat);
    }

    public void method0(Animal a){
        a.eat();
    }
    
    public void method1(Pet p){
        p.beFriendly();
    }    
}
运行结果:
I am eating now!
I am eating now!
I am eating now!
I am very friendly!
I am very friendly!
从上面的代码可以看出:如果没有接口,那么只可以实现简单的多态(只可以使用Animal作为参数的类型或返回类型),有了接口之后就可以实现复杂的多态了(还可以使用Pet作为参数类型或返回类型)。再次提醒:如果想要定义出类可以扮演的角色,使用接口。


正文到此结束