13.继承

1.继承

关键字:extends

class Father{
    public int num1=10;
    private int num2=20;
    protected int num3=30;

    public Father(int num1,int num2,int num3){
        this.num1=num1;
        this.num2=num2;
        this.num3=num3;
    }

    public Father(){
        System.out.println("Father");
    }

    @Override
    public String toString() {
        return String.format("%d %d %d",num1,num2,num3);
    }
}

class Son extends Father{
    public Son(int num1,int num2,int num3){
        super(num1,num2,num3);
    }

    @Override
    public String toString() {
        return super.toString();
    }

  public static void main(String[] args){    System.out.println(new Son(1,2,3));  }
}//输出 1 2 3

重点

a.创建子类对象的时候会调用父类的构造函数,如果是无参数的构造函数,会自动的调用,不用写super()

b.Father father=new Son();//Son的实例但是进行了向上转型,father引用可以调用Father类中的函数,以及子类中被重写的函数(多态),但是父类的引用是不能调用子类的属性的,因为多态只针对方法不针对属性

例子:

public class Main {
    public static void main(String[] args){
        /*创建子类对象的时候会调用子类的构造函数*/
        Son son=new Son();

        /*输出num1的值*/
        Father father=new Son();
        System.out.println(father.num1);

        /*调用函数f()*/
        father.f();
    }
}

class Father{
    public int num1=10;
    public Father(){
        System.out.println("Constructor of Father");
    }

    public void f(){
        System.out.println("Father‘s f()");
    }
}

class  Son extends Father{
    public int num1=20;
    public Son(){
        System.out.println("Constructor of Son");
    }

    @Override
    public void f(){
        System.out.println("Son‘s f()");
    }
}//输出:

Constructor of Father
Constructor of Son
Constructor of Father
Constructor of Son
10
Son‘s f()

覆盖与重载

  • 注意:重载与覆盖的区别
  • 重载(函数名称一样、参数的类型或者个不一致、与返回值无关)
  • 覆盖(必须是有继承关系的两个类之间,函数的访问权限,函数名称,参数的类型个数都必须一致)
  • @Override之后必须是覆盖而不能是重载--经常用在实现接口的函数的时候

Public、private、protected关键字

class A{
      public String name=new String(“Tom”);
      protected String school=new String(“SouthEast University”);
      private String sex=new String(“M”);
}
  • public关键字不做过多的解释,通过指向A对象的引用,可以访问name属性
  • private关键字,在A的类作用域之外,不能直接使用sex熟悉
  • protected关键字
      • 1.同包内protected与public相同
      • 2.不同包内,2.1不是A的子类与private相同,
          • 2.2是A的子类与public相同(只能在子类的作用域内),这就是为什么下边的代码为什么不能执行的原因

            public class Test{
                    public static void main(String[] args){
                          Object obj=new Object();
                          System.out.println(obj.hashCode());
                    }
            }    //解释按道理所有的类都是Object的子类,hahCode是protected函数,也就是说对于Object的子类,都可以执行hashCode()函数,但是必须在子类包中,这里就是Object所在的包中这样写就是没问题的@Overridepublic int hashCode(){  return super.hashCode();}
  • 省去包修饰符是包访问权限

关键字:final

作用如下

  • 修饰属性,表示编译器常量

      • final int a=9;//被初始化之后就不能改变--一般常量
      • static final int A=9;//静态常量--类的常量
    • 备注:Java中的final变量在定义的时候可以不进行初始化,但是初始化之后就不能修改常量的值
        • eg:
        • final int m;
        • m=30;
        • m=20;//Wrong  
  • 修饰对象和数组引用,表示引用不能改变“指向”

      • final int[] a=new int[]{1,2,3};
      • a[0]=1000;//可以改变数组的值
      • a=new int [20];//Wrong 不能改变a的引用
  • 修饰方法,表示函数不能被重写(覆盖)
  • private 其实就是隐式的final函数,但是本质还是不一样的,只能说peivate 函数是有final关键字的
      • 1.final 函数,子类中不能添加同名同参数的函数
      • 2.private函数,子类中可以添加同名同参数的函数,但是这个不是重写,只是添加了自己的同名函数,与父类无关--------强烈建议避免这样写
      •  class Instrument {
            private void display(){System.out.println("Instrument‘s display");}//无法被覆盖
        }
        
        public class Wind extends Instrument{
            private void display(){System.out.println("Wind‘s display");}//并不是覆盖父类的函数,而是添加自己的函数
            public static void main(String[] args){
                Instrument instrument=new Wind();//向上转型为父类的对象同时丢失父类的private方法
                instrument.display();//Wrong
            }
        }
  • 修饰类,表示类不能被继承
