Java与面向对象知识点


主要涉及的内容有类、对象、接口、多态、内部类、匿名类、封装类、方法重写、方法重载以及异常处理等方面。

什么是类、对象、属性和方法?

  • 类是对一类相同事物的抽象描述
  • 对象是类的一个具体实现,代表一个实实在在的个体。
  • 属性是对一类相同特征的抽象。
  • 方法是对一类相同行为的抽象。

什么是包?有什么好处?

包是java程序的单元,可以将相关的java程序放在同一个包下,便于程序的维护和管理。

什么是抽象类?有什么好处?

  • 有abstract关键字修饰,允许包含未实现方法的类成为抽象类。
  • 抽象类使用过程中,需要注意:
  •  *抽象类不能实例化,即不能创建对象,只能当做父类用于被继承。*		
     *子类继承一个抽象类后,必须要实现父类中所有的抽象方法,否则子类也要定义为抽象类。*
     *抽象类中可以有抽象方法,也可以不包含抽象方法。*
     *如果类中包含 抽象方法,那么类必须定义为抽象类*
    

什么是接口?有什么好处?

  • 接口是方法声明和常量值定义的集合。
  • 由于接口中的属性属于常量定义,因此在定义属性时必须显示指定初始值,不能使用默认初始化的形式。
  • 接口在使用过程中,需要注意:
  •  *接口只包含方法声明和常量定义,即使定义普通属性,该属性编译之后也会变成常量。
     当其他类实现该接口时,接口中定义的所有方法都要求全部实现,否则需要定义成抽象类。
     一个类可以实现多个接口,例如public class A implements B,C,D{}格式
     定义接口时可以使用继承,接口之间允许多继承。例如public interface A extends B,C{}格式*
    
  • 利用接口使得程序非常灵活,扩展性也变得非常好。

什么是内部类?有什么好处?

内部类的格式:

public class A{
	private int age;
	class B{
		// 定义属性和方法
	}
	public int getAge(){
		return age;
	}
}
类B就是一个内部类,B类与age和getAge方法是并列关系,编译之后会产生A.class和A$B.class两个字节码文件

内部类优点:

  • 内部类对象能访问其所处类的私有属性和方法。
  • 内部类能够隐藏起来,不被同一个包中的其他类访问,如果一个类中只对某个类提供使用,那么可以将其定义为内部类。
  • 匿名内部类可以声明为抽象类,因此可以被其他的内部类继承,也可以声明为final
  • 和外部类不同,内部类可以声明为private和protected,外部类只能用public和default
  • 内部类可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量
  • 非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可以声明static成员。

抽象类和接口?

abstract用于定义抽象类,抽象类不能实例化,抽象类中既可以包含已实现的方法,也可以包含方法定义,而不具体实现。
interface用于定义接口,接口中只包含常量定义和方法定义,接口本身也是一种特殊的抽象类。
抽象类和接口的区别主要有一下几个方面:

  • 定义格式不同
    抽象类用abstract;接口用interface
  • 使用方式不同
    抽象类通过继承方式使用,一个子类只能继承一个抽象类,在子类中需要将抽象类中的所有抽象方法实现。
    接口通过实现方式使用,一个类可以实现多个接口,在实现类中需要将接口中所有的方法实现。
  • 设计理念不同
    在一定程度上抽象类和接口很相似,一般情况下再实现某一功能时,两者可以相互替换,抽象类用于继承,表示“is a”的关系,而接口用于实现,表示“like a”的关系。

什么是方法重写?

  • 当一个子类继承一个父类时,他同时继承了父类的属性和方法。子类可以直接使用父类的属性和方法,如果父类的方法不能满足子类的需求,则可以在子类中对父类的方法进行重写或覆盖。
  • 在方法重写时,如果子类需要引用父类中原有的方法,可以使用super关键字,当子类重写父类方法后,在子类对象使用该方法时,会执行子类中重写的方法
  • 需要遵守的重写规则:
  • *重写方法名、参数和返回类型必须与父类方法定义一致
    重写方法的修饰符不能比父类方法严格,如果父类public,重写方法不能用protected和private
    重写方法中如果有throws定义,那么重写方法throws的异常类型可以是父类方法throws的异常类型及其子类类型

