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 }

 

 

 

    

posted @ 2018-05-04 16:59  H+  阅读(668)  评论(0编辑  收藏  举报