一种类与类之间的关系

使用已存在的类的定义作为基础建立新类

新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类

子类只能继承一个父类

package com.imooc.animal;

public class Animal {

private String name;//昵称

private int month;//月份

private String species;//品种

public Animal() {

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getMonth() {

return month;

}

public void setMonth(int month) {

this.month = month;

}

public String getSpecies() {

return species;

}

public void setSpecies(String species) {

this.species = species;

}

//吃东西

public void eat() {

System.out.print(this.getName()+"吃东西");

}

}

package com.imooc.animal;

public class Cat extends Animal{

private double weight;//体重

public Cat() {

}

public double getWeight() {

return weight;

}

public void setWeight(double weight) {

this.weight = weight;

}

//跑动的方法

public void run() {

//子类可以访问父类非私有成员

System.out.print(this.getName()+"是一只"+this.getSpecies()+",它在快乐地奔跑");

}

}

package com.imooc.animal;

public class Dog extends Animal {

private String sex; //性别

public Dog() {

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

//睡觉的方法

public void sleep() {

System.out.println(this.getName()+"现在"+this.getMonth()+"月大"+",正在睡觉");

}

/*

* 方法重载:

* 1.同一个类中

* 2.方法名相同,参数列表不同(参数顺序、个数、类型)

* 3.方法返回值、访问修饰符任意

* 4.与方法的参数名无关

private String sleep(String name) {

return "";

}

public void sleep(String name,int month) {

}

public void sleep(int month,String name) {

}

* */

}

import com.imooc.animal.Animal;

import com.imooc.animal.Cat;

import com.imooc.animal.Dog;

public class Test {

public static void main(String[] args) {

Cat one=new Cat();

one.setName("花花");

one.setSpecies("中华田园猫");

one.eat();

one.run();

Dog two=new Dog();

two.setName("妞妞");

two.setMonth(1);

two.eat();

two.sleep();

//父类不可以访问子类特有成员,即便它是公有的

Animal three=new Animal();

//three.run();//报错

}

}

方法重写

语法规则:

在子类中定义

方法名和参数类型、顺序、个数(不包括参数名)都要与父类继承的方法相同

public void eat(String name) {

System.out.println(name+"在吃东西");

}

public void jump() {

System.out.println("跳跃是一种本能");

}

/*

* 方法重写:

* 1.有继承关系的子类中

* 2.方法名相同,参数列表相同(参数顺序、个数、类型)

* 3.与方法的参数名无关

* 4.方法的返回值和访问修饰符是可以允许有变化的

*/

//当子类重写父类方法后,子类对象调用的是重写后的方法

public void eat() {

System.out.println(this.getName()+"最近没有食欲");

}

public void eat(String month) {

System.out.println(month+"最近没有食欲");

}

/*报错:与父类中的jump方法不兼容

* 返回值为void或者基本数据类型,要求父子完全一致

* 返回值为引用类型时,可以是父类或其子类

public int jump() {

System.out.println("狗狗是助跑式跳跃");

return 1;

}

*/

在子类中可以定义与父类当中重名的属性,优先执行子类当中的赋值

访问修饰符

公有的:public:允许在任意位置访问

私有的:private:只允许在本类中进行访问

受保护的:protected:允许在当前类、同包子类/非子类、跨包子类调用;跨包非子类不允许

默认:允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用

访问修饰符对方法重写的影响

访问修饰符的访问范围需要大于等于父类的访问范围

super关键字的使用

super:父类对象的引用

super.eat();

super.x=4;

tip:父类的构造方法不允许被继承、不允许被重写,但是会影响子类对象的实例化

子类的构造的过程中必须调用其父类的构造方法

如果子类的构造方法中没有显式标注,则系统默认调用父类无参构造方法

如果子类构造方法中既没有显式标注,且父类中没有无参的构造方法,则编译一定出错

Implicit super constructor Parent1() is undefined. Must explicitly invoke another constructor

隐式的父类无参构造方法未找到,必须显式地调用另外的构造方法

使用super()可以指定父类构造方法,super()必须放在子类构造方法有效代码第一行

super();

super(String name,int month);

this和super都不能在静态方法中调用,两者在调用构造方法时不能共存

继承后的初始化顺序

类的加载:父类静态成员--子类静态成员--子类对象实例化(父类对象构造,包括属性、构造代码块、构造方法--子类对象构造)

访问修饰符不影响静态成员加载顺序,跟书写位置有关

Object类

Object类是所有类的父类

一个类没有使用extends关键字明确标识继承关系,则默认继承Object类(包括数组)

Java中的每个类都可以使用Object中定义的方法

子类中方法可以不经过重写,直接重载父类的方法

例如equals()方法(等效于==),当继承Object中的equals方法时,比较的是两个引用是否指向同一个对象,即是否指向同一片内存空间,子类可以通过重写equals方法的形式,改变比较的内容

Animal one=new Animal("花花",2);

Animal two=new Animal("花花",2);

boolean flag=one.equals(two);

System.out.println("one 和 two的引用比较"+flag);

System.out.println("one 和 two的引用比较"+(one==two));

String str1=new String("hello");

String str2=new String("hello");

flag=str1.equals(str2);

System.out.println("str1 和 str2的引用比较"+flag);

System.out.println("str1 和 str2的引用比较"+(str1==str2));

public boolean equals(Object obj) {

if(obj==null) {

return false;

}

//强制转换为Animal类型

Animal temp=(Animal)obj;

//字符串用equals()比较,int型数据用==比较

if(this.getName().equals(temp.getName())&&(this.getMonth()==temp.getMonth())) {

return true;

}else {

return false;

}

}

//方法重载

public boolean equals(Animal obj) {

if(obj==null) {

return false;

}

if(this.getName().equals(obj.getName())&&(this.getMonth()==obj.getMonth())) {

return true;

}else {

return false;

}

}

if语句中,可以两个都用equals或者两个都用==进行比较吗?

由于通过Animal类型参数重载了equals(),所以代码运行时自动定位类型匹配方法

//重写toString()方法

public String toString() {

return "昵称:"+this.getName()+";年龄:"+this.getMonth();

}

/*toString测试:

* 1.输出对象名时,默认会直接调用类中的toString方法

* 2.继承Object中的toString方法时,输出对象的字符串表示形式:类型信息+@+地址信息

* 3.子类可以通过重写toString方法的形式,改变输出的内容以及表现形式

*/

System.out.println(one.toString());

System.out.println(one);

System.out.println(str1);

==比较的是变量里存储的值,对于基本数据类型,变量里存储的是数值,==比较的是数值是否相等;对于引用数据类型(例如String、自定义类等),变量里存的是对象的内存地址,==默认比较的是是否指向同一内存空间,也就是地址是否相同。

final

final class:该类没有子类,不允许被继承 可写成public final class或final public class

不允许子类重写,在方法的返回值前加final,同时可以被子类正常继承使用,不能修饰构造方法

变量分为以下两类:

final 方法内局部变量:只要在具体被使用之前进行赋值即可,一旦赋值不允许被修改

final 类当中的成员属性:赋值过程:1.定义直接初始化 2.构造方法 3. 构造代码块

不赋值系统会报错

提示菜单快捷键:alt+/ 可以快速生成重写方法模板

final 引用数据类型 实例化后不允许再进行引用地址的修订,但属性值仍可更改

static+final 表示全局不允许修订的内容(方法和变量),如配置信息

注解

可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释

按照运行机制可以分为:源码注解(@Override)、编译时注解(@NotNull)、运行时注解(甚至会影响到运行逻辑@Autowired)

在当前阶段保留,在进行下一阶段时会被丢弃

按照来源分:来自JDK的注解(@Override)、来自第三方的注解(@Autowired)、我们自己定义的注解

元注解

定义注解的注解,对注解进行标注

父类的静态方法无法被重写

public static Animal create(){

return new Animal();

}

public static Dog create(){

return new Dog();

}

不会报错的原因是:系统认为create是Dog类专属的一个方法,与父类无关,更不是方法重写

java狐狸游戏_Java继承相关推荐

