/*
类的继承
类的继承可以简化类的定义
java只支持单继承,不允许多重继承
可以有多层继承,即一个类可以继承其一个类的子类,如类B继承了类A,类C又可以继承类B
那么类C也间接继承了类A 子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法,
在子类的构造方法中可使用语句super(参数列表)
调用父类的构造方法 如果子类的构造方法中没有显式地调用父类构造方法,也没用使用this关键字调用重载的其它构造方法,则在产生子类的实例对象时
系统默认调用父类无参数的构造方法 子类对象的实例化过程 1 分配成员变量的存储空间并进行默认的初始化,就是用new关键字产生对象后
对类中的成员变量按第三章的表3.1的对应关系对对象中的成员变量进行初始化赋值 2 绑定构造方法参数,就是new Person(实际参数列表)中所传递进的参数赋值给构造方中的形式参数变量 3 如果有this()调用,则调用相应的重载构造方法(被调用的重载构造方法又从步骤2开始执行这些流程)
被调用的重载构造方法的执行流程结束后,回到当前构造方法,当前构造方法直接跳转到步聚6执行 4 显示或隐式追溯调用父类的构造方法(一直到Ojbect类为止,Object是所有java类的最顶层父类)
在本音后面部分有详细讲解,父类的构造方法又从步骤2开始对父类执行这些流程,父类的构造方法的执行流程结束后,回到当前构造方法,当前构造方法继承往下执行 5 进行实例变量的显示初始化扣喺,也就是执行在定义成员变量时就对其进行赋值的语句 6 执行当前构造方法的方式体中的程序代码 1):为什么super()和this()调用语句不能同时在一个构造函数中出现?
因为当在一个构造函函数中出现this()调用以后,那么去别外一个构造函数将也会直接默认或指定的super()方法
如要执行完成以后,返回到初始的构造函数还让执行super()方法时,那就又是重复操作了,无意义
所以编译也不会通过的 2):为什么super()和this()调用语句只能作为构造函数的第一句出现
如果不是作为第一句出现,编译也会出错的
如果选执行一些赋值语句,然后执行this或super()函数
那么就跟我们的执行流程相矛盾了
因为构造函数需要需要执执行this,如果没有this执行super()方法
编译器也不会让通过的 覆盖父类的方法
覆盖方法必须和被覆盖方法具有相同的方法名称,参数列表和返回值类型 如果在子类中想调用父类中那个被覆盖的方法,我们可以用super方法的格式 覆盖方法时,不能使用此父类中被覆盖的方法更严格的访问权限 final关键字
1 在java中声明类,属性和方法时,可以使用关键字final来修饰
2 final标记的类不能被继承
3 final标记的方法不能被子类重写
4 final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次
5 方法中定义的内置类只能访问该方法内的final类型的局部变量
用final定义的局部变量相当于是一个常量,它的生命周期超出了方法运行的重命周期
将一个行参定义成final也是可以的,这就是限定了我们在方法中修改形式参数的值
6 public static final共同标记常量时,这个常量就成了全局常量 抽象类
java中可以定义一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现
这样的方法就是抽象方法,包含抽象方法的类叫做抽象类 1 抽象类必须使用abstract关键字来修饰,抽象方法也必须用abstract来修饰
2 抽象类不能被实例化,也就是不能用new关键字去产生对象
3 抽象类只需声明,而不需实现
4 含有抽象方法的类必须声明为抽象类,抽象类的子类必须覆盖所有抽象方法后才能被实例化,否则这个子类还是个抽象类 */ //final class Person 将不能被继承了
class Person
{
//protected final String name = "unknown"; 变量为final时将不能被子类赋值了
protected String name = "unknown"; //public final String x = "abc"; //第一种赋值是初始赋值 public final String x;
//public static final String x; public static final String y = "abc"; public int age = -1; public Person()
{
this.x = "cde";
} public Person(String name, int age)
{
this.name = name;
this.age = age;
//或者在构造函数中进行赋值
this.x = "abc"; } //public void getInfo(){} 将不能在子类重写了
public void getInfo()
{
//this.x = "abc"; //用final定义的变量将不能被修改了
System.out.println("name:"+name+", age:"+age);
}
}; class Student extends Person
{ public String school = "unknown"; public Student()
{
//super("xlc",15);
super();
} public Student(String name, int age, String school)
{ this(name,age); //调用自己的构造函数
this.school = school;
//this(name,age); //调用自己的构造函数
} public Student(String name, int age)
{
super(name, age);
} public void getInfo()
{
System.out.println("school:"+school+"name:"+name+", age:"+age);
super.getInfo();
} public void study()
{ }
}; class TestStudent
{
public static void main(String[] args)
{ //Student st = new Student();
//st.name = "xlc";
//st.age = 34;
//st.getInfo(); Student st = new Student("xlc",22,"清华大学");
st.getInfo(); System.out.println(Float.MAX_VALUE);
}
};

  

