Java基础(三)面向对象(下)
接口
接口中成员修饰符是固定的:
成员常量:public static final 成员函数:public abstract
通过接口间接实现了多重继承
接口的特点
接口是对外暴露的规则 接口是程序的工功能扩展 接口的出现降低耦合性 接口可以用来多实现 类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口 接口与接口之间可以有继承关系
接口与抽象类
抽象类体现继承关系,一个类只能单继承 接口体现实现关系,一个类可以多实现
抽象类中可以定义非抽象方法,供子类直接使用 接口的方法都是抽象,接口中的成员都有固定修饰符
一个简单的实现例子:
package study_java.ex7; public class InterfaceDemo1 {
public static void main(String[] args){
PC pc = new PC();
Mouse m = new Mouse();
Iphone ip = new Iphone();
pc.insertUSB(m);
pc.insertUSB(ip);
}
} // 定义接口
interface USB{
void connect();
} // 类实现了接口
class Mouse implements USB{
public void connect(){
System.out.println("我是鼠标");
}
} class Iphone implements USB{
public void connect(){
System.out.println("我是Iphone");
}
} class PC {
public void insertUSB(USB usb){
System.out.println("插入了usb设备");
usb.connect();
}
}
如果有多个接口,并且接口存在继承的时候,代码例子如下:
package study_java.ex7; public class InterfaceDemo2 {
public static void main(String[] args){
TuHao th = new TuHao();
WomanStar ws = new WomanStar();
th.marry(ws);
}
} interface White{
public void white();
} interface Rich{
public void rich();
} interface Beautiful{
public void beautiful();
} interface BFM extends White,Rich,Beautiful{ } class WomanStar implements BFM{
public void white(){
System.out.println("我很白");
}
public void rich(){
System.out.println("我很有钱");
}
public void beautiful(){
System.out.println("我很有漂亮");
}
} class TuHao{
public void marry(BFM bfm){
bfm.white();
bfm.rich();
bfm.beautiful();
}
}
多态
定义:某一类事物的多种存在形态
多态的特点:
成员函数 编译时:要查看引用变量所属类中是否有所调用的成员
在运行时:要查看对象所属类是否有所调用的成员 成员变量 只看引用变量所属的类
关于多态的一个代码例子:
package study_java.ex7; public class MutilstateDemo1 {
public static void main(String[] args){
Jing8 jing8 = new Jing8();
jing8.meng();
jing8.cry(); Dog dog = new Jing8();
dog.cry();
dog.watch(); Animal a = dog;
a.cry(); Pet pet = (Pet) a;
pet.meng(); }
} abstract class Animal{
public void cry(){
System.out.println("crying...");
}
} class Dog extends Animal{
public void watch(){
System.out.println("来人了");
}
} class Jing8 extends Dog implements Pet{
public void meng(){
System.out.println("么么哒");
}
} interface Pet{
void meng();
}
继承中方法可以被覆盖,但是成员变量不能被覆盖
代码例子:
package study_java.ex7; public class MultiStatDemo2 {
public static void main(String[] args){
Jing8 j = new Jing8();
j.cry(); Dog dog = j;
dog.cry();
System.out.println(j.name);
System.out.println(dog.name);
}
} abstract class Animal{
abstract public void cry();
} class Dog extends Animal{
public String name = "大黄";
public void cry(){
System.out.println("旺旺");
}
} class Jing8 extends Dog{
public String name = "小黄";
public void cry(){
System.out.println("嘿嘿");
}
}
异常
异常的体系: Throwable: Error:通常出现重大问题如:运行的类不存在或者内存溢出,不编写代码针对处理 Exception:运行时出现的一些情况,可以通过try catch finally
Exception 和Error的子类名都是以父类名作为后缀的
Trowable中的方法
getMessage():获取异常信息,返回字符串
toString():获取异常信息和异常类名,返回字符串
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void
printStackTrace(printStram s):通常用该方法将异常内容保存在日志文件中
throws和throw
throws用于标识函数暴露出的异常 throw用于抛出异常对象 throws和throw的区别: throws用在函数上,后面跟异常类名,声明抛出异常时使用的关键字 throw用在函数内,后面跟异常对象,抛出异常的语句
异常处理
try { 需要检测的代码 } catch { 异常处理代码 } finally { 一定会执行的代码 }
Finally代码只有一种情况不会被执行,就是在之前执行了System.exit(0)
package study_java.ex8; public class ThrowableDemo1 {
public static void main(String[] args){
float r = divide(4,0);
System.out.println(r);
int[] arr = null;
int[] arr2 = new int[4];
// System.out.println(getLength(arr2));
System.out.println(getLength(arr));
} public static float divide(int a, int b){
return (float) a / b;
} public static int getLength(int[] arr){
int len = -1;
try {
len = arr.length;
}
catch (Exception e){
System.out.println("出错了"+ e.getMessage());
// return -2; 这里一般也不会加return
}
finally {
len += 1;
System.out.println("程序执行完了");
// return len; 这里一般不会加return
}
return len;
}
}
自定义异常
自定义类继承Exception或者其子类
通过构造函数定义异常信息
通过throw将自定义异常抛出
一个简单的例子:
package study_java.ex7; public class ExceptionDemo1 {
public static void main(String[] args){
Person p = new Person();
try{
p.setAge(1000);
}
catch (Exception e){
((AgeTooBigException)e).printlnError();
} }
} class Person{
private int age;
public int getAge(){
return age;
} public void setAge(int age) throws AgeTooBigException {
if (age > 200) {
throw new AgeTooBigException();
}
this.age = age;
}
} class AgeTooBigException extends Exception{
private String info;
public AgeTooBigException(String info){
this.info=info;
}
public AgeTooBigException(){
this("年龄太大了");
}
public void printlnError(){
System.out.println(info);
}
}
一个稍微复杂的例子:
package study_java.ex7; public class ExceptionDemo1 {
public static void main(String[] args){
Person p = new Person();
try{
p.setAge(-10);
}
catch (AgeTooBigException e){
e.printlnError();
}
catch (AgeTooSmallException e){
e.printlnError();
}
catch (AgeInvalidException e){
e.printlnError();
} }
} class Person{
private int age;
public int getAge(){
return age;
} public void setAge(int age) throws AgeTooBigException,
AgeTooSmallException,
AgeInvalidException {
if (age > 200) {
throw new AgeTooBigException();
}
else if (age <10 && age > 0){
throw new AgeTooSmallException();
}
else if (age < 0){
throw new AgeInvalidException("年龄非法");
}
else{
this.age = age;
} }
} // 年龄非法异常
class AgeInvalidException extends Exception{
private String info;
public AgeInvalidException(String info){
this.info = info;
}
public void printlnError(){
System.out.println(info);
}
} // 年龄太大异常
class AgeTooBigException extends AgeInvalidException{
public AgeTooBigException(String info){
super(info);
}
public AgeTooBigException(){
this("年龄太大了");
}
} // 年龄太小异常
class AgeTooSmallException extends AgeInvalidException{
public AgeTooSmallException(String info){
super(info);
}
public AgeTooSmallException(){
this("年龄太小了");
}
}
如果我们不处理异常而是直接抛出可以直接在man函数里抛出异常,这样就将异常抛给了java虚拟机
package study_java.ex8; public class ExceptionDemo1 {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setAge(-10);
// 处理异常
/*
try{
p.setAge(2);
}
catch (AgeTooSmallException e){
e.printlnError();
}
catch (AgeTooBigException e){
e.printlnError();
}
catch (AgeInvalidException e){
e.printlnError();
}
*/
}
} class Person{
private int age;
public int getAge(){
return age;
} public void setAge(int age) throws AgeTooBigException,
AgeTooSmallException,
AgeInvalidException{
if (age> 200){
throw new AgeTooBigException();
}
else if (age < 10 && age > 0){
throw new AgeTooSmallException();
}
else if (age < 0){
throw new AgeInvalidException("年龄不合法");
}
else {
this.age = age;
} }
} class AgeInvalidException extends Exception{
private String info; public AgeInvalidException(String info){
this.info = info;
} public void printlnError(){
System.out.println(info);
}
} class AgeTooBigException extends AgeInvalidException{
public AgeTooBigException(String info){
super(info);
}
public AgeTooBigException(){
this("年龄太大了");
}
} class AgeTooSmallException extends AgeInvalidException{
public AgeTooSmallException(String info){
super(info);
}
public AgeTooSmallException(){
this("年龄太小了");
}
}
关于异常处理的细节:
RuntimeException 以及其子类如果在函数中被throw抛出,可以不用再函数上声明抛出语句,也不是必须用try catch语句处理 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或者异常的子类 如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常的一个子集,不能抛出新的异常
CheckedException 待检异常,也就是非运行时异常,必须使用try catch语句处理
包的概念
对类文件进行分类管理 给类提供多层命名空间 卸载程序文件的第一行 类名的全称的是包名.类名 包也是一种封装方式
如: javac -d classes PackageDemo1.java 编译java源文件,制定存放目录 java -cp classes com.zhaofan.java.PackageDemo1 运行程序,类全限定名
包之间的访问: 被访问的包中的类权限必须是public 类中的成员权限:public 或者protected protected是为其他包中的子类提供的一种权限
如果一个类是public 文件名必须是类名
这里顺便整理一下常见的几种权限在java中:
import导入
一个程序文件中只有一个package,可以有多个import 用来导包的类,不导入包中的包
小结:
private 私有的不能继承
public
protected 受保护的,针对其他包中的子类
default 默认,不写,不同包不能继承
Java基础(三)面向对象(下)的更多相关文章
- 【Java基础】面向对象下
面向对象下 这一章主要涉及其他关键字,包括 this.super.static.final.abstract.interface.package.import 等. static 在 Java 类中, ...
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- Java编程基础阶段笔记 day04 Java基础语法(下)
day04 Java基础语法 (下) 笔记Notes要点 switch-case语句注意 switch-case题目(switchTest5) 循环执行顺序 if-else 实现3个整数排序 Stri ...
- 28道java基础面试题-下
28道java基础面试题下 15.Java语言如何进行异常处理,关键字:throws.throw.try.catch.finally分别如何使用? 答:Java通过面向对象的方法进行异常处理,把各种不 ...
- Java基础知识【下】( 转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)
---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...
- Java基础篇(下)
6.Java面向对象的三个特征与含义 三大特征是:继承.封装和多态. (1)继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得 ...
- Java 基础三、接口与内部类
1. 在Java程序语言中,接口是对类的一种描述.例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口. public interface ...
- java基础(三)之面向对象编程
对象的创建方法 语法: class 类名{ 属性; 方法; } 生成对象的方法 类名 对象名 = new 类名(); Dog dog = new Dog(); 对象的使用方法1.对象.变量;2.对象. ...
- Java基础之面向对象以及其他概念
一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. JR ...
随机推荐
- 001.Redis简介及安装
一 Redis简介 1.1 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key-value 缓存产品有以下三个特点: ...
- Mac终端下的svn使用教程
1.将文件checkout到本地目录 1 svn checkout path(path是服务器上的目录) 2 例如:svn checkout svn://192.168.1.1/svn 3 简写:sv ...
- BZOJ.3811.玛里苟斯(线性基)
BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...
- [JOISC2014]友だちをつくろう
[JOISC2014]友だちをつくろう 题目大意: 一个\(n(n\le10^5)\)个点,\(m(m\le2\times10^5)\)条边的有向图.对于两个点\(i,j\),如果存在一个点\(k\) ...
- 解决IDEA Springboot项目sql文件打开提示No data sources are configured to run this SQL and provide advanced的问题
Idea2018的Springboot项目,如果里面有.sql文件,打开后,会提示"No data sources are configured to run this SQL and pr ...
- Debian stretch更换国内源
在debian图形化安装过程中就可以选择网络镜像的位置 据说电信用清华的源快,移动的用网易源快 备份源配置文件: cp /etc/apt/sources.list /etc/apt/sources.l ...
- BZOJ2167 : 公交车站
设$f[i]$表示$i$往上通过一趟公交车能到达的深度最小的祖先,这可以通过将公交车按$lca$深度从小到大排序后用并查集染色得到. 对于每个询问: $1.x==y$ $ans=0$. $2.x$是$ ...
- 打开沙盒文件iOS
有时使用数据库是需要查看或者更换沙盒里的数据库等文件 那么如何拿到真机的沙盒 查看真机沙盒教程 打开Devices 在xcode的上部导航栏里,选择window -> Devices and S ...
- Java 多线程 临界区
临界区表示一种公共资源或共享数据,可以被多个线程使用.但是每一次只能有一个线程使用它.一旦临界区资源被占用,想使用该资源的其他线程必须等待. 例如,办公室里的打印机一次只能执行一个任务.当小王和小明同 ...
- 使用Logstash filter grok过滤日志文件
Logstash提供了一系列filter过滤plugin来处理收集到的log event,根据log event的特征去切分所需要的字段,方便kibana做visualize和dashboard的da ...