美文网首页
java基础2

java基础2

作者: MononokeHime | 来源:发表于2018-11-08 14:52 被阅读0次

Java 中继承的特点

  • 只支持单继承
  • 子类只能继承父类的非私有的成员和方法
  • 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法

this与super的区别

this代表本类对应的引用
super代表父类存储空间的表示
怎么用?

  • 调用成员变量
    • this.成员变量 调用本类的成员变量
    • super.成员变量 调用父类的成员变量
  • 调用构造方法
    • this(...):调用本类的构造方法
    • super(...):调用父类的构造方法
  • 调用成员方法
    • this.成员方法:调用本类的成员方法
    • super.成员方法:调用父类的成员方法

继承中构造方法的关系

子类中所有的构造方法默认都会访问父类中的空参数的构造方法
为什么呢?

  • 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
  • 每一个构造方法的第一条语句默认都是:super()

如果父类中没有无参构造方法,该怎么办呢?

  • 子类通过super去显示调用父类其他的带参的构造方法
  • 一定要注意:
    • super(...)或者this(...)必须出现在第一条语句上
    • 否则,就会有父类数据的多次初始化

final关键字

final的特点

  • final可以修饰类,该类不能被继承
  • final可以修饰方法,那么该方法就不能被子类所重写
  • final可以修饰变量,该变量不能被重新赋值

被final修饰的变量只能赋值一次
final int num;num = 10或者
final int num = 10;

多态

同一个对象,在不同的时刻体现出来的不同状态
多态的前提:
A:要有继承关系
B:要有方法重写
C:要有父类指向子类对象
父类 f = new 子类()
f调用的方法只能是被子类重写的方法
<u>多态体现在表面上调用父类的方法,其实调用的是子类的方法!</u>

多态的成员访问特点:
A:成员变量
编译看左边,运行看左边
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边(静态和类相关,算不上重写,所以,访问还是看左边的)

多太的弊端,不能使用子类的新功能(即没有重写的方法)
解决方法:可以借助向下转型
子类 z = (子类)f

class KongZiDad{
    int age = 40;
    public void teach(){
        System.out.println("教Java");
    }
}

class KongZi extends KongZiDad{
    int age = 20;
    public void teach(){
        System.out.println("教论语");
    }
    public void playGame(){
        System.out.println("英雄联盟");
    }
}

class HelloWorld{
    public static void main(String[] args) {
        KongZiDad kzd = new KongZi();
        System.out.println(kzd.age);  // 40
        kzd.teach();  // 教论语
        // kzd.playGame(); 无法调用
        KongZi kz = (KongZi)kzd; 
        System.out.println(kz.age); // 20
        kz.teach(); // 教论语
        kz.playGame(); // 英雄联盟
    }
}

如何更好的理解多态呢?

多态类的内存图

抽象类

定义了抽象方法的类是抽象类

abstract class Animal{
    public abstract void eat();
}

抽象类有构造方法,但抽象类不能实例化。抽象类中的构造方法是子类访问父类的初始化数据。
抽象类的子类问题:

  • 抽象类的子类没有重写抽象方法,扔是一个抽象类,不能实例化
  • 如果重写了抽象类中的所有抽象方法,就是普通的子类,可以实例化
  • 可以通过多态的方式对抽象类进行实例化
    抽象类 obj = new 子类()

抽象类的成员

  • 成员变量:既可以是变量,也可以是常量
  • 成员方法:既可以是抽像的,也可以是非抽像的
  • 构造方法:有

接口

格式:interface 接口名 {}
实现:class 类名 implement 接口名 {}
注意:

  • 接口不能实例化
  • 如果要实例化,按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态
    接口的子类:
  • 要么是抽样类
  • 要么重写接口中的所有抽象方法

接口中成员的特点:

  • 成员变量默认是 public static final
  • 接口没有构造方法(所有类默认继承Object类)
  • 成员方法默认是 public abstract

抽象类和接口区别

抽象类:被继承,体现的是“is a”的关系,抽象类中定义的是该继承体系的共性功能
接口:被实现,体现的是“li'ke a”的关系,接口中定义的是该继承体系的扩展功能

类名,抽象类名,接口名做为参数传递问题

1.类名作为形参和返回值类型,跟不同类型一样
2.抽象类名:因为抽象类不能实例化,必须借助多态实现

  • 抽象类名作为形参传递
