一.继承:

关键字extends

  1. /*
  2. 定义一个父类:人类
  3. 定义父类格式:public class 父类名称{
  4. }
  5. 定义子类格式:public class 子类名称 extends 父类名称{
  6. }
  7. */
  • 代码示范:

    *要点:

    1.子类中在main方法中创建父类对象可调用父类方法;

    2.不加关键字直接访问本方法局部变量(可重名时区分);

    3.使用this关键字访问本类成员变量(可重名时区分);

    4.使用super关键字访问父类成员变量(可重名时区分);

    5.如果存在方法的重名:父类与子类有重名方法:

    ——对象new的谁则优先调用谁的重名方法,没有则向上寻找;

    前面介绍了成员变量、成员方法继承的访问特点,接下来是构造方法:

    ——子类构造方法(父类无参时)中有一个默认赠送的super()方法

    ——父类有参时,子类里调用super的()里传参,重载时谁对的上调用谁;

    6.如果要更新修改父类方法,本着设计原则尽量不去直接修改正在使用的类,

    则可以进行覆盖重写:格式:通过使用super关键字继承父类需要的方法。
  1. @Override
  2. 方法外部相同(){
  3. super.父类方法();
  4. //这里添加新的内容
  5. }
  6. /*
  7. 小结super
  8. super关键字作用:
  9. 示例:
  10. public class demo06Super extends demo01people {
  11. public void method1(){
  12. System.out.println(super.num); //1.在子类成员方法中访问父类的成员变量
  13. }
  14. public void method2(){
  15. super.methodChongMing(); // 2.在子类成员方法中访问父类的成员方法
  16. }
  17. public demo06Super(){
  18. super(); //3.在子类的构造方法中访问父类的构造方法
  19. }
  20. }
  21. */

7.this关键字的作用小结:

  1. this关键字的作用:
  2. 1.在本类的成员方法中访问本类的成员变量
  3. 2.在本类成员方法中访问本类的另一个成员方法
  4. 3.在本类的构造方法中访问本类的另一个构造方法:
  5. (1)this(...)调用必须是构造方法的第一个语句,一个this
  6. (2)superthis两种构造调用不能同时使用
  • 代码示范:
  1. String name = "python";
  2. public void method1(){
  3. String name = "python";
  4. System.out.println(name);//无关键字时直接访问本方法局部变量
  5. System.out.println(this.name);//访问本类成员变量
  6. System.out.println(super.num);//访问父类成员变量
  7. this.method2();//访问本类另一个成员方法
  8. }

8.最后,继承三大特点:

  1. 1.单继承:一个子类只有一个直接父类
  2. 2.多级继承:父类、子类、子类也可作父类再向下延伸,最上级为java.lang.object
  3. 3.一个父类可以有多个子类

二、多态

1.多态性:父类引用指向子类对象

多态的一个用处:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会发生变化

  1. 格式:
  2. 父类名称 对象名 = new 子类名称();
  3. 或者:
  4. 接口名 对象名 = new 实现类名称()。

2.成员方法:编译看左,运行看右;

成员变量:编译看左,运行也看左;实例变量不具备多态性.

代码示范:

  1. //前面省略部分Zi类已经继承Fu类
  2. public static void main(String[] args) {
  3. Fu one = new Zi();//多态的写法
  4. one.methodcommon();//重名时,成员方法优先使用子类(new谁先调用谁)。
  5. one.fu1();//它的编译时类型为Fu,可以调用Fu中的方法
  6. // one.zi1(); 该调用编译时会报错,因为它的编译时类型为Fu,无法调用zi1方法;
  7. System.out.println(one.num);//优先看左边Fu类
  8. Zi two = (Zi) one;//将父类对象还原成子类对象。
  9. System.out.println(one instanceof Fu);//输出true,one可以做Fu类的实例对象
  10. System.out.println(one instanceof Zi);//输出true,one可以做Zi类的实例对象
  11. }

3.转型多态写法左父右子是正常的向上转型

4.向下转型:为了让对象调用子类方法(向上转型只能调用左边编译类型的父类方法)

左子类右父类,是一个还原的过程,将父类对象还原成子类对象,且不能向下转成别的子类。

  1. 格式: 子类名 对象名 = (子类名) 父类对象名; (后者也可以是接口)
  2. Fu fu = new Fu();//向上转型创建父类对象
  3. Zi two = (Zi) one;//将父类对象还原成子类对象。

5.强制向下转型时,判断前面的对象是否是后面类型的实例,是否可以成功转换,从而保证代码更加健壮。