时间: 2024-10-13 12:31:17

13.继承的相关文章

javascript之继承

主要是参考了<JavaScript高级程序设计(第三版)>这本书,根据自己的理解,做了下面的记录 继承是面向对象(OO)语言里面的概念,有俩种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.由于函数没有签名,在javascript里面无法实现接口继承,只支持实现继承. 原型链继承 构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针. 所有函数的默认原型都是Object的实例 那

JavaScript ----------- 组合继承

继承 实现继承:继承实际的方法.ECMAScript 只支持实现继承,而且其实现基础主要是依靠原型链来实现的. 基本思想是:利用原型来实现一个引用类型继承另外一个引用类型的属性和方法. 原型 - 构造函数 - 实例 之间的关系 构造函数(prototype) <-------> 原型(constructor) <------- 实例(_proto_) 实现原型链有一种基本模式,其代码大致如下 1 function SuperType(){ 2 3 this.property = true

javascript对象继承

实现继承主要是依靠原型链来实现的 1.原型链 基本思想就是利用原型让一个引用类型继承另一个引用类型的属性和方法 1 function Parent(){ 2 this.surname = "li"; 3 } 4 Parent.prototype.getSurname = function(){ 5 return this.surname; 6 } 7 function Child(){ 8 this.name = "kai wen"; 9 } 10 Child.pr

css的继承以及层叠

继承 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>CSS的继承性</title> 6 <style> 7 .father { 8 color:red; 9 } 10 </style> 11 </head> 12 <body> 13 &

java面向对象的基本形式,封装、继承、多态

总结:1.面向对象三个特征:封装;继承;多态; 方法也是一个最基本的封装体,类也是封装体 2.封装:隐藏了实现的细节,还要对外提供可以访问的方式,便于调用者使用; 优点:1.提高代码的复用性;2.提高了安全;3.隐藏了实现的细节,还要对外提供可以访问的方式,便于调 用者使用 3.可以在成员变量名前面加上this.来区别成员变量和局部变量 4.继承:在一个现有的类的基础上去构建一个新的类,构建出的新的类被称作子类,现有的类被称为父类,子类会自动拥有父类的属性和方法; 5.private修饰的方法和

spring 攻略

1.5 指定Bean引用 为了Bean之间相互访问,在Bean配置文件中通过<ref>元素为Bean属性或构造程序参数指定Bean引用. <property name="prefixGenerator"> <ref bean="datePrefixGenerator"> 如果在同一个配置文件,可以使用local属性 </property>简写:<property name="prefixGenerato

系统间通信(8)——通信管理与RMI 上篇

1.概述 在概述了数据描述格式的基本知识.IO通信模型的基本知识后.我们终于可以进入这个系列博文的重点:系统间通信管理.在这个章节我将通过对RMI的详细介绍,引出一个重要的系统间通信的管理规范RPC,并且继续讨论一些RPC的实现:再通过分析PRC的技术特点,引出另一种系统间通信的管理规范ESB,并介绍ESB的一些具体实现.最后我们介绍SOA:面向服务的软件架构. 2.RMI基本使用 RMI(Remote Method Invocation,远程方法调用),是JAVA早在JDK 1.1中提供的JV

wxPython入门练习代码 一

Bare.py: 1 #1.导入必须的wxPython包 2 import wx 3 4 #2.子类化wx应用程序类 5 class App(wx.App): 6 #3.定义应用程序初始化方法 7 def OnInit(self): 8 frame = wx.Frame(parent=None,-1,title='Bare') 9 frame.Show() 10 return True 11 12 #4.创建应用程序的实例 13 app = App() 14 #5.进入应用程序的主事件循环 15

java--面向对象(3)--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 面向对象(3) 主要内容:< Math类的随机数.代码块.继承.this和super.方法重写的应用.方法重写.final关键字.多态 > 1 学习Math类的随机数功能 通过帮助文档: 1.Math类是在:java.lang包下,不需要导包(关于包,后面会学习); 2.此类没有构造方法,所有的可用方法都是static:通过类名就可以调用: 3.要学习使用:random()方法: 形参:没有