IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> java入门------继承 extends(尚马day07) -> 正文阅读

[开发工具]java入门------继承 extends(尚马day07)

3.修饰代码块

普通代码块 {}

static{
 ? ?//静态代码块
}

public class StaticDemo {
?
 ? ?//属于class.  jvm只要加载class文件 必然会优先执行或者初始化静态的成员。
 ? ?static {
 ? ? ? ?System.out.println("静态代码块。。。。。。。。。。。。。1");
 ?  }
 ? ?
 ? ?//演示代码块
 ? ?//对于普通代码块而言 new一次 就会被执行一次
 ?  {
 ? ? ? ?System.out.println("普通代码块............2_1");
 ?  }
?
 ?  {
 ? ? ? ?System.out.println("普通代码块............2_2");
 ?  }
 ? ?
 ? ?public StaticDemo() {
 ? ? ? ?System.out.println("无参构造................3");
 ?  }
}
?
?
静态代码块。。。。。。。。。。。。。1
普通代码块............2_1
普通代码块............2_2
无参构造................3

需求: 保证一个程序里面里面 保证一个类只有对象。

public class UserInfo {
?
?
 ? ?//声明一个静态用户对象
 ? ?public static UserInfo instance;//null
?
 ? ?static {
 ? ? ? ?//一般初始化静态的成员变量的数据
 ? ? ? ?//只执行1次
 ? ? ? ?instance = new UserInfo();
 ?  }
?
 ? ?private UserInfo() {
?
 ?  }
}

class UserInfoTest {
 ? ?public static void main(String[] args) {
?
 ? ? ? ?/*UserInfo user1 = new UserInfo();
 ? ? ? ?UserInfo user2 = new UserInfo();
?
 ? ? ? ?System.out.println(user1==user2);*///false*/
?
 ? ? ? ?//保证用户这个类  在这个程序里面有且只有这一个对象 (new 一次)
 ? ? ? ?//1. 不能随意访问构造方法
?
 ? ? ? ?UserInfo user1 = UserInfo.instance;
 ? ? ? ?UserInfo user2 = UserInfo.instance;
?
 ? ? ? ?System.out.println(user1 == user2);
 ?  }
}

3. 继承 extends

继承是设么? ?为什么要继承? ?好处?
子承父业
?
代码级别?
 ? 提高程序或者代码的复用性。 多次使用代码 ?
 ? 减少代码冗余。
 ? 
站在程序的设计角度:
 ? ? ?

3.1 需求: 马戏团很多小动物表演

Monkey
Lion
Tiger
.....

public class Lion {
?
 ? ?private String name;
 ? ?private int age;
 ? ?private String leader;
?
?
 ? ?public void show(){
 ? ? ? ?System.out.println(name+"正在钻火圈。。。。。。。。。");
 ?  }
?
 ? ?public String getName() {
 ? ? ? ?return name;
 ?  }
?
 ? ?public void setName(String name) {
 ? ? ? ?this.name = name;
 ?  }
?
 ? ?public int getAge() {
 ? ? ? ?return age;
 ?  }
?
 ? ?public void setAge(int age) {
 ? ? ? ?this.age = age;
 ?  }
?
 ? ?public String getLeader() {
 ? ? ? ?return leader;
 ?  }
?
 ? ?public void setLeader(String leader) {
 ? ? ? ?this.leader = leader;
 ?  }
}

public class Monkey {
?
 ? ?//属性
 ? ?private String name;
 ? ?private int age;
?
?
 ? ?//方法
 ? ?public void show() {
 ? ? ? ?System.out.println(name + "正在表演骑车......");
 ?  }
?
 ? ?public String getName() {
 ? ? ? ?return name;
 ?  }
?
 ? ?public void setName(String name) {
 ? ? ? ?this.name = name;
 ?  }
?
 ? ?public int getAge() {
 ? ? ? ?return age;
 ?  }
?
 ? ?public void setAge(int age) {
 ? ? ? ?this.age = age;
 ?  }
}

