Java中的继承抽象类和接口
一、总结
1.使用extends关键字继承,eg: class Student extends Persion { ...};
2.Java编程规范中类的首字母大写,方法的首字母小写单词首字母代谢,eg: setYourName()
3.子类继承父类后可以重写(override)父类的成员方法。如果子类override了,子类中再调用就是调用自己的,若没有提供,调用的就是父类的。
4.对象实例化的时候,会先调用父类的构造函数,然后再调用子类的构造方法。若类没有定义构造方法,java编译器会帮你生成一个public的无参的什么都不做的构造方法。
若父类有多个构造函数,使用super()调用父类的无参构造函数,这个super()在子类的构造方法中是否显示的写出来无所谓。也可以在子类的构造函数中显式调用super()来调用父类的无参构造方法;
也可以用 super(参数描述) 来调用父类的有参数的构造函数。super()必须要在子类的构造函数的最开始处调用。
5.final关键字,final表示最终的
若使用final修饰一个类就表示它是一个最终的类,那么它就不能再有子类。 eg. final class A {...}
若使用final来修饰一个方法,就表示它是一个最终的方法,就不能再被复写。
若使用final修饰成员变量就表示它不能再被修改,就变成了常量。
6.继承的限制(父传子)
(1) 子类无法直接访问父类的privete属性.
(2) 子类无法访问父类的"绝招",比如父类将某个方法定位为privete的。
(3) 子类不能私吞祖传的东西,必须还要继续往下传。比如父类的public方法,子类将其重写成private的是不行的。也就是是子类可以复写,但是不能缩小其权限。
7.若父类中有一个private的函数,子类实现了一个同名的函数,这不是override,而是自己又重写写的一个函数。因为子类根本就看不见父类的这个方法。只不过刚好名字相同而已。
8.抽象类
作用:可以作为一个“模板”来规定子类必须实现的方法。抽象类不能实例化对象,用于继承。类前加abstract关键字修饰。
抽象方法:抽象方法需要加abstract修饰。若有子类继承这个抽象类的时候,子类中必须实现父类中的抽象方法。
抽象类中可以定义各种变量、常量、方法,从这里看抽象类强于接口。
abstract class 类名 {
属性
普通方法{}
//抽象方法,可以一个或多个
访问权限 abstract 返回值类型 方法名(参数); /*只需要声明,不需要实现*/
}
子类继承抽象类:
class Student extends Persion {}
9.接口
interface 接口名称 {
全局常量;
抽象方法;
}
eg:
interface A {
public static final i = 10; //定义成全局常量
public static int j = 15;
public abstract int getNumber();
}
子类实现接口:
class Student implement A,B{ //这里子类同时实现A B这两个接口(java中只有单继承,但是可以同时implements多个接口)。
}
class Student extends Persion implement A,B{ //实现A B这两个接口的同时继承(抽象)类。
}
有了抽象类还存在接口的原因:抽象类的使用中,一个子类只能继承一个抽象类,而接口可以突破这个限制。
接口也可以继承接口,eg: interface B extends A {}, 此时接口B中也会有接口A的方法。
10.抽象类和接口对比
抽象类和接口非常相似,里面都有abstract修饰的抽象方法。抽象类中可以定义变量,也可也定义常量,还可以定义普通的方法,对于接口里面只能定义常量和抽象方法。接口比抽象类优秀的一点是可以突破单继承的限制。接口和抽象类一般用作模板,其里面定义一些抽象方法,其子类必须实现这些抽象方法。
eg:
接口中写int i = 10; 编译器会把它变成 public static final int i = 10;
接口中直接写成int getNum();编译器会把它变成 public abstract int getNum();
也就是说这些关键字不写,还是常量,还是抽象方法。
11.只有abstract修饰的抽象类中才可以使用abstract修饰成员方法为抽象方法。
12.java中只有单继承,但是可以同时implements多个接口。
13.抽象类虽然不能直接实例化对象,但是同样可以有构造函数,且被继承时构造函数的调用次序和普通类相同。
14.抽象类的构造函数不能是抽象函数,也即不能加abstract修饰。
15,不可以同时实现接口和继承(抽象)类, class P implements A, extends Person {} 报错
16.abstract修饰的抽象类中若没有实现的函数,必须使用abstract修饰。而且必须写明权限(接口的默认是public abstract,所以可以可不写),
17.abstract类implements接口可以不实现接口中的方法,普通类必须实现
abstract class Stub implements ILedService{ }
二、试验demo
1.继承
class Person {
private int age; public void setAge(int age) {
if (age < 0 || age > 200)
age = 0;
else {
this.age = age;
}
} public int getAge() {
return age;
} public void printInfo() {
System.out.println("age = "+age);
} public Person () {System.out.println("Person ()");}
public Person (int age) {
System.out.println("Person (int age)");
this.age = age;
} } class Student extends Person{
private String school; public void setSchool(String school) {
this.school = school;
} public String getSchool() {
return school;
} public Student(String school) {
/* will call the super() */
//super();
super(5);
System.out.println("Student(String school)");
this.school = school;
} /* override */
public void printInfo() {
System.out.println("school = "+school+"; age = "+getAge());
} } public class Ext4 {
public static void main (String args[]) {
Student stu = new Student("ustc"); stu.setAge(10); System.out.println(stu.getAge());
System.out.println(stu.getSchool());
stu.printInfo();
}
}
2.抽象类
abstract class Father {
private int money; public int getMoney() {return money; }
public void setMoney(int money) {this.money = money; } public abstract void study();
} class Son extends Father{
public void study() {System.out.println("I am study"); } } public class Ext6 {
public static void main (String args[]) {
//Father f = new Father(); //Abstract classes are not allowed to be instantiated
Son son = new Son();
son.study(); }
}
3.接口
abstract class Father {
private int money; public int getMoney() {return money; }
public void setMoney(int money) {this.money = money; } public abstract void study();
} interface A {
public static final int i = 10;
public abstract int getNum();
} interface B {
public static String name = "InterfaceB";
public abstract String getName();
} class Son extends Father implements A,B{
public int getNum() {return i;}
public String getName() {return name;}
public void study() {System.out.println("I am study"); } } public class Ext7 {
public static void main (String args[]) {
Son son = new Son();
System.out.println(son.getName());
son.study();
}
}
补充:
抽象类和接口的区别:
参数 | 抽象类 | 接口 |
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现(若实现类是abstract的也不需要全部实现) |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
Java中的继承抽象类和接口的更多相关文章
- Java中多态、抽象类和接口
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
- java中的继承关系
1.定义 java中的继承是单一的,一个子类只能拥有一个父类:java中所有类的父类是java.lang.Object,除了这个类之外,每个类只能有一个父类: 而一个父类可以有多个子类,可以被多个子类 ...
- java中的继承 和多态。
package com.aaa.zxf.ajax.test; /** *一. java 中的继承和多态. * * 继承的特性? * 1.实现继承的方式 * A 如何建立继承关系(一个类继承于 另一个类 ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- java中的继承与oc中的继承的区别
为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- Java中的继承
我们在以前的学习中,我们会了C#中的继承,今天我们来了解了解Java中的继承,其实都大同小异啦! 1.语法 修饰符 SubClass extends SuperClass(){ //类定义部分 } e ...
- extends:类似于java中的继承特征,extends="struts-default"
extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...
- 在java中,List是个接口,那实现List接口的类有哪些,有什么区别?
在java中,List是个接口,那实现List接口的类有哪些,有什么区别? 解答: ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引 ...
随机推荐
- ubuntu查看占用某端口的程序
查看端口使用情况,使用netstat命令. 查看已经连接的服务端口(ESTABLISHED netstat -a 查看所有的服务端口(LISTEN,ESTABLISHED) netstat -ap 查 ...
- :命令模式:Command
#ifndef __COMMAND_H__ #define __COMMAND_H__ #include <vector> #include "Equipment.h" ...
- Linux7 下重新安装YUM
所有操作均在ROOT用户下,系统版本是Linux7.0 X86_64: 一.删除原有YUM # rpm -aq|grep yum|xargs rpm -e --nodeps 二.下载yum,注意自己的 ...
- Java垃圾回收理解
gc是垃圾回收,Java的垃圾回收分为年轻代回收和老年代回收,其中年轻代回收速度快,频率高,因为Java对象大多具有朝生夕灭的特性,Java对象都是new出来的,当new出很多对象的时候,年轻代很容易 ...
- 玩转 React 【第03期】:邂逅 React 组件
上期回顾 前文我们讲解了 React 模板 JSX,接着我们继续来看看 React 组件又是如何工作的呢? 组件化开发到了今天已经是大家的共识,在 React 中,组件同样也是组成我们整个项目的基本单 ...
- 字典和json 的区别 和转换
前言:字典和json非常像.接下来比较一下两者的异同 先看一下字典的写法: a = {', ', ' } 再看一下json的写法: { "studentInfo": { " ...
- 图片 100%显示. img 全部显示.
让每个图片 都铺满 ,同样的大小; 只要给 img 设置 固定的高度, 宽度就可以 了. ----------------------- html: <div class="co ...
- python监控服务器的主备模式
#-*- coding:utf8 -*-import paramikoimport re def check_active_ac(intervals=1): client = paramiko.Tra ...
- Python socket简单操作
#服务端:#导入socket模块 import socket #创建socket对象,创建了一个手机 server = socket.socket() #给程序设置一个ip地址和端口号,买了个手机卡 ...
- 路径问题 :<c:url >的作用
最近的项目一直报这样的错 可是本地启动 又没问题,xshell查看日志 没有错误日志,找了好久都没想到错误原因.一位大佬几分钟就找到原因了有点扎心. 首先说一下解决问题的思路.首先报错是4开头,说明是 ...