格式: 对象 instanceof 类型

得到一个boolean值结果(true/false),判断前面的对象能否作为后面类型的实例

  1. Zi two = (Zi) one;//将父类对象还原成子类对象。
  2. System.out.println(one instanceof Fu);//输出true,one可以做Fu类的实例对象
  3. System.out.println(one instanceof Zi);//输出true,one可以做Zi类的实例对象

三、接口

1.接口定义了某一批类需要遵守的规范。这就意味着接口里通常是定义一组公用方法。

2.接口是一种引用数据类型(类、接口、数组),注意其中的抽象方法。

3.接口可以继承接口,但不能继承类。

4.Java9 里可以有常量、抽象方法、默认方法、静态方法、私有方法。

5.备注:接口编译后生成的同样是.class的字节码文件

  1. //格式
  2. public interface 接口名称(首字母大写){
  3. //抽象方法
  4. }
  • 接口里的成员变量只能是常量,必须用public static final修饰,可省略
  1. //final即为不可改变
  2. public static final int MAX_NUMBER = 20;
  • 接口里的[普通方法]只能是抽象方法,public abstract可以省略
  1. public abstract void out();
  2. void getDate();
  • 接口中的[默认方法]需要用default修饰
  1. /*
  2. 当接口新添加方法时,新方法写为默认方法,则可以不去动其实现类,默认方法自动被其继承
  3. 默认方法同样可以被覆写。
  4. */
  5. public default void print() {
  6. foo();
  7. System.out.println("默认方法调用3");
  8. }
  • 接口中定义[静态方法],需要用static修饰
  1. public static void staticTest() {
  2. System.out.println("静态方法!");
  3. }
  • 当俩默认方法中有重复内容时,抽取出来定义私有方法
  1. //定义私有默认方法,给默认方法调用,但不应被实现类使用,所以权限为私有
  2. private void foo() {
  3. System.out.println("默认方法调用2");
  4. }
  5. //定义私有静态方法,给静态方法调用,但不应被实现类使用,所以权限为私有
  6. private static void bar() {
  7. System.out.println("bar私有静态方法");
  8. }
  9. }
  • 接口不能创建实例,但能用于声明引用类型变量,且必须引用到实现类的对象;
  • 一个实现类可以同时实现多个接口
  1. //格式:
  2. .public class 实现类名称 impliments{
  3. //必须覆写接口中所有抽象方法;
  4. },
  • 在实现类(impliments)中进行接口的实现:
  1. //
  2. public class Demo01InterfaceImpl implements Demo01Interface,Demo02Interface {
  3. //1,2接口都有out抽象方法,但只需覆写一次
  4. @Override
  5. public void out() {
  6. System.out.println("抽象方法覆写!");
  7. }
  8. @Override
  9. public void getDate() {
  10. System.out.println("抽象方法覆写!");
  11. }
  12. @Override
  13. public void print(){
  14. System.out.println("冲突的默认方法也需要覆写!");//不冲突则不用覆写
  15. }
  16. }
  • 然后在main类里创建实现类的对象,进行调用
  1. public class Impliments {
  2. public static void main(String[] args) {
  3. //创建实现类的对象
  4. Demo01InterfaceImpl ImplementationObject1 = new Demo01InterfaceImpl();
  5. ImplementationObject1.getDate();
  6. ImplementationObject1.out();
  7. ImplementationObject1.print();//调用实现类里继承自接口的默认方法。
  8. //接口里的静态方法只能通过接口名称直接调用。
  9. Demo01Interface.staticTest();
  10. //通过接口名直接访问常量。
  11. System.out.println(Demo01Interface.MAX_NUMBER);
  12. }
  13. }
  • 接口是多继承,一个接口可以有多个父接口。
  • 多个父接口中的抽象方法如果存在重名,正常覆写;但默认方法重名需要带有default关键字覆写。
  • 正常不冲突抽象方法不需要再覆写(实现类多个接口时也是如此)。
  1. //接口的多继承,同样使用extends关键字
  2. public interface Demo03InterfaceExtends extends Demo01Interface,Demo02Interface {
  3. @Override
  4. default void print() {
  5. //覆写父接口的默认方法不能省略default关键字
  6. }
  7. }