//测试小动物的表演: 成功地输出表演的内容
?
//吉吉国王正在表演骑车......
 //辛巴正在钻火圈。。。。。。。。。

问题: 每个类中 重复代码过多的。

使用继承解决。提高代码程序复用性。

3.2 继承语法

类与类之间的继承。 单根继承(一个类只能继承另外一个类)。 子与父

is a

生活中:
 ? 一个父亲有多个孩子。
 ? 一个孩子肯定是有一个1个父亲。
?
代码:
?
public class 父类 extends Object{
 ? ?//成员变量  成员方法
 ? ?
}
public class 子类1/派生类 extends 父类/基类{
 ? ?
}
public class 子类2/派生类 extends 父类/基类{
 ? ?
}
?
一个父类可以有多个子类。
每个子类肯定只有1个父类。
?
对于子类:
 ? 子类自动获得父类里面成员变量和成员方法。(排除private)
 ? ?子类也可以拥有自己独有的一些属性/方法。
 ? ?
 ? ?子类比父类更加具体。 子类>=父类----> 只要是父类出现的地方 子类都可以代替。 

所有的类默认继承 Object。 超级父类。

3.3 使用继承解决小动物问题

站在所有的子类的角度上 抽象出来一个父类。

@Setter
@Getter
public class Animal {
?
 ? ?private int age;
 ? ?private String name;
?
 ? ?public void show() {
 ? ? ? ?System.out.println(name + "正在表演......");
 ?  }
?
 ? ?public Animal(int age, String name) {
 ? ? ? ?this.age = age;
 ? ? ? ?this.name = name;
 ?  }
?
 ? ?public Animal() {
 ?  }
}

重复多次使用父类代码。子类继承父类即可。

@Setter
@Getter
public class Lion extends Animal{
 ? ?
 ? ?//独有属性
 ? ?private String leader;
 ? ?
}

public class Monkey extends Animal {
?
}

在继承关系下,肯定是创建子类对象。

测试小动物表演:

吉吉国王正在表演......
辛巴正在表演......
?
//发现输出的结果都是执行的父类功能。  与需求不符、 ? ?

3.4 方法重写

父类的功能无法满足子类的需求。 可以在子类里面重写父类的方法。

称为: 方法重写 或者 方法覆盖

方法重写的具体表现:

  • 子类重写的方法名/形参必须与父类的方法保持一致

  • 子类重写的返回值类型<=父类方法的返回值类型

  • 子类重写的修饰符>=父类的方法的访问权限修饰符

@Setter
@Getter
public class Lion extends Animal {
?
 ? ?//独有属性
 ? ?private String leader;
?
 ? ?//实现方法重写(覆盖)
 ? ?@Override// 标记注解  标记方法重写的父类的方法
 ? ?public void show() {
 ? ? ? ?System.out.println(this.getName()+"正在钻火圈...................");
 ?  }
}

public class Monkey extends Animal {
?
 ? ?@Override
 ? ?public void show() {
 ? ? ? ?System.out.println(this.getName()+"正在表演骑自行车..................");
 ?  }
}

3.5 初始化子类对象流程

@Setter
@Getter
public class Child extends ParentClass {

    private int  num1;
    private int num2;

    static {
        System.out.println("Child。。。。。。static");
    }
    public Child() {
        super();
        System.out.println("Child无参构造。。。。。。。。。。");
    }
}

@Setter
@Getter
class ParentClass {
    private int id;
    private String name;

    static {
        System.out.println("ParentClass。。。。。。static");
    }

    public ParentClass() {
        this.id = 0;
        this.name = null;
        System.out.println("ParentClass的无参构造......");
    }
}

