首页 > 编程语言 >【Java初阶】面向对象三大特性之继承

【Java初阶】面向对象三大特性之继承

时间:2022-12-16 10:07:33浏览次数:58  
标签:初阶 Java String 构造方法 子类 animal 父类 public 三大

一、继承

理解继承

Cat继承了Animal类,其中:Animal类称为父类/基类或超类,Cat可以称为Animal的 子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可

Java中不支持多继承,仅支持A extends B 单继承//A extends B B extends C 多层继承 //A extends C B extends C 不同类继承自同一类。

public class TestExtend {
public static void main(String[] args) {
Dog d1 =new Dog();
d1.name = "xiaocs";
d1.age = 15;
Cat c1 = new Cat();
c1.color = "red";
c1.type = "波斯";
c1.friendly();
}
}
/**
* Dog未继承animal则无法调用animal中的成员变量和成员方法
*/
class Dog{
public int age;

public String name;

public void shot(){
System.out.println("汪汪汪");
}
}
//cat可以直接调用animal中的成员变量和成员方法
class Cat extends animal{
public int weight;

public String sex;

public void eat(){
System.out.println("嘎嘎吃");
}

}
class animal{
public String color;

public String type;

public void friendly(){
System.out.println("对人类友好");
}

}

子类访问父类

子类和父类不存在同名成员变量

public class Base {
int a;
int b;
}
public class Derived extends Base{
int c;
public void method(){
a = 10; // 访问从父类中继承下来的a
b = 20; // 访问从父类中继承下来的b
c = 30; // 访问子类自己的c
}

子类和父类成员变量同名

public class Base {
int a;
int b;
int c;
}

public class Derived extends Base{
int a; // 与父类中成员a同名,且类型相同
char b; // 与父类中成员b同名,但类型不同
public void method(){
a = 100;
b = 101;
c = 102; // 子类没有c,访问的肯定是从父类继承下来的c
// d = 103; // 编译失败,因为父类和子类都没有定义成员变量b
}
}

成员变量访问遵循就近原则,自己有优先自己的,与父类同名也优先访问自己的,如果没有则向父类中找。

成员方法亦然,如果子类有则先访问子类的,子类没有先访问父类的,如果存在方法重载,则根据引用的情况,选择合适的方法

在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可

二、super关键字

当父类和子类的成员变量或成员方法相同时,调用父类的成员变量或方法,使用super关键字

class Cat extends animal{
public int color;

public String type;

public void eat(){

//调用父类的成员变量
super.color = "red";
super.type = "波斯";
super.friendly();
System.out.println("嘎嘎吃");
}

}
class animal{
public String color;
public String type;

public void friendly(){
System.out.println("对人类友好");
}
}

子类的构造方法(无参数)

若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法

public class TestExtend {
public static void main(String[] args) {
Cat c = new Cat();
}
}
class Cat extends animal{
public int size;
public String name;

public Cat(){
// super();
//注意子类构造方法中默认会调用基类的无参构造方法:super(),
// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
// 并且只能出现一次
System.out.println("Cat::");
}
public void eat(){
System.out.println("嘎嘎吃");
}

}
class animal{
public String color;
public String type;

public animal() {
System.out.println("animal::");
}
public void friendly(){
System.out.println("对人类友好");
}
}

【Java初阶】面向对象三大特性之继承_子类

子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。

子类的构造方法(有参数)

如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则会编译失败

public class TestExtend {
public static void main(String[] args) {
Cat c = new Cat("red","波斯",45,"xiaos");
}
}
class Cat extends animal{
public int size;
public String name;

public Cat(String color, String type, int size, String name) {
super(color, type);
this.size = size;
this.name = name;
}
public void eat(){
System.out.println("嘎嘎吃");
}
}
class animal{
public String color;
public String type;

public animal(String color, String type) {
this.color = color;
this.type = type;
}
public void friendly(){
System.out.println("对人类友好");
}

}

在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。

super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

✅super和this之间的区别?

相同点:

1.都属于java 中的关键字

2.只能在类的非静态方法中使用,用来访问 非静态的方法和字段

3.在构造 方法中使用时必须是构造方法当中的第一条语句,并且二者不能同时存在

不同点:

1.this指的是当前对象的引用,super指的是当前对象对父类部分对象的使用

在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性

在构造方法当中,this用于调用本类的构造方法,super调用父类的构造方法,两种调用不能同时在构造方法中出现

构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

三、继承关系下的代码块

public class TestExtend {
public static void main(String[] args) {
Cat c = new Cat("red","波斯",45,"xiaos");
}
}
class Cat extends animal{
public int size;
public String name;
//5.子类的实例代码块
{
System.out.println("cat::实例");
}
//2.子类的静态代码块
static{
System.out.println("cat::static");

}
//6.子类的构造方法
public Cat(String color, String type, int size, String name) {
super(color, type);
this.size = size;
this.name = name;
System.out.println("cat::构造");
}
public void eat(){
System.out.println("嘎嘎吃");
}
}
class animal{
public String color;
public String type;

//3.父类的实例代码块
{
System.out.println("animal::实例");
}
//1。父类的静态代码块
static{
System.out.println("animal::static");

}
//4.父类的构造方法
public animal(String color, String type) {
this.color = color;
this.type = type;
System.out.println("animal::构造");
}
public void friendly(){
System.out.println("对人类友好");
}

【Java初阶】面向对象三大特性之继承_构造方法_02

根据执行结果可以的出以下结论:

父类的静态代码块>>子类的静态代码块>>父类的实例代码块>父类的构造方法>>子类的实例代码块>> 子类的构造方法

第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

四、protected关键字

访问限定:同一个包中的类和不同包中的子类

package TestDemo2;

public class B {
private int a;
protected int b;
public int c;
int d;
}

在不同包中即package TestDemo 中

【Java初阶】面向对象三大特性之继承_父类_03

只有public和protected修饰的成员可以访问

五、final关键字

修饰变量时: 表示常量即不能修改

final int a = 10; 
a = 20; // 编译出错

修饰类时: 表示此类不能被继承,即不能作为父类

//final修饰
final class animal{
public String color;
public String type;
public animal(String color, String type) {
this.color = color;
this.type = type;
System.out.println("animal::构造");
}
}

标签:初阶,Java,String,构造方法,子类,animal,父类,public,三大
From: https://blog.51cto.com/u_15733182/5946742

相关文章

