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 ...
随机推荐
- Linux常用命令大全(转)
(转)Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因, ...
- 在netcore中实现字段和属性注入
简单来说,使用Ioc模式需要两个步骤,第一是把服务注册到容器中,第二是从容器中获取服务,我们一个一个讨论并演化.这里不会考虑使用如Autofac等第三方的容器来代替默认容器,只是提供一些简单实用的小方 ...
- linux 学习笔记 mysql安装总结
1 安装方式 下载2禁制源码安装包 mysql-5.5.27-linux2.6-i686.tar.gz 备注:2禁制额包解压缩后直接就可以使用 不用Make 2 步骤 shell>groupad ...
- linux 学习笔记 文件权限管理篇
chown chown -R mysql. /usr/local 把/usr/local/以及其下的所有的文件和子目录属主改为mysql ls -al * <---用这条命令查询 chgrp c ...
- 安卓面试题 Android interview questions
安卓面试题 Android interview questions 作者:韩梦飞沙 2017年7月3日,14:52:44 1. 要做一个尽可能流畅的ListView,你平时在 ...
- Window通过zip安装并启动mariadb
下载解压后进入bin目录 使用mysql_install_db.exe工具:https://mariadb.com/kb/en/mariadb/mysql_install_dbexe/ 安装完成后,在 ...
- 2955 ACM 杭电 抢银行 01背包 乘法
题意: 强盗抢银行,在不被抓住的情况下,想尽量多的偷点钱.已知各个银行的金钱和被抓的概率,以及强盗能容忍的最大不被抓的概率(小于等于该概率才能不被抓),求最多能抢到钱? 并不是简单的01背包问题? 1 ...
- 2017.07.11【NOIP提高组】模拟赛B组
Summary 今天的比赛打得还不错,第一题被同桌灌输的贪心,纯模拟洗脑了,然后steal的看了一下,发现怎么也对不了,一直在检查.最后10分钟才找出反例,推出动态规划方程,没有想到怎么转移,比赛就结 ...
- 生命短暂,意识到开始使用python的重要性,python3.5.3安装和使用篇
原创文章,未经允许不得转载! 之前都是使用C++和R语言做事情.一直觉得c++挺好,好是好,就是有挺多车轱辘得自己造.细想下C++可以调用python,python也可以调用c++.那何不学学pyth ...
- python之socket编程2
1 套接字发展史及发展 套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix. 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字” ...