首页 > 其他分享 >01继承

01继承

时间:2022-09-23 10:46:08浏览次数:47  
标签:01 name 继承 子类 成员 父类 public 变量

1.基础回顾+面试

1.1类中成分

  1. 成员变量(Field:描述类和对象的属性信息的)
  2. 成员方法(Methpd:描述类或者对象的行为信息的):包括实例方法,静态方法,抽象方法,getter setter 方法
  3. 构造器(Constructor:初始化一个类的对象并返回引用)
  • 默认无参构造器:一个类默认会自带一个无参构造器,即使不写它也存在,但是如果一个类它写了一个构造器,那么默认的无参构造器就被覆盖了!
  • 有参构造器
  1. 代码块
  2. 内部类
/*
   javaBean类: 封装数据
*/
public class Student {
    // 两个成员变量 私有
    private String name;
    private int age;
    
    
    // 无参构造器
    public Student(){
        
    }
    
    
    // 有参数构造器
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    // 成员方法: setXX \ gerXX
    public void setName(String name){
        this.name = name;        
    }
    public String getName(){
        return name;
    }
    
    
    public void setAge(int age){
        this.age = age
    }
    public int getAge(){
        return age;
    }
    public void show(){
        System.out.print;n(name + "..." + age);
    }
}

1.2this关键字

  • this关键字可以用在实例方法和构造器中
  1. this关键字用在方法中,谁调用这个方法,this就代表谁
  2. this关键字用在构造器上,代表了构造器正在初始化那个对象的引用
/*
   javaBean类: 封装数据
*/
public class Student {
    // 两个成员变量 私有
    private String name;
    private int age;
    
    
    // 无参构造器
    public Student(){
        
    }
    
    
    // 有参数构造器中可以用 this 关键字
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    // 实例方法中可以用 this 关键字
    // 成员方法: setXX \ gerXX
    public void setName(String name){
        this.name = name;        
    }
    public String getName(){
        return name;
    }
    
    
    public void setAge(int age){
        this.age = age
    }
    public int getAge(){
        return age;
    }
    public void show(){
        System.out.print;n(name + "..." + age);
    }
    
}

1.3static关键字

– 按照有无static修饰,成员变量和方法可以分为

1. 成员变量

  • 静态成员变量(类变量)

    有static修饰的成员变量称为静态成员变量,也叫类变量,属于类本身,直接用类名访问即可

  • 实例成员变量

    无static修饰的成员变量称为实例成员变量,属于类的每个对象的,必须用类的对象来访问

2. 成员方法

  • 静态方法

    有static修饰的成员方法称为静态方法,也叫类方法,属于类本身的,直接用类名访问即可

  • 实例方法

    无static修饰的成员方法称为实例方法,属于类的每个对象的,必须用类的对象来访问

3. 成员变量的访问语法

  • 静态成员变量访问:
    类名.静态成员变量
    对象.静态成员变量(也可以访问,但是不推荐)
  • 实例成员变量的访问:
    对象.实例成员变量
public class Student {
    // 1.静态成员变量: 有static修饰,属于类本身,直接用类名访问即可!
    public static String schoolName = "中国";
    // 2.实例成员变量: 无static修饰,属于类的对象,必须用对象访问
    private String name;
    private int age;

    public static void main(String[] args){
        // 1.类名.静态成员变量
        System.out.println(Student.schoolName);
        // 注意:同一个类中访问静态成员变量可以省略类名不写
        System.out.println(schoolName);


        // 2.对象.实例成员变量
        Student s1 = new Student();
        s1.name = "孙悟空";
        System.out.println(s1.name);
        // 3.对象.静态成员变量(不推荐)
        System.out.println(s1.schoolName);
		// 静态成员变量属于类,直接用类名访问即可
    }
}

1.4继承的概述

  • 继承是子类到父类的一种关系
  • 子类继承了一个父类,子类就可以直接得到父类的属性(成员变量)和行为(方法)了
  • 在java中继承是 “is a” 的关系。Cat extends Animal : 猫是一个动物
  • 在java中,子类是更强大的,子类不仅继承了父类的功能,自己还可以定义自己的功能
    格式:
子类 extends 父类 {
    
}

