面向对象(二)

1、抽象类和接口的区别

声明方法的存在而不去实现它的类被叫做抽象类,它用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建抽象类的实例。然而可以创建一个变量,其类型是抽象类,并让他指向具体子类的一个实例。不能有抽构造函数或抽象静态方法。抽象类的子类为它们父类中的所有抽象方法提供实现,否则他们也是抽象类。取而代之,在子类中实现该方法,知道其行为的其他类可以在类中实现这些方法。
接口是抽象类的变体。在接口中,所有的方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。

2、Overload和Override的区别,Overloaded的方法是否可以改变返回值类型

方法的重写Overriding和重载Overloading时Java多态性的不同表现。重写Overriding时父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的方法名和参数,我们说该方法被重写。子类对象使用这个方法是,将调用子类中的定义,对他而言,父类中的定义如同被屏蔽 。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载。Overloaded的方法可以改变返回值的类型

3、final,finally,finalize的区别

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总执行
finalize是Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如文件关闭。

4、面向对象的特征

1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分的注意与当前目标有关的方面。抽象并不打算了解全部问题,而是选择其中一部分,暂时不用部分细节,抽象包括两个方面:一是过程抽象,二是数据抽象
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表示共性的方法,对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,子类可以从父类那里继承方法和实例变量,并且类可以修改和增加新的方法使之更合适特殊的需要
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治,封装的独享,这些对象通过一个受保护的接口访问其他对象。
4.多态:
多态是指允许不同类的对象对同一消息做出相应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名的问题

5、Comparable和Comparator接口的作用及区别

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以给两个对象排序。具体来说 ,它返回符数,0,正数来表明输入对象小于,等于,大于已经存在的对象。
Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

6、接口和抽象类的区别

1.接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包括抽象和非抽象方法。
2.类可以实现多个接口,但只能继承一个抽象类
3.类可以不实现抽象类和接口声明的所有方法,这种情况下类也必须声明成抽象的
4.抽象类可以在不提供接口方法实现的情况下实现接口
5.Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量
6.Java中接口中的成员函数默认时public的。抽象类的成员函数可以是private,protected或者时public的
7.接口是绝对抽象的,不可被实例化。抽象类也不可以被实例化,但是,如果抽象类包含main()方法是可以被调用的。

7、Java是否支持多继承

Java中类不支持多继承,只支持单继承,即一个子类只有一个父类。但是Java中的接口支持多继承,即一个子接口可以有多个父接口。(接口的作用是用来拓展对象的功能,一个子接口继承多个父接口,说名子接口拓展了多个功能,当类实现接口时,类就拓展了相应的功能)。

8、通过反射创建对象

1.通过类对象调用newinstance()方法,例如:String.class.newInstance()
2. 通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor) 对象并调用其 newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“hello”);

9、是否可以在static环境中访问非static变量

static变量在Java中式属于类的,它在所有的实例中值是一样。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

10、什么是泛型

泛型,即“参数化类型”。就是将类型由原来的具体类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

public class GenericTest{
	public static void main(String[] args){
	list<String> list = new ArrayList(String)();
	list.add("welcome");
	list.add("qaq");
	list.add("100");
	list.add(100);//1编译器提示报错
	for(int i = 0; i < list.size(); i++){
	String name = list.get(i);//2
	system.out.println("name :"+ name);

	}

	}

}

采用泛型写法后,在//1处想加入一个integer类型的对象时会出现编译错误,通过list<String>,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了

11、泛型限定符 extends和super

1.泛型中上界和下界的定义
上界<?extend Fruit>
下界<?super Apple>
2.上界和下界的特点
上界的list只能get,不能add(确切的说不能add出除null之外的对象,包括Object)
下界的list只能add,不能get
代码演示:

import java.util.Arraylist;
import java.util.List;

class Fruit{}
class Apple extends Fruit{}
class jonathan extends Apple{}
class Orange extends Fruit{}

public class CovariantArrays{
	public static void main(String[] args){
	//上界
	List<? extends Fruit> flistTop = new ArrayList<Apple>();
	flistTop.add(null);
	//add Fruit对象会报错
	//flistTop.add(new Fruit())
	Fruit fruit1 = flistTop.get(0);

	//下界
	List<? super Apple> flistBottem = new ArrayList<Apple>();
	flistBottem.add(new Apple());
	flistBottem.add(new jonathan());
	//get Apple对象会报错
	//Apple apple = flistBottem.get(0);


}

上界<? extends Fruit>, 表示所有继承Fruit的子类,但是具体是哪个子类无法确定,所以调用add的时候,要add什么类型,谁也不知道。但是get的时候,不管是什么子类,肯定有个父辈Fruit,所以可以用最大的父类Fruit接着,也就是把所有子类向上转型成Fruit

下界<? super Apple>表示Apple的所有父类,包括Fruit,当我add的时候 我不能add Apple的父类,因为不能确定List里面存放的到底是哪个父类。但是我可以add Apple及其子类。因为不管我是什么类型的子类,他都可以向上转型为Apple及其所有的父类。但是当我get的时候,Apple的父类太多,没法接
编译器可以支持向上转型,但不支持向下转型。具体来讲,我可以把Apple对象赋值给Fuirt的引用,但是如果把Fruit对象赋值给Apple的引用就必须用cast

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值