  1. 【源码+教程】Java桌球游戏_Java初级项目_Java练手项目_Java项目实战_Java游戏开发

    今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~课程详细讲解了一个桌球游戏的编写思路和流程,即使你刚学Java没多久,也可以跟随该教程视频完成属于你自己的桌球游戏!同时,还可以加深和 ...

  2. java swing游戏_Java Swing井字游戏

    java swing游戏 大家好! 哇,自从我在这里发布了东西以来已经有一段时间了! 我必须说我真的很想写东西,我保证我不会再陷入"作家的障碍". 希望 ..最近两个月发生了很多事 ...

  3. 各种经典java小游戏_Java是这个世界上最好的语言!

    为什么? 请看TIOBE最新发布的编程语言排行榜: TIOBE开发语言排行榜每月更新一次,其结果可以用来检阅开发者的编程技能能否跟上趋势,或是否有必要作出战略改变,以及什么编程语言是应该及时掌握的. ...

  4. java 拼图游戏_Java 拼图游戏

    Java 拼图游戏 2014-07-01·WeaponX 11359 次浏览 ## 效果图 ![pintu.png](https://image.xsoftlab.net/baike/articleI ...

  5. java打字游戏_Java打字游戏

    贴吧上看到有人做Java打字游戏,但是问题多多,我把他的程序拿来大改一番,算是半个原创吧.键盘按出对应字母,则该字母消失并随机产生新字母. 如果加些贴图润色一下可以更美观,学习计划紧,暂时不美化了. ...