什么是方法重载?

  • 在同一个类中不允许有两个相同定义的方法,但是允许在用一个类中有多个方法名相同而参数列表不同的方法。
    - 注意:方法的返回类型不是区分方法相同的标识,因此在方法重载时,同一个类中不能有两个方法名相同,参数相同,返回类型不同的方法。

  • 遵守几个重载规则

  • 方法名相同
    参数类型必须不同
    返回值类型可以不同
    重载方法可以通过this关键字互相调用

如何重写hashCode()方法?

  • 设计原则实现:

  •  把某个非零常数值,例如17,保存在int变量result中
    
  •  对于对象中每一个关键域f(指equals方法中考虑的每一个域)参照以下原则处理:
     	boolean类型,计算(f?0:1)
     	byte、char和short类型,计算(int)
     	long类型,计算(int)(f^(f>>>32))
     	float类型,计算Float.floatToIntBits(afloat)
     	double类型,计算Double.doubleToLongBits(adouble)得到一个long,再执行long类型处理。
     	对象引用,递归调用它的hashCode()方法
     	数组域,对其中每个元素调用它的hashCode()方法
    
  •  将上面计算得到的散列码保存到int类型变量c.然后执行result=37*result+c
    
  •  返回result
    

java中的动态绑定是什么意思?

  • 将一个方法调用同一个方法主体连接到一起成为“绑定(Binding)”。如果在程序运行之前执行绑定,有编译器决定方法调用的程序,成为“早期绑定”或“静态绑定”。如果绑定过程在程序运行期间执行,以对象的类型为基础,则成为“后期绑定”或“动态绑定”。
  • 如果一种语言实现了后期绑定,同时必须提供一些机制,可以再运行期间判断对象的实际类型,并分别调用适当的方法,即编译器此时依然不知道对象的类型,但方法调用机制能够自己去调查,找到正确的方法主体。Java方法的执行主要采用动态绑定技术,在程序运行时,虚拟机将调用对象实际类型所限定的方法。
  • Java 方法再调用过程中,只要经历以下过程:
  •  编译器查看对象变量的声明类型和方法名,通过声明类型找到方法列表。
     编译器查看调用方法时提供的参数类型。
     如果方法由private、static和final修饰或者是构造器,编译器就可以确定调用哪一种方法,即采取静态绑定技术,如果不是上述情况,就使用动态绑定技术,执行后续过程。
     虚拟机提取对象的实际类型的方法表
     虚拟机搜索方法签名
     调用方法。
    

Java中是如何实现多态的?实现机制是什么?

  • Java是借助方法的重写和重载实现多态性的,重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。
  • Java通过将子类对象引用赋值给父类对象的引用变量来实现动态方法调用,这种实现方式遵从的原则有:
  •  如果a是类A的一个引用,那么a可以指向类A的实例,或者是类A的子类实例。
     如果a是接口A的一个引用,那么a必须指向实现了接口A的一个类的实例。
     当父类对象引用变量引用子类对象时,被引用对象的类型决定了调用的方法,而不是引用变量的类型决定,但是这个被调用的方法必须是在父类中定义过的,即被子类重写的方法。
    

注意:Java中除static和final修饰的方法外,其他所有的方法都是在运行时绑定(即动态绑定),是指JVM在运行时根据对象的实际类型进行方法的调用

创建类的对象时,类中的各成员的执行顺序是什么?

  • 父类静态成员和静态初始化块,按在代码中出现的顺序依次执行
  • 子类静态成员和静态初始化块,按在代码中出现的顺序依次执行
  • 父类实例成员和实例初始化块,按在代码中出现的顺序依次执行
  • 执行父类构造方法
  • 子类实例成员和实例初始化代码块,按在代码中出现的顺序依次执行
  • 执行子类构造方法