1.5子类不能继承父类的内容

  • 子类继承父类,子类就得到了父类的属性和行为,但是并非所有父类的属性和行为等子类都可以继承
  • 子类不能继承父类的构造器:子类有自己的构造器(没有争议)
public class ExtendsDemo {
    public static void main(String[] args) {
        // Cat c = new Cat();
    }

class Cat extends Animal{

}
class Animal{
		// 父类中的静态成员方法
        private  void run(){

        }
}

1.6继承后成员变量的访问特点

就近原则:子类有就找子类,子类没有找父类,父类没有就报错!

  • this 代表了当前对象的引用,可以用于访问当前子类对象的成员变量
  • super 代表了父类对象的引用,可以用于访问父类中的成员变量
public class TestDemo {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.show();
    }

}
class Animal{
    public String name = "动物名称";
}

class Cat extends  Animal {
    public String name = "子类名称";
    public void show() {
        String name = "局部名称";
        System.out.println(name);  //局部名称
        System.out.println(this.name);  //子类名称
        System.out.println(super.name); //父类名称
    }

}

1.6继承后成员方法的访问特点

  • 子类对象优先使用子类已有的方法

1.7继承后方法重写

  • java建议在重写的方法上面加一个@override 注解
  • 方法一旦加了这个@override 注解,那就必须是成功重写父类的方法,否则报错!

方法重写的规范:

  1. 子类重写方法的名称和形参列表必须与父类被重写方法一样
  2. 子类重写方法的返回值类型声明要么与父亲一样,要么比父类方法返回值类型范围更小
  3. 子类重写方法的修饰符权限应该与父类被重写方法的修饰符权限相同或者范围更大
  4. 子类重写方法申明抛出的异常应该与父类被重写方法申明抛出的异常一样或者范围更小

小结:

  1. 方法重写是子类重写一个与父类申明一样的方法覆盖父类的方法
  2. 方法重写要加@override 注解
  3. 方法重写的核心要求:方法名称,参数列表必须与被重写方法一致!

扩展:

  • 静态方法和私有方法是否可以被重写?
    答:都不可以,加上@override会报错

1.8继承后构造器特点

子类继承父类,子类的全部构造器默认会先访问父类的无参构造器,再执行子类自己的构造器

  • 为什么子类的构造器会先调用父类的构造器?
    答:1. 子类的构造器的第一行默认有一个super()调用父类的无参构造器,写不写都存在
    ​ 2.当我们调用子类构造器初始化子类对象数据的时候,必须先调用父类构造器初始化继承自父类的属性和行为(先有爸爸,后有儿子)

1.9this和super

  • this代表了当前对象的引用(继承中指代子类对象)
  1. this.子类成员变量
  2. this.子类成员方法
  3. this(....):可以根据参数匹配访问本类中其他构造器
  • super代表了父类对象的引用(继承中指代了父类对象空间)
  1. super.父类成员变量
  2. super.父类的成员方法
  3. super(....):可以根据参数匹配访问父类的构造器

注意:

  • this(...)借用本类其他构造器
  • super(...)调用父类的构造器
  • this(...)和super(...)必须放在构造器的第一行,否则报错
  • 所以this(...)和super(...)不能同时出现在构造器中!!

1.10继承特点

继承的特点:

  1. 单继承: 一个类只能继承一个直接父类
  2. 多层继承:一个类可以间接继承多个父类(C继承B,B继承A)
  3. 一个类可以有多个子类(C继承B,D也继承B,B就有了C,D两个子类)
  4. 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类

1.11引用类型作为方法参数和返回值

– 引用类型作为java的数据类型,自然可以作为方法的参数类型和返回值类型

– 除了基本数据类型就是引用数据类型了

  • 基本数据类型
    byte,short,int,long,char,boolean,float,double
  • 引用类型
  1. 就是我们自己创建的类型
  2. 接口
  3. 数组

2.面试常考

2.1八种访问形式问答

实例方法是否可以直接访问实例成员变量?

答:可以的,因为它们都属于对象

实例方法是否可以直接访问静态成员变量?

答:可以的,静态成员变量可以被共享访问

实例方法是否可以直接访问实例方法?

答:可以的,实例方法和实例方法都属于对象

实例方法是否可以直接访问静态方法?

答:可以的,静态方法可以被共享访问

静态方法是否可以直接访问实例变量?

