Java面向对象,内部类,匿名内部类,抽象类,构造函数Demo
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 package com.hpioneer.Demo; 2 3 public class Test_Inter { 4 public static void main(String[] args) { 5 6 Outers o = new Outers(); 7 o.method(); 8 } 9 } 10 11 interface Inter{ 12 void show(); 13 } 14 15 class Outers { 16 17 class Inner implements Inter{ 18 public void show(){ 19 System.out.println("1"); 20 } 21 } 22 23 public void method(){ 24 25 new Inter() { //实现Inter接口 26 public void show() { //重写抽象方法 27 System.out.println("print"); 28 } 29 }.show(); 30 } 31 32 33 }
常见:
1 new SetOnClickListener(new OnClickListener() { 2 3 //定义了一个实现事件监听的匿名类 4 @Override 5 public void onClick(View v) { //实现OnClickListener中的方法 6 7 new Thread() { 8 //定义了一个实现Thread的匿名类 9 @Override 10 public void run() { } 11 }.start(); 12 } 13 });
5,什么是内部类?
如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。
Demo:
package com.hpioneer.Demo; public class Test_Outer { public static void main(String[] args) { /*Outer.Inner oi = new Outer().new Inner(); oi.show();*/ Outer o = new Outer(); o.print(); } } class Outer{ public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; System.out.println(num);//30 System.out.println(this.num);//20 System.out.println(Outer.this.num);//10 } } public void print(){ Inner i = new Inner(); i.show(); } }
5,抽象类
将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。
抽象类的特点:
1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:抽象方法只定义方法声明,并不定义方法实现。
3:抽象类不可以被创建对象(实例化)。
4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类
抽象类和接口的区别:
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类去实现。
3:抽象类使用的是 is a 关系。
接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。全都是public的。
6,构造函数
Demo:
1 package com.hpioneer.Demo; 2 3 public class Test_Employee { 4 public static void main(String[] args) { 5 Employee e1 = new Employee(); 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 class Employee{ 18 String name; 19 int id; 20 double salary; 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 public String getName() { 33 return name; 34 } 35 36 public void setName(String name) { 37 this.name = name; 38 } 39 40 public int getId() { 41 return id; 42 } 43 44 public void setId(int id) { 45 this.id = id; 46 } 47 48 public double getSalary() { 49 return salary; 50 } 51 52 public void setSalary(double salary) { 53 this.salary = salary; 54 } 55 56 @Override 57 public String toString() { 58 return "name='" + name + '\'' + 59 ", id=" + id + 60 ", salary=" + salary ; 61 } 62 }