java匿名内部类构造函数_Java面向对象,内部类,匿名内部类,抽象类,构造函数Demo...

本文详细介绍了Java中的匿名内部类、内部类、抽象类和构造函数的使用。包括面向对象的概念,创建对象时内存的操作,匿名对象的场景,匿名类的应用,以及内部类直接访问外部类成员的特点。此外,还探讨了抽象类与接口的区别,以及构造函数的用法。
摘要由CSDN通过智能技术生成

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值