首页 > 编程语言 > 详细

Head First Java总结

时间:2020-11-16 15:57:29      阅读:30      评论:0      收藏:0      [点我收藏+]

一.可以用数组创建对象

public class Demo {
    public static void main(String[] args) {
        Dog[] pets;
        pets = new Dog[7];
        pets[0] = new Dog();
        pets[1] = new Dog();
        pets[0].name = "Fido";
        pets[0].eat();
    }
}

 

二.方法可以声明多个返回值吗?有没有别的方法可以返回多个值?

答:方法只能声明单一的返回值。如果需要返回3个int值,就把返回值类型说明为int类型的数组,将值装进数组中来返回。

如果有混合不同类型的值要返回时,可以用ArrayList。

 

三.==和equals

==来比较两个基本数据类型是否相等,或者判断两个引用是否引用同一个对象

equals()来判断两个对象在意义上是否相等

在源码中,equals()和==是一样的:

    public boolean equals(Object obj) {
        return (this == obj);
    }

 

四.继承中调用哪个方法

调用对象引用的方法时,得调用到与该对象类型最接近的方法——最低阶的胜出

如:wolf继承canine,canine继承animal,调用方法时JVM会从最低阶也就是wolf找起,向上找直到找到为止

(wolf不必像接口那样在implement的类中一定得实现接口里的全部方法(毕竟接口中的全是抽象方法),wolf可以不写父类的方法,调用的时候直接调父类的方法)

 

五.多态

public class Demo {
    public static void main(String[] args) {
        Animal[] animals = new Animal[5];
        animals[0] = new Cat();
        animals[1] = new Dog();
        animals[2] = new Wolf();
        for (int i = 0; i < animals.length; i++) {
            animals[i].eat();
        }
    }
}

使用多态时,可以编写出引进新型子类时也不必修改的程序

 

六.方法覆盖的规则

覆盖的方法必须要有相同的参数和返回类型

如以下就不是覆盖:

boolean turnOn()

=====

boolean turnOn(int level)

不能降低方法的存取权限:不能覆盖掉一个公有的方法并将其标记为私有

如以下就不是覆盖:

public boolean turnOn()

======

private boolean turnOn()

定义为final的方法不能被覆盖

 

七.万用类

7.1.Object类是java所有类的子类

如:ArrayList的方法都用到Object这个终极类,因为每个类都是对象的子类,所以ArrayList可以处理任何类

7.2.Object类是可以实例化的,因为有时候你就是需要一个通用的对象,一个轻量化的对象

7.3.为什么不把所有的返回值类型都设置成Object类型的?

答:比如:

Object o = new Ferrai();
o.goFast();

第二行无法通过编译,因为这时候JVM会把它当做Object类型的实例,这代表你只能用Object里的方法

即:你只能从确实有该方法的类中去调用!

7.4.如果将一个ArrayList声明为Object的

ArrayList<Object> myDogArrayList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogArrayList.add(aDog);
//这时候要尝试把Dog对象取出来并赋给Dog的引用时会发生什么?
Dog d = myDogArrayList.get(0);

无法通过编译!

任何从ArrayList<Object>取出的东西都会被当做Object类型的引用而不管它原来是什么!

取出的Object都会被当做是Object这个类的实例,无法将其识别为除Object以外的事物

调用出的对象只能当做Object类型,无法调用除Object类意外的方法——编译器只管引用的类型,而不管对象的类型

 

八.父类的构造器

8.1.

public class Animal{
    public Animal(){
        System.out.println("Making an Animal");
    }
}

public class Hippo extends Animal{
    public Hippo(){
        System.out.println("Making a Hippo");
    }
}

public class TestHippo{
    public static void main(String[] args){
        System.out.println("Starting...");
        Hippo h = new Hippo();
    }
}

这时候执行new Hippo()操作,构造器会如何调用?

答:先调用Hippo(),再调用Animal(),再调用Object(),将这三个分别压栈

然后执行的时候弹栈,先输出Object()的neir,再是Animal(),接着Hippo()

想调用父类的构造器,就用super()

也可以用诸如super(name)的方式将参数给父类的构造器

public class Animal{
    private String name;
    public String getName(){
        return name;
    }
    public Animal(String theName){
        name = theName;
    }
}

public class Hippo extends Animal{
    public Hippo(){
        super(name); 
    }
}

public class TestHippo{
    public static void main(String[] args){
        System.out.println("Starting...");
        Hippo h = new Hippo();
        System.out.println(h.getName());
    }
}

先传入给父类,然后调用父类的方法

8.2.带有private的构造器来限制非抽象类被初始化,如防止Math被初始化,这样就无法创建它的实例

 

九.final

class Foo{
    final static int x;
    static{
        x = 42;
    }
}

以上是能被初始化的!如果没有static后面的就不能通过编译

 

十.多线程

10.1.如何启动新的线程

  • 建立Runnable对象(线程的任务)

  Runnable threadJob = new MyRunnable();

  • 建立Thread对象(执行工人)并赋值Runnable(任务)

  Thread myThread = new Thread(threadJob);

  即将Runnable对象传给Thread的构造器,这会告诉Thread对象要把哪个方法放在执行空间去运行——Runnable的run()方法

  • 启动Thread

  myThread.start();

Thread是个工人,Runnable是这个工人的工作,Runnable这个接口只有一个方法——run();

 

Head First Java总结

原文:https://www.cnblogs.com/DiamondDavid/p/13984963.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!