30. Person p = new Person(“nasuf”,22);
此句话(1)因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中(2)执行该类中的static代码块,如果有的话,给Person.class类进行初始化;(3)在堆内存中开辟空间,分配内存地址(4)在堆内存中建立对象的特有属性,并进行默认初始化(5)对属性进行显示初始化(6)对对象进行构造代码块初始化(7)对对象进行对应的构造函数初始化(8)将内存地址付给栈内存中的变量;
31. 单例设计模式:解决一个类在内存只存在一个对象。想要保证对象唯一,(1)为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象;(2)还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象;(3)为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式;
将这三步涌代码体现,即为:(1)将构造函数私有化(2)在类中创建一个本类对象(3)提供一个方法可以获取到该类对象;如:
class Single //先初始化对象,称为:饿汉式
{
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
class SingleDemo
{
public static void main(String[] args)
{
Single s1 = Single.getInstance();
Single s2 = Single.getInstance(); //s1与s2指向同一个对象
}
}
对于事物该怎么描述,还怎么描述,当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可;
单例设计模式还可写为:
class Single //对象是方法被调用时才初始化,也叫做对象的延时加载;称为:懒汉式
{
private static Single s = null;
private Single(){};
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}
32. 子类要访问本类中的变量,用this;子类要访问父类中的同名变量,用super;
33. 子类覆盖父类,必须保证子类权限大于等于父类权限,否则编译失败;
34. 静态只能覆盖静态;
35. 重载:只看同名函数的参数列表;重写:子父类方法要完全一样(包括返回值类型);
36. 在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super(); super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
37. 子类之所以一定要访问父类的构造函数,是因为父类中的数据,子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的,所以在子类对象初始化时,要先访问一下父类中的构造方法;如果要访问父类中指定的构造方法,可以通过手动定义super语句的方式来指定;如:
class Person
{
private String name;
Person(String name)
{
this.name = name;
}
void show();
}
class Student extends Person
{
Student(String name)
{
super(name);
}
void method()
{
super.show();
}
}
38. 子类的实例化过程: super语句一定定义在子类构造方法中的第一行;如果子类构造方法第一行已经有了this();则就不能有super(); (因为this语句和super语句只能在第一行,初始化语句要先执行)所以,子类的所有的构造函数,默认都会访问父类中空参数的构造方法,因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有空参数的构造方法时,子类必须手动通过super或者this语句形式来指定要访问父类中的构造方法;当然,子类的构造函数第一行也可以手动指定this语句来访问本类中的构造方法;子类中至少会有一个构造方法会访问父类中的构造函数;
39. final:(1)可以修饰类,函数,变量;(2)被final修饰的类不可以被继承;为了避免被继承,被子类复写功能;(3)被final修饰的方法不可以被复写;(4)被final修饰的变量是一个常量,只能被赋值一次,既可以修饰成员变量,又可以修饰局部变量;(5)内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量;
40. 抽象类特点:(1)抽象方法一定在抽象类中(2)抽象方法和抽象类都必须被abstract关键字所修饰;(3)抽象类不可以用new创建对象,因为调用抽象方法没意义;(4)抽象类中的抽象方法要被使用,必须由子类复写其所有的方法后,建立子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类;
41. 抽象类中可以不定义抽象方法,这样做只是为了不让该类建立对象;
42. 模板方法设计模式:在定义功能时,功能的一部分是确定的,但有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成;
43. 接口定义时,格式特点:(1)接口中常见定义:常量,抽象方法;(2)接口中的成员都有固定修饰符,常量:public static final 方法:publicabstract 这些固定修饰符可以省略;
注意:接口中的成员都是public的;
44. 接口不可以被创建对象,因为有抽象方法,需要被子类实现;子类对接口中的抽象方法全部覆盖后,子类才可以实例化;否则子类是一个抽象类;
45. 类之间只支持单继承,类可以继承一个类的同时实现多个接口,而接口之间可以实现多继承,例如:
interface A
{
void methodA();
}
interface B
{
void methodB();
}
interface C extends B,A
{
void methodC();
}