答:不可以,静态方法属于类,实例变量属于对象,实例变量必须用对象访问

静态方法是否可以直接访问静态变量?

答:可以的,静态成员变量可以被共享访问

静态方法是否可以直接访问实例方法?

答:不可以,实例方法必须被对象访问

静态方法是否可以直接访问静态方法?

答:可以的,静态方法可以被共享访问

2.2继承

子类中不能继承父类东西是什么?

答:子类不能继承父类的构造器,子类有自己的构造器

子类是否可以继承父类的私有成员(私有成员变量,私有成员方法)?

答:有争议,我认为子类是可以继承父类的私有成员的,只是不能直接访问而已

子类上是否可以继承父类的静态成员?

答:子类可以继承父类的静态成员。

2.3重写

静态方法和私有方法是否可以被重写?

答:不可以,加上@Override会报错

2.4继承后构造器特点

为什么子类的构造器会调用父类的构造器

答:子类的构造器第一行默认有super()调用父类的无参构造器,写不写都存在

2.5单继承

为什么Java是单继承的?
答: 反证法

// 假如Java可以多继承,请看如下代码
class A{
    // 成员方法
    public void test(){
        System.out.println("A");
    }
}

class B{
    // 成员方法
    public void test(){
        System.out.println("B");
    }
}
class C extends  A,B{
    public static void main(String[] args){
        C c = new C();
        c.test(); //出现了类的二义性!所以Java不能多继承!!
    }
}

标签:01,name,继承,子类,成员,父类,public,变量
From: https://www.cnblogs.com/Gege-1/p/16721782.html

相关文章

  • [FLET] 01 可以拖动的方块
    fromtypingimportListimportfletfromfletimport(Container,Draggable,DragTarget,Page,Row,Text,alignment,colors,......
  • P2822 [NOIP2016 提高组] 组合数问题
    P2822[NOIP2016提高组]组合数问题题解作者岛田小雅这是一道复杂度非常容易爆炸的问题。我看到这题的第一眼,第一反应是直接按照公式暴力跑。我们看一眼数据范围。如......
  • P1078 [NOIP2012 普及组] 文化之旅
    https://www.luogu.com.cn/problem/P1078搜索,图论,剪枝,最短路绿色题思路一:搜索1.输入,建边,用一个数组存储已经学习的文化,2.搜索,以当前的点now去看能走到哪些边,......
  • [NOIP2001 提高组] 统计单词个数
    [NOIP2001提高组]统计单词个数题目描述给出一个长度不超过\(200\)的由小写英文字母组成的字母串(该字串以每行\(20\)个字母的方式输入,且保证每行一定为\(20\)个)。......
  • 9.22 DAY 01
    记录一下读的文献,以便日后翻阅。读论文:2020_NeurIPS_RegionAttentionNetworkforSemanticSegmentation关键词记录Method:使用区域上下文关系,建立起像素之间的空间(sp......
  • 继承和派生
    不同的类中有大量重复的代码和实现,为了优化引入继承和派生。继承和派生,本质是相同的,只是从不同的角度来描述。父亲“派生”出儿子,儿子“继承”自父亲。 除了“构造函......
  • 洛谷 P1025 [NOIP2001 提高组] 数的划分 (dfs)
    https://www.luogu.com.cn/problem/P1025给定一个n和k,把n拆分成k个数字的和,数字可以相同,但是种类不能相同。求能凑出的数量。输入73输出4明明是一道很简单的dfs,......
  • [JSOI2010]冷冻波
    [JSOI2010]冷冻波题目描述WJJ喜欢“魔兽争霸”这个游戏。在游戏中,巫妖是一种强大的英雄,它的技能FrozenNova每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是......
  • JavaScript 类继承
    使用extends关键字。super() 方法用于调用父类的构造函数。已有的类称为基类(父类),新建的类称为派生类(子类)。通过在构造方法中调用 super() 方法,我们调用了父类的构......
  • CVE-2017-0143(永恒之蓝)漏洞复现By metasploit
    一、永恒之蓝介绍永恒之蓝是在Windows的SMB服务处理SMBv1请求时发生的漏洞,这个漏洞导致攻击者在目标系统上可以执行任意代码。通过永恒之蓝漏洞会扫描开放445文件共享端......