四、抽象类

  • 抽象方法:加上abstract关键字,去掉大括号,直接分号结束;
  • 抽象类:抽象方法所在的类必须是抽象类,再class之前写上abstract即可
  • 不能直接new抽象类对象,必须用一个子类来继承抽象父类

    (抽象类对象调用的方法存在没有具体内容的方法体,因此没有意义)
  • 创建子类对象,不可创建抽象父类对象;
  1. public abstract class demo01Abstract {
  2. public abstract void method1();
  3. public abstract void method2();
  4. }
  • 子类必须覆写抽象类中的所有抽象方法(去掉abstrat,补上大括号)。

    (假设不全部覆写,对象调用的方法存在抽象方法,没有意义)
  1. //使用extends继承抽象父类
  2. public abstract class demo02Zi extends demo01Abstract {
  3. //只覆写了一个抽象方法,没有将抽象方法全部覆写完,也就是说本子类还存在着继承下来的未覆写的抽象方法
  4. //所以该类也同样是抽象类
  5. @Override
  6. public void method1() {
  7. System.out.println("已经覆写第method1方法!");
  8. }
  9. }
  1. //在这个子子类中已经将所有抽象方法全部覆写,所以该类不再是抽象类!
  2. public class demo03Sun extends demo02Zi {
  3. @Override
  4. public void method2() {
  5. System.out.println("已经覆写method2方法!");
  6. }
  7. }
  • 最后在main类中的main方法里创建对象进行调用即可。

五、final关键字

  • final表示它修饰的类、方法、成员变量、局部变量不可改变。
  • final修饰的类不可被继承下去。无子类,不可被覆盖重写。
  1. public final class 类名(){}
  • final修饰的方法不可被覆盖重写。
  1. public final void method(){}
  • 类和方法不能同时使用final和abstract,二者矛盾。abstract表示抽象,是待定的;final表示最终的,是确定的。
  • final修饰局部变量,若是基本数据类型的数值,则不可改变;若是引用数据类型,则地址值不可改变,但地址指向的对象的内容可以改变。
  • final修饰成员变量,也不可变,但必须要进行手动赋值,成员变量加final后不允许再拥有默认值。
  1. public final class Demo01Final {
  2. public static void main(String[] args) {
  3. int NUM = 1;
  4. System.out.println(NUM);
  5. NUM = 2;//可以改变
  6. System.out.println(NUM);
  7. final int NUM1 = 2;
  8. // NUM1 = 3; 错误,NUM是确定的值,不可被改变。
  9. }
  10. }

六、权限修饰符

  • 权限大小:

    四种权限修饰符,访问权限从大到小:

    public > protected > 空 > private

    同一个类: yes yes yes yes

    同一个包: yes yes yes no

    不同包子类: yes yes no no

    不同包非子类:yes no no no

七、内部类

一个外部类包含的一个嵌套的类,叫内部类。

分类:

1.成员内部类。

2.局部内部类(包含匿名内部类)。

  • 注意:内部类可以无限制地访问外部类,外部类访问内部类需要内部类对象。
  • 各个类对应可以使用的权限修饰符如下:

    外部类:public/(default)

    成员内部类:public.protect.(default).private

    局部内部类:什么都没有,注意并不是(default)
  • 内部类定义示例:
  1. public class main {
  2. private String name = "成员变量";
  3. //定义一个成员内部类
  4. public class innerClass {
  5. private String innername = "内部成员变量";
  6. }
  7. // 定义一个成员内部类内的成员方法
  8. public void innermethod1() {
  9. System.out.println("内部类方法");
  10. System.out.println(name);
  11. }
  12. }

使用内部类的两种方式:

1.直接:在main方法中创建内部类对象:格式:

外.内 = new 外().内();

  1. 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
  2. public static void main(String[] args) {
  3. //直接创建内部类的对象。
  4. InnerclassUsing.innerClass object = new InnerclassUsing().new innerClass();
  5. object.innermethod1();
  6. }

2.间接:在外部类的方法中,只用内部类,main只是调用外部类的方法,通过外部类方法访问内部类。

  1. public class InnerclassUsing {
  2. private String name = "成员变量";
  3. //定义一个成员内部类
  4. public class innerClass {
  5. private String innername = "内部成员变量";
  6. // 定义一个成员内部类的成员方法
  7. public void innermethod1() {
  8. System.out.println("内部类方法");
  9. System.out.println(name);
  10. }
  11. }
  12. public void outMethod() {
  13. System.out.println("外部类成员方法");
  14. // System.out.println(innername); 错误。
  15. //通过匿名对象访问内部类变量和方法
  16. System.out.println(new innerClass().innername);
  17. //创建匿名对象并调用innermethod1方法。
  18. new innerClass().innermethod1();
  19. }
  20. }