class Test {
 ? ?public static void main(String[] args) {
 ? ? ? ?Child childObj1 = new Child();
 ? ? ? ?System.out.println();
 ? ? ? ?Child childObj2 = new Child();
 ? ? ? ?//会输出什么内容?  会支持子类无参以及父类无参
 ? ? ? ?//构造方法: 初始化成员变量数据
 ? ? ? ?//创建子类对象 优先执行父类的构造方法
 ? ? ? ?//原因: 在子类的构造里面 默认调用了父类的构造  super();
?
?
 ? ? ? ?//执行流程:
 ? ? ? ?//1. jvm加载各种class
 ? ? ? ?//2. 在子类的无参构造中  默认调用了父类的构造
 ? ? ? ?// 继承关系下: 子类对象----> 父类的是服务于子类。
?
 ? ? ? ?//假如父类与子类里面都有静态代码块?
 ? ? ? ?//1. jvm先加载class  优先执行静态代码块
 ? ? ? ?// 1.1 父类里面的静态
 ? ? ? ?// 1.2 子类里面静态
 ? ? ? ?// 1.3 执行父类构造
 ? ? ? ?// 1.4  子类构造
?
 ?  }
}

3.6 使用有参创建子类对象

@Setter
@Getter
public class Person {
?
 ? ?private int id;
 ? ?private String name;
 ? ?private int age;
?
 ? ?public Person(int id, String name, int age) {
 ? ? ? ?this.id = id;
 ? ? ? ?this.name = name;
 ? ? ? ?this.age = age;
 ?  }
?
 ? ?public Person() {
 ?  }
}
?
//父类里面没有无参构造的话  子类一般都会出现问题(找不到父类的无参构造)
//子类里面 默认存在无参构造的  默认调用父类的无参构造
class Man extends Person {
?
 ? ?public Man() {
 ?  }
?
 ? ?public Man(int id, String name, int age) {
 ? ? ? ?this.setId(id);
 ? ? ? ?this.setName(name);
 ? ? ? ?this.setAge(age);
 ?  }
}

class Test {
?
 ? ?public static void main(String[] args) {
 ? ? ? ?//创建子类对象
 ? ? ? ?Man zhangSanObj = new Man();
 ? ? ? ?zhangSanObj.setId(1);
 ? ? ? ?zhangSanObj.setName("张三");
 ? ? ? ?zhangSanObj.setAge(20);
 ? ? ? ?System.out.println(zhangSanObj.getId());
 ? ? ? ?System.out.println(zhangSanObj.getName());
 ? ? ? ?System.out.println(zhangSanObj.getAge());
?
 ? ? ? ?System.out.println("------------------------------------");
?
 ? ? ? ?//想使用子类有参构造初始化成员变量数据
 ? ? ? ?Man liSiObj = new Man(2, "lisi", 30);
 ? ? ? ?System.out.println(liSiObj.getId());
 ? ? ? ?System.out.println(liSiObj.getName());
 ? ? ? ?System.out.println(liSiObj.getAge());
?
 ?  }
}

3.7 super

this: 代表当前正在运行的对象。变量。

super: 父类引用。

1.1 在子类里面 ?访问父类的成员变量和方法
class Child extends Father {
?
 ? ?private int num1 = 2000;
?
 ? ?//不要重名就ok了
 ? ?public void a() {
 ? ? ? /* System.out.println(num);//2000
 ? ? ? ?System.out.println(this.num);//2000
 ? ? ? ?//super 可以访问父类的成员
 ? ? ? ?System.out.println(super.num);//1000*/
 ? ? ? ?this.b();
 ? ? ? ?super.b();
 ?  }
?
 ? ?//子类会重写
 ? ?@Override
 ? ?public void b() {
 ? ? ? ?System.out.println("子类重写过后逻辑............");
 ?  }
 ? ?
}

  1. 在子类构造中调用父类的构造 super()

//在子类构造中  默认调用的无参构造
class Man extends Person {
 ? public Man(int id, String name, int age) {
 ? ? ? ?super(id, name, age);
 ?  }
?
 ? ?public Man() {
 ? ? ? ?super();
 ?  }
}
//在继承关系下:  父类提供了有参和无参 ? 子类也会提供有参和无参 ? 子类有参调用父类有参  子类无参调用父类无参

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:22:51  更:2022-02-19 01:24:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 11:45:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码