静态初始化块和非静态初始化块?

静态初始化块与非静态初始化块有一定的区别,静态初始化块比非静态初始化块执行要早,而且静态初始化块只执行一次,非静态初始化块可执行多次,静态初始化块的执行时机需要注意,他是在类加载器第一次加载该类时调用,不一定非要创建对象才触发,如果使用类名.静态方法(或静态属性)也会执行静态方法。

Java异常处理机制?

  • Java异常可以分为Error和Exception两大类型,Error类型的异常无法使用程序处理,一般所谓的异常处理是指Exception类型异常的处理。Exception类又可以分为运行时异常(Run你timeException)和非运行时异常(如IOException)其中类RuntimeException代表运行时由Java虚拟机生成的异常,例如算术运算异常ArithmeticException、数组越界异常ArrayIndexOutOfBoundsException等;非运行时异常,例如输入输出异常IOException等,Java编译器要求java程序必须捕获或声明所有的非运行时异常,但对运行时异常可以不做处理,因此,在编码时非运行时异常如果不处理,会报错。
  • 常见的RuntimeException异常:
  •  ArithmeticException:数学计算异常
     NullPointerException:空指针异常
     NegativeArraySizeException:父数组长度异常
     ArrayOutOfBoundsException:数组索引越界异常
     ClassNotFoundException:类文件未找到异常
     ClassCastException:类型强制转换异常
     SecurityException:违背安全原则异常
    
  • 其他非RuntimeException类型常见的异常:
  •  NoSuchMethodException:方法未找到异常
     IOException:输入输出异常
     EOFException:文件已结束异常
     FileNotFoundException:字符串转换为数字异常
     NumberFormatException:字符串转换为数字异常
     SQLException:操作数据库异常
    
  • Java中异常处理的方式:
  •  使用try-catch-finally
     使用throws
    
  • try-catch-finally和throws可以使用一下原则选择:
  •  如果方法前面代码发生异常后,后面代码需要继续执行,可以选try-catch
     如果方法中的代码发生异常后,有替代方案或需要特殊处理,可以选try-catch
     如果方法中的代码发生异常后,无法处理,后边代码无法正常工作,可以选throws
     根据具体情况而定,有些厂商规定异常再某一特定层使用try-catch处理,其它层都统一使用throws抛出
    
  • try-catch执行顺序:
  •  执行try语句正常,执行finally语句正常,退出语句执行后续程序
     执行try语句正常,执行finally语句异常,终止程序
     执行try语句正常,执行catch语句正常,执行finally语句,退出语句块执行后续程序
     执行try语句异常,执行catch语句异常,执行finally语句,终止程序
    

自定义异常?如何使用?

  • 为什么使用自定义异常
    Java提供的异常类在某些情况下还是不能满足实际需求,系统中有些错误是符合java语法的,但是不符合业务逻辑的;还有一种情况是在分层的软件结构中,通常是在表现层统一对系统其它层次的异常进行捕获处理,如果表现层需要针对系统各层不同的异常执行不同处理,就需要使用自定义异常。
  • 如何定义自定义异常
    自定义异常是通过程序代码显示抛出的,因此自定义异常需要具有可被抛出的特征,在自定义异常类时,通过继承Exception或者他的子类实现,也可以从Throwable继承。
  • 格式:
public class UserNotFoundExceptionextends Exception{
 		// 定义无参构造方法
 		public UserNotFoundException(){
			super();
		}
		// 定义带参数的构造方法
		public UserNotFoundException(String msg){
			super(msg)
		}
}

  • 如何使用自定义异常?
  • 违反业务逻辑
public void f1() throws UserNotFoundException{
	if(条件不满足){
		throw new UserNotFoundException("用户不存在");
	}
}
  • try-catch捕获异常
public void f1() throws UserNotFoundException{
	try{
		// 业务代码
	}catch(Exception e){
		throw new UserNotFoundException("用户不存在");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值