内部类的重名变量访问格式:

  • 本方法: 空
  • 本类成员变量:this.
  • 外部类成员变量:外部类的名称.this.
  1. public class Demo03CommonName {
  2. //外部类成员变量
  3. int NAME = 1;
  4. public class innerClass{
  5. //内部类成员变量
  6. int NAME = 2;
  7. public void method (){
  8. //内部类局部变量
  9. int NAME = 3;
  10. System.out.println(NAME);//3,局部变量,就近原则。
  11. System.out.println(this.NAME);//2,本类成员变量。
  12. System.out.println(Demo03CommonName.this.NAME);//1,外部类的成员变量;
  13. }
  14. }
  15. }

如果一个类定义在方法内部,那么这个类叫局部内部类。

局部内部类只能被当前所属的方法所使用,外部不可。


格式:

  1. public class Localinnerclass {
  2. String NAME = "外部成员变量";
  3. public void method(){
  4. //定义局部内部类
  5. class localLinnerClass{
  6. String ONE = "局部内部类成员变量";
  7. public void nmethod2(){
  8. System.out.println("局部内部类的成员方法");
  9. System.out.println(ONE);
  10. }
  11. }
  12. }
  13. }

局部内部类,如果希望访问所在方法的局部变量,该变量应该满足【有效final】的条件

  1. public class Demo04Final {
  2. public void method1(){
  3. //这里即使不写final的话,不去修改 也算是有效final [从java8开始]
  4. final String NAME = "bilibili";
  5. class LocalInnerclass{
  6. public void localInnerMethod(){
  7. //局部内部类内的方法访问所在类外部的方法的局部变量
  8. System.out.println(NAME);
  9. }
  10. }
  11. }
  12. }

当接口是实现类只使用唯一一次时,可以使用匿名内部类

  • 格式
  1. 接口名称 对象名 = new 接口名称(){
  2. //这里进行抽象方法的覆写。
  3. }; //别忘了结尾的分号

匿名内部类在创建对象的时候,只能使用唯一一次

匿名对象在使用方法时,只能使用唯一一次

匿名内部类是省略了(实现类/子类名称),而匿名对象则是省略了对象名称,二者不同。

  1. //当实现类只使用一次时,可以使用匿名内部类的写法!
  2. Anonymous obj6 = new Anonymous() {
  3. //覆写匿名内部类里所有抽象方法!
  4. @Override
  5. public void method1() {
  6. System.out.println("bilibili?");
  7. }
  8. @Override
  9. public void method2(){
  10. System.out.println("覆写method!");
  11. }
  12. };
  13. obj6.method1();//打印内容
  14. obj6.method2();

将类作为成员变量的写法

  1. //定义一个武器类
  2. public class Weapon {
  3. private String itsname;//武器名称
  4. private int attacknum;//武器攻击力
  5. //无参构造方法
  6. public Weapon() {
  7. }
  8. //全参方法
  9. public Weapon(String itsname, int attacknum) {
  10. this.itsname = itsname;
  11. this.attacknum = attacknum;
  12. }
  13. //get名字
  14. public String getItsname() {
  15. return itsname;
  16. }
  17. //set名字
  18. public void setItsname(String itsname) {
  19. this.itsname = itsname;
  20. }
  21. //get攻击力
  22. public int getAttacknum() {
  23. return attacknum;
  24. }
  25. //set攻击力
  26. public void setAttacknum(int attacknum) {
  27. this.attacknum = attacknum;
  28. }
  29. }
  1. //定义一个女武神类
  2. public class Valkyrie1 {
  3. private String name;//女武神之名
  4. private Weapon weapon;//将武器类变为成员变量 交给女武神类
  5. //女武神攻击方法
  6. public void attack(){
  7. System.out.println(name + "使用的" + weapon.getItsname() + "具有" + weapon.getAttacknum() +"点攻击力");
  8. }
  9. //无参构造
  10. public Valkyrie1() {};
  11. //全参
  12. public Valkyrie1(String name, Weapon weapon) {
  13. this.name = name;
  14. this.weapon = weapon;
  15. }
  16. //get女武神名字
  17. public String getName() {
  18. return name;
  19. }
  20. //set女武神名字
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. //get女武神武器
  25. public Weapon getWeapon() {
  26. return weapon;
  27. }
  28. //set女武神武器
  29. public void setWeapon(Weapon weapon) {
  30. this.weapon = weapon;
  31. }
  32. }
  • 定义了女武神类和武器类后,在main方法中进行调用
  1. Valkyrie1 valkyrie = new Valkyrie1();//创建一个女武神
  2. valkyrie.setName("bronya"); //set女武神名字叫bronya
  3. Weapon weapon = new Weapon("真理之钥",1000);//创建一把武器,并同时赋予名称和攻击力
  4. // 也可以分开写: weapon.setItsname("真理之钥");//武器名字
  5. // 也可以分开写: weapon.setAttacknum(1000);//武器攻击力
  6. valkyrie.setWeapon(weapon);//将定义好的武器交给女武神
  7. valkyrie.attack();//最后,女武神使用这把武器进行攻击