  6. java打架游戏_java模拟游戏打斗场景摘要.doc

    java模拟游戏打斗场景摘要.doc //游戏人物属性模型 package dahuaxiyou; public class Immortal { public String name; public ...

  7. java编写游戏_java编写小游戏-大球吃小球

    游戏界面: 点击火箭开始游戏 点击Exit退出游戏 左上角显示当前成绩和历史最高分 退出自动保存最高成绩 代码获取 扫码关注微信公众号[程序猿声] 在后台回复[EBG]不包括[]即可获取. 玩法: 玩 ...

  8. 用java雷电游戏_Java实现仿雷电游戏

    [实例简介]Java实现仿雷电游戏 [实例截图] [核心代码] package cqu; import java.awt.BorderLayout; import javax.swing.JFrame ...

  9. java炸弹游戏_java实现数字炸弹

    数字炸弹游戏规则 数字炸弹游戏规则:在一个数字范围内,有一个数字作为炸弹,谁猜中这个炸弹就被惩罚.比如范围是1 ~ 99,炸弹是60,然后猜了一个数字是30,30不是炸弹,那么现在猜数字的范围就缩小到 ...

最新文章

  1. linux ip -o,linux IP 命令使用举例
  2. 利用ISCSI存储技术构建IP存储网络(安全篇)
  3. Nuget添加新项目的问题
  4. 【Unity】第8章 GUI开发
  5. Python3实现32位整数翻转
  6. 无法确定域的标识_标识标牌设计的基本要求:虽然是基本要求,你未必也都知道哦...
  7. 电脑提示找不到宽带连接怎么办
  8. VC++即时通讯+视频会议源码
  9. SQL开头quoted和ansiNULL
  10. Linux 下查看系统是32位还是64位的方法
  11. MyEclipse配置TomCat环境(图文详解)
  12. Linux之chrony时间同步服务、ntp协议
  13. javascript 正则
  14. 而立之年,学习编程,
  15. 变量名和变量地址之间的关系
  16. 亚马逊、虾皮、来赞达、速卖通、ebay等跨境电商平台如何搭建一个稳定的自养号补单系统?
  17. 三维层次聚类分析matlab,聚类分析(三) 层次聚类及matlab程序
  18. Mysql 分库分表 Mycat
  19. 前端ffmpeg实现视频剪切
  20. 图像区分平坦区域、边缘、角点区域

热门文章

  1. 【Ansys Fluent】All cell zones in Fluent may be automatically set to Fluid.
  2. 简易Lasso回归 R语言 变量含有分类变量处理
  3. 浙江人在非洲是怎么学法语的
  4. 即将踏入工作,你对公司的若干职简称了解么?(CEO、CFO、CTO、CDO、CAO ...)
  5. 深受java开发者喜爱的顶级Java IDE
  6. OpenMLDB新手入门开源介绍
  7. 椭圆切线方程公式的推导过程
  8. linux后台启动,不输出日志文件
  9. TOP3!复杂美授权专利与蚂蚁、腾讯同列全国前三
  10. 使用赛元单片机“sc92f742x”实现LED灯的呼吸效果