  • Flink 运行错误 java.lang.OutOfMemoryError: Direct buffer memory
    如遇到如下错误,表示需要调大配置项taskmanager.memory.framework.off-heap.size的值,taskmanager.memory.framework.off-heap.size的默认值为128MB,错误显示不够用需要调......
  • C# 与 Java 的区别
    C#与Java的区别C#最吸引人的地方是它与Java的区别而不是它们之间的相似性。下表是对C#和Java之间区别的简单介绍:序号JavaC#1Java是Oracle开发的......
  • Java8之list.stream的常见使用
    本文转自 https://blog.csdn.net/jhgnqq/article/details/123679622感谢楼主分享importorg.junit.Before;importorg.junit.Test;importjava.util.Arrays;import......
  • JAVA 百度坐标,火星坐标和WGS84之间互转
    百度坐标,但是在国内出于安全等相关因素考虑,在地图发布和出版的时,对WGS84坐标进行了一次非线性加偏,得到的坐标我们称之为GCJ02坐标系,俗称火星坐标,另外国内一些地图厂商出于......
  • JavaScript DOM的性能优化详解
    本身JS操作DOM就比较消耗性能,你可以理解为JS和dom是独立的小岛,用桥实现两者的联系,但桥很窄,要过路费,所以我们要尽最大可能减少过桥的次数。 再加上每次操作DOM都会触发......
  • JAVA Unsafe类详解
    JAVAUnsafe类详解官方不建议使用Unsafe使用Unsafe要注意以下几个问题:1、Unsafe有可能在未来的Jdk版本移除或者不允许Java应用代码使用,这一点可能导致使用了Unsafe的应......
  • 在javaweb中使用Druid连接池
    今天在javaweb中尝试用druid来链接数据库,遇到了无法加载druid.properties的问题这是我在DruidUtil的原代码:Propertiesproperties=newProperties();properties.load......
  • java和vue开发的二手车小程序系统租车小程序系统
    1.需求小程序端用微信开发者工具开发(原生小程序语言,不用云开发)。客户在小程序端登陆后可以卖自己的车,也可以卖别人的车,同时可以出租自己的车,租用别人的车。然后管理员端......
  • Java广度优先爬虫示例
    这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发工具(IDE......
  • Java网络编程
    Java最初是作为一种网络编程语言出现的,它能够使用网络上的各种资源和数据,与服务器建立各种传输通道,将自己的数据传送到网络的各个地方。你可以用Java很轻松地完成这些,......