java自学第3期——继承、多态、接口、抽象类、final关键字、权限修饰符、内部类的更多相关文章

  1. 06 面向对象:多态&抽象类&接口&权限修饰符&内部类

    多态: /* 多态(polymorphic)概述 * 事物存在的多种形态 多态前提 * a:要有继承关系. * b:要有方法重写. * c:要有父类引用指向子类对象. * 成员变量 * 编译看左边(父 ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第6节 权限修饰符_6_四种权限修饰符

    四种权限修饰符.从大到小 纵向再分成四种情况 同一个类 同一个类里面.private方式,可以访问到本类里面的 num成员变量 前面不写修饰符也能访问到 (default)就是不写的这种情况 受保护的 ...

  3. java——final、权限修饰符

    final修饰类:  final修饰成员方法: final修饰局部变量的时候: 对于基本类型来说,变量的数值不能改变 对于引用类型来说,变量的地址不能改变 final修饰成员变量的情况: 权限修饰符:

  4. 对于Java中权限修饰符的理解

    老是把Java中权限修饰符给忘记,写一个博客加深印象吧 权限分为四个作用域:当前类,同一个包,其他包的子类,其他包的类. 首先要知道包的概念,Java中一个包是指一个package下的所有文件. pr ...

  5. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  6. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  7. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  8. Java三大特征:封装 继承 多态

    内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外 ...

  9. lesson 4 再谈继承多态,抽象类和接口

    再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...

随机推荐

  1. svn 启动项目报错,项目被lock

    问题描述 问题解决 (一)Eclipse SVN 插件处理 (二)SVN 客户端处理 (三)删除lock文件 问题描述 在使用开发工具开发项目时(如Eclipse),在做项目的中途,有时候Eclips ...

  2. python中字符串的翻转(方法总结)

    Python翻转字符串(reverse string), 一共包含5种方法, 其中第一种最简单, 即步长为-1, 输出字符串; 方法如下 5种方法的比较: 1. 简单的步长为-1, 即字符串的翻转(常 ...

  3. NodeRED - 全局变量的使用笔记

    NodeRED - 全局变量的使用笔记 global global.get(..) :获取全局范围的上下文属性 global.set(..) :设置全局范围的上下文属性 global.keys(..) ...

  4. Linux lsblk和df命令区别

    lsblk 查看的是block device,也就是逻辑磁盘大小. df查看的是file system, 也就是文件系统层的磁盘大小

  5. Scala集合库、模式匹配和样例类

    package com.yz8 import org.junit.Test class test { @Test def test: Unit = { val ints = List(1,5,7,6, ...

  6. Luogu T7468 I liked Matrix!

    题目链接 题目背景 无 题目描述 在一个n*m 的矩阵A 的所有位置中随机填入0 或1,概率比为x : y.令B[i]=a[i][1]+a[i][2]+......+a[i][m],求min{B[i] ...

  7. Codeforces Round #646 (Div. 2) A. Odd Selection(数学)

    题目链接:https://codeforces.com/contest/1363/problem/A 题意 判断是否能从 $n$ 个数中选 $x$ 个数加起来和为奇数. 题解 首先 $n$ 个数中至少 ...

  8. CodeForces - 1209D 并查集

    题意: 有 n个不同的糖果,从 1到 n编号.有 k个客人.要用糖果招待客人.对于每个客人,这些糖果中恰有两个是其最爱.第 i个客人最爱的糖果编号是 xi和 y.将 k 个客人任意排列,他们按顺序去拿 ...

  9. __getattr__,__getattribute__和__get__的区别

    dir(object)  列出对象的大多数属性 getattr(object, name) 从object对象中获取name字符串指定的属性 hasattr(object, name) 如果objec ...

  10. 牛客编程巅峰赛S1第11场 - 黄金&钻石 A.牛牛的01游戏 (模拟栈)

    题意:有一个\(01\)串,两个相邻的\(0\)可以变成一个\(1\),两个相邻的\(1\)可以直接消除,问操作后的字符串. 题解:数组模拟栈直接撸,上代码吧. 代码: class Solution ...