abstract class Person {
    public abstract void study();
}

class PersonDemo {
    public void method(Person p) {//p; p = new Student();  Person p = new Student(); //多态
        p.study();
    }
}

//定义一个具体的学生类
class Student extends Person {
    public void study() {
        System.out.println("Good Good Study,Day Day Up");
    }
}

class PersonTest {
    public static void main(String[] args) {
        //目前是没有办法的使用的
        //因为抽象类没有对应的具体类
        //那么,我们就应该先定义一个具体类
        //需求:我要使用PersonDemo类中的method()方法
        PersonDemo pd = new PersonDemo();
        Student p = new Student();
        pd.method(p);
    }
}
  • 抽象类名作为返回值类型
abstract class Person {
    public abstract void study();
}

class PersonDemo {
    public Person getPerson() {
        //Person p = new Student();
        //return p; 
        return new Student();
    }
}

class Student extends Person {
    public void study() {
        System.out.println("Good Good Study,Day Day Up");
    }
}

class PersonTest {
    public static void main(String[] args) {
        PersonDemo pd = new PersonDemo();
        Person p = pd.getPerson(); //new Student();  Person p = new Student(); 
        p.study();
    }
}

3.接口名同上

权限修饰符

权限修饰符:
                    本类  同一个包下(子类和无关类)   不同包下(子类)    不同包下(无关类)
        private     Y       
        默认      Y       Y
        protected   Y       Y                           Y
        public      Y       Y                           Y               Y
    修饰符:
        权限修饰符:private,默认的,protected,public
        状态修饰符:static,final
        抽象修饰符:abstract
        
    类:
        权限修饰符:默认修饰符,public
        状态修饰符:final
        抽象修饰符:abstract
        
        用的最多的就是:public
        
    成员变量:
        权限修饰符:private,默认的,protected,public
        状态修饰符:static,final
        
        用的最多的就是:private
        
    构造方法:
        权限修饰符:private,默认的,protected,public
        
        用的最多的就是:public
        
    成员方法:
        权限修饰符:private,默认的,protected,public
        状态修饰符:static,final
        抽象修饰符:abstract
        
        用的最多的就是:public
        
    除此以外的组合规则:
        成员变量:public static final
        成员方法:public static 
                  public abstract
                  public final

内部类

把类定义在其他类的内部,这个类就被称为内部类
内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

内部类的详细介绍:Java内部类详解

当我们编译的时候,不仅会生成外部类的class文件,还会生成内部类的class文件,格式是外部类名$内部类名.class

匿名内部类

相关文章

  • Java学习规划

    概述 本文档主要说明java学习计划。 Java基础(2周) java零基础入门到精通(2019版) Java基础...

  • 记录一些书籍

    JAVA 基础 《Java核心技术·卷1:基础知识》《Java核心技术 卷2:高级特性》《Java8 实战》 并发...

  • Java全套学习资料

    Java基础 1-1 就业课(2.0)-Java基础语法 第1节java运行环境 第2节HelloWorld案例 ...

  • 开课吧大数据高级开发工程师 百度网盘分享

    课程大纲: java的基础课程(额外提供)阶段2:linux基础阶段3:java基础阶段4.5:mysql阶段6:...

  • java学习路径

    一、java基础知识 (30天) 1. 语言基础, java基础,环境变量 2. 语言基础, 进制转换 3. 语言...

  • Java基础总结

    一、Java基础认识 1、基础知识 1)JavaSE——>JavaEE、JavaME 2)Jdk(java工具、J...

  • Java基础知识整理(一)

    1.Java基础知识体系 2.Java技术体系平台 3.Java语言特点与核心机制 1.Java基础知识体系 2....

  • JAVA && Spring && SpringBoot2.x学

    JAVA && Spring && SpringBoot2.x — 学习目录 JAVA篇 JAVA基础篇(1)-格...

  • Java 基础

    Java 基础01Java开发入门 Java 基础02Java编程基础 Java 基础03面向对象 Java 基础...

  • Java面试题整理汇总

    1. Java程序基础 1.1开发和运行环境1.2Java语言概述1.3生成,部署和配置 2. Java语法基础 ...

网友评论

      本文标题:java基础2

      本文链接:https://www.haomeiwen.com/subject/wrwixqtx.html