1,面向对象和面向过程
Java是完全的面向对象的语言。
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
过程其实就是函数;对象是将函数等一些内容进行了封装。
2,创建一个对象的时候内存都做了什么
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
3,什么是匿名对象,什么时候用匿名对象?
一个对象被new出来,只用一次,或者调用其方法,或者作为参数进行参数传递。如:
new Car().run();// 只对Car的run方法进行调用
new Car().num =5;
system.out.println( new Data() ) // new的data也相当于一个匿名对象
show( new Car() ) //作为参数进行传递
4,什么是匿名类(也叫匿名内部类),什么时候用匿名类?
匿名类(也叫匿名内部类)他是内部类的一种。匿名类在类中只能使用一次,它通常用来简化代码的编写,但使用匿名类还有一个前提条件:它必须继承一个父类或者一个接口,因此这个匿名类会被默认为这个父类或者接口的子类或实现类。
Demo:
1 packagecom.hpioneer.Demo;2
3 public classTest_Inter {4 public static voidmain(String[] args) {5
6 Outers o = newOuters();7 o.method();8 }9 }10
11 interfaceInter{12 voidshow();13 }14
15 classOuters {16
17 class Inner implementsInter{18 public voidshow(){19 System.out.println("1");20 }21 }22
23 public voidmethod(){24
25 new Inter() { //实现Inter接口
26 public void show() { //重写抽象方法
27 System.out.println("print");28 }29 }.show();30 }31
32
33 }
常见:
1 new SetOnClickListener(newOnClickListener() {2
3 //定义了一个实现事件监听的匿名类
4 @Override5 public void onClick(View v) { //实现OnClickListener中的方法
6
7 newThread() {8 //定义了一个实现Thread的匿名类
9 @Override10 public voidrun() { }11 }.start();12 }13 });
5,什么是内部类?
如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。
Demo:
packagecom.hpioneer.Demo;public classTest_Outer {public static voidmain(String[] args) {/*Outer.Inner oi = new Outer().new Inner();
oi.show();*/Outer o= newOuter();
o.print();
}
}classOuter{public int num = 10;classInner {public int num = 20;public voidshow() {int num = 30;
System.out.println(num);//30
System.out.println(this.num);//20
System.out.println(Outer.this.num);//10
}
}public voidprint(){
Inner i= newInner();
i.show();
}
}
5,抽象类
将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。
抽象类的特点:
1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:抽象方法只定义方法声明,并不定义方法实现。
3:抽象类不可以被创建对象(实例化)。
4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类
抽象类和接口的区别:
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类去实现。
3:抽象类使用的是 is a 关系。
接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。全都是public的。
6,构造函数
Demo:
1 packagecom.hpioneer.Demo;2
3 public classTest_Employee {4 public static voidmain(String[] args) {5 Employee e1 = newEmployee();6 e1.setName("e1");7 e1.setId(1);8 e1.setSalary(2589.0);9 System.out.println(e1.toString());10
11 Employee e2 = new Employee("e2",2,1256.1);12 System.out.println(e2.toString());13 }14
15 }16
17 classEmployee{18 String name;19 intid;20 doublesalary;21
22 public Employee() { //无参构造
23
24 }25
26 public Employee(String name, int id, double salary) { //有参构造
27 this.name =name;28 this.id =id;29 this.salary =salary;30 }31
32 publicString getName() {33 returnname;34 }35
36 public voidsetName(String name) {37 this.name =name;38 }39
40 public intgetId() {41 returnid;42 }43
44 public void setId(intid) {45 this.id =id;46 }47
48 public doublegetSalary() {49 returnsalary;50 }51
52 public void setSalary(doublesalary) {53 this.salary =salary;54 }55
56 @Override57 publicString toString() {58 return "name='" + name + '\'' +
59 ", id=" + id +
60 ", salary=" +salary ;61 }62 }