一.可以用数组创建对象
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 threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
即将Runnable对象传给Thread的构造器,这会告诉Thread对象要把哪个方法放在执行空间去运行——Runnable的run()方法
myThread.start();
Thread是个工人,Runnable是这个工人的工作,Runnable这个接口只有一个方法——run();
原文:https://www.cnblogs.com/DiamondDavid/p/13984963.html