/*
接口(interface)
如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也就是接口定义
接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类
这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现 1 接口中的成员都是public访问类型的,接口的变量默认是用public static final标识的 2 我们可以定义一个新的接口用extends 关键字去继承一个已有的接口 3 我们也可以定义一个类用implements关键字去实现一个接口中的所有方法,我们还可以去定义一个抽旬类用implements关键字去实现一个接口中定义的部分方法 4 一个类可以继承一个父类的同时,实现一个或多个接口,extneds关键字必须位于implements关键字之前 对象的类型转换
1 子类对象可以自动转换成父类
2 父类转换为子类必须使用强制转换
3 instanceof操作符可以用它来判断一个实例对象是否属于一个类
4 Object类及equals方法 */
/*abstract class A
{
abstract int aa(int x, int y); //抽象类将不能实例化 }; class B extends A
{
int aa(int x, int y)
{ return 1;
}
};*/ interface Runner
{
int ID = 1; void run();
} interface Animal extends Runner
{
void breathe();
} class Fish implements Animal
{
public void run()
{
System.out.println("fish is swimming");
} //public void breathe()
public void breathe()
{
System.out.println("fish is bubbling");
} public static void main(String[] args)
{
Fish f = new Fish();
int j=0;
j = Runner.ID;
j = f.ID;
//f.ID = 2; //常量不能被赋值 }
}; abstract class LandAnimal implements Animal
{
public void breathe()
{ }
}; interface dog
{
void uaau();
} interface Flyer
{
void fly();
} class Bird implements Runner, Flyer
{
public void run()
{ } public void fly()
{ }
}; //继承一个类时,可以实现其它接口
//也是可以继承从外接口类的
class Student extends Person implements Runner, dog
//如果继承类和接口,extends必须在implements之前
{ public void run()
{ } public void uaau()
{ }
}; interface A
{
//public static final int ID=1;
//int ID = 1; //这个是一个常量而不是一个变量,接口只能定义常量,不能定义变量,
//只能定义常量和抽象类 public static final int ID=1; int aa(int x, int y); void bb();
} /*class
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}*/

  

/*
面向对象的多态性
1):应用程序不必为每一个派生类(子类)编写功能调用
只需要对抽象基类进行处理即可,这一招叫"以不变应万变",可以大大提高程序的可复用性 2):派生类的功能可以被基类的引用变量引用,这叫向后兼容,可提高程序的可扩充性和可维护性
以前写的程序可以被后来程序调用不足以为奇,现在写的程序(如callA方法)能调用以后写的程序(以后编写的一个类A的子类,如类D)就了不起了 */
class A
{
public void func1()
{
System.out.println("A func1 is calling");
} public void func2()
{
func1();
}
}; class B extends A
{
public void func1()
{
System.out.println("B func1 is calling");
} public void func3()
{
System.out.println("B func3 is calling");
}
}; class C
{
public static void main(String[] args)
{ B b = new B();
callA(b); //A aa = b;
//callA(new A());
} public static void callA(A a)
{
/*if(a instanceof B)
{
B b = (B)a; //强制类型转换
b.func1();
b.func2();
b.func3();
}else{
a.func1();
a.func2();
}*/ a.func1();
a.func2(); //a.func1();
//a.func2();
//a.func3();
}
}; class Student extends Object
{ private String name; private int age; public Student(String name, int age)
{
this.name = name;
this.age = age;
} /*public boolean equals(Object obj)
{
Student st = null;
if(obj instanceof Student)
{
st = (Student)obj;
if(st.name == name && st.age == age)
{
return true;
} else{
return false;
}
}else{
return false;
}
}*/
//如果没有覆盖父类的equals方法,那么将返回不等
//只是重载了一下函数 public static void main(String[] args)
{
Student st1 = new Student("张三",20);
Student st2 = new Student("张三",20);
if(st1.equals(st2))
{
System.out.println("相等");
}else{
System.out.println("不相等");
}
} }; /*class
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}*/

  

interface PCI
{
void start(); void stop(); } class NetWrokCard implements PCI
{
public void start()
{
System.out.println("Send...");
} public void stop()
{
System.out.println("stop...");
}
}; class SoundCard implements PCI
{
public void start()
{
System.out.println("du...");
} public void stop()
{
System.out.println("sound stop...");
}
}; class MainBoard
{
public void usePCICard(PCI p)
{
p.start();
p.stop();
}
}; class Assembler
{ public static void main(String[] args)
{
MainBoard mb = new MainBoard(); NetWrokCard nc = new NetWrokCard(); SoundCard sc = new SoundCard(); mb.usePCICard(nc);
mb.usePCICard(sc); //匿名类
/*mb.usePCICard(
new PCI()
{
public void start()
{
System.out.println("test start...");
} public void stop()
{
System.out.println("test end...");
}
}
);*/ //类拟于
class A implements PCI
{
public void start()
{
System.out.println("test start...");
} public void stop()
{
System.out.println("test end...");
} };
mb.usePCICard(new A()); }
};

  

java第四节 类的继承/抽象/接口/多态性的更多相关文章

  1. “全栈2019”Java第四十七章:继承与方法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  4. Java基础-四要素之一《继承》

    继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 继承是所有OOP语言不可缺少的部分,在java中使 ...

  5. JAVA(四)类集/枚举

    成鹏致远 | lcw.cnblog.com |2014-02-04 JAVA类集 1.认识类集 类集的作用 类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充 类集的 ...

  6. java第四节 异常/访问控制/jar包

    /* 异常 异常定义了程序中遇到的非致命的错误,而不是编译时的语法错误,如程序要打开一个不存在的文件 网络连接中断,操作数越界,装载一个不存在的类等 try, catch语句 throws关键字 自定 ...

  7. c# 第32节 类的继承

    本节内容: 1:为什么要继承 2:继承特点 3:继承的实现 4:子类传统构造,与base构造 1:为什么要继承 2:继承特点 什么是继承: 继承就是子类包含父类的数据结构和行为方式, 包括字段.属性. ...

  8. 黑马程序员——JAVA基础之简述 类的继承、覆写

    ------- android培训.java培训.期待与您交流! ---------- 继承的概述: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只 ...

  9. java 类的继承和接口的继承

    父类 public class person { String name; int age; void eat(){ System.out.println("吃饭"); } voi ...

随机推荐

  1. Spring Scheduler定时任务 + Quartz

    原文地址: https://blog.csdn.net/revitalizing/article/details/61420556 版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...

  2. SQLServer 日期函数大全 SQLServer 时间函数大全

    原文地址:https://www.cnblogs.com/zhangpengnike/p/6122588.html 一.统计语句 1.--统计当前[>当天00点以后的数据] SELECT * F ...

  3. java.io包的总体框架图(转)

    原文链接:java.io包的总体框架图, 便于记忆!

  4. AutoCppHeader AutoHeader 自动根据CPP 或C文件 来生成头文件。

    根据 cpp文件 生成相应的头文件 namespace 声明类定义声明 函数声明 extern 变量声明 选项--------------//[AutoHeader Public] //[AutoHe ...

  5. Swift:宏定义

    一.简述 swift中并没有加入宏系统,C语言使用#define定义的基本常量在导入Swift时被Swift编译自动转为Swfit语言的全局变量.但复杂的宏定义不能被Swift转换.Swift中类似宏 ...

  6. 一次问题追查----短字符串签名算法引发的bug

    近期开发代码, 出现了一些诡异现象.追查原因是公司使用的签名函数出现的问题. 问题: 代码使用的签名库函数, 对于<=4字节的字符串, 签名就是本身. #include<stdio.h&g ...

  7. windows取证

    工具网站 : http://www.ntsecurity.nu/toolbox/ 命令行历史 :命令行模式 CMD 中使 doskey /history 命令可以显示前面输入的命令情况(例如使用 cl ...

  8. 领扣-1/167 两数之和 Two Sum MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 微信小程序wxml文件中调用自定义函数

    想在微信小程序的wxml文件里自如的像vue那样调用自定义的方法,发现并不成功,得利用WXS脚本语言. WXS脚本语言是 WeiXin Script 脚本语言的简称,是JavaScript.JSON. ...

  10. win7下使用Taste实现协同过滤算法

    如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...