其他分享
首页 > 其他分享> > Day007

Day007

作者:互联网

继承 extend

满足什么条件的时候可以继承

凡是 采用 “is a ”能描述的,都可以继承

cat is a animal

子类继承父类之后,能使用子类对象来调用父类方法,因为,子类继承父类之后,这个方法就属于子类了。当然可以使用子类对象来调用。

 

object

任何一个类,没有显示继承任何类,默认继承object

源代码

image-20210415151947113

文件夹 src src。zip

Java内置一套庞大的类库。可以基于这套庞大的类库来进行二次开发。

开发速度较快,因为jdk内置的这套库实现了很多基础功能。


image-20210415152507782

system类名
out 静态变量
println 实例方法

editplus中蓝色是关键字。黑色是标识符。

红色表示这个类是sun的jdk写好的一个类。

system out println 都是标识符


object 源码

当源码中一个方法以“;”结尾,并修饰符列表中有native关键字

表示底层调用c++写的dll程序(dll 动态链接库文件)

 

tostring

研究了一下object 中的很多方法,其中有一个tostring方法

如果 System.out.println("引用");

println方法会自动调用引用的tostring()方法。

类名@内存地址经过哈希算法,得出的十六进制结果

 

方法的覆盖

什么时候考虑使用方法覆盖

子类继承父类之后,有些行为可能面临着必须改进。

因为父类中继承过来的方法,已经无法满足子类的业务需求

这个覆盖叫做:方法重写,英语单词 override overwrite、

 

方法重载 overload

功能相似的话,建议将名字定义成一样的这样为了代码美观,并且方便编程。

满足方法重载的条件:

 

方法重写

最好将父类的方法原封不动复制过来。

方法覆盖,就是将继承过来的方法覆盖掉了。继承过来的方法就没了。

 


在代码级别上构成了方法覆盖。

注意事项

经典案例

public class speak {
   public static void main(String[] args) {
       Chinese c1=new Chinese();
       c1.setName("张俊龙");
       American a2=new American();
       a2.setName("jack");
       c1.Speak();
       a2.Speak();

  }
}
class People {
   private String name;
   //构造
    public People(){}
    public People(String name){
        this.name =name;

    }
    //setter and getter
    public void setName(String name)
    {this.name = name;}
    public  String getName(){
        return  this.name;
    }
    public void Speak() {
        System.out.println(name +"正在说");
    }

}
class  Chinese extends People{
   public void Speak(){
       System.out.println( this.getName() + "正在说汉语");
  }
}
class American extends  People{
   public void  Speak(){
       System.out.println( this.getName() +"is speaking english");
  }
}

再研究一下object的toString方法

tostring ()方法的作用的将Java对象转换成字符串的形式

tostring :方法名的意思是转换成string

含义:调用一个Java对象的toString()方法就可以将该Java对象转换成字符串的表示

image-20210415163510429

image-20210415163540124

多态

多态的基础语法

Java中允许向上转型也允许向下转型

向上转型

子——》父(自动类型转换)

向下转型

父——》子(强制类型转换 ,需要加强制类型转换符)

image-20210415164605555

没有继承关系,编译器报错

 

什么是多态

多种形态,多种状态

编译期 叫做静态绑定

运行期 叫做动态绑定

多态的经典代码 :父类型的引用指向子类型的对象(Java中允许这样写)

分析: 先来分析编译阶段:

对于编译器来说,编译器只知道,a2的类型是animal

所以编译器在检查语法的时候,会去animal.class字节码文件中找move方法,找到了,绑定上move()方法,编译通过,静态绑定成功。(编译阶段属于静态绑定)

再来分析运行阶段:

运行阶段的时候,实际上是在堆内存中创建Java对象是cat对象,所以move的时候,真正参与move的对象是一只猫,所以在运行阶段会动态执行cat对象的move方法。这和过程属于运行阶段绑定。

1、父类型的引用允许指向子类型的对象

 

当你访问的 子类特有的方法 才需要强制类型转换

 

没有继承关系的时候,运行时出现异常,这个异常和空指针异常一样非常重要也非常经典

java.lang.ClassscastException:类型转换异常

java.lang.NullPointerException:空指针异常

 

新内容 运算符 instanceof

第一:instanceof可以在运行阶段动态判断引用指向对象的类型

第二:instanceof的语法:

(引用 instanceof 类型)

第三: instanceof 运算符的运算结果只能是 true / false

第四: c是一个引用,c变量保存了内存地址指向了堆中对象

(c instanceof Cat)为true

表示 c引用指向 的堆内存中的Java对象是一个cat

为false 不是一个cat

 

image-20210415172900595

 

多态在开发中的作用(非常重要)

软件开发原则 (这个开发原则属于整个软件业)

其中一条最基本的原则:OCP(开闭原则)

在软件的扩展过程中,修改的越少越好

不仅仅为了实现客户需求,还需要考虑扩展性

 

面向父类型编程 面对抽象编程,不建议面对具体编程

多态在开发中的作用

降低程序的耦合度,提高程序的扩展力

封装 继承 多态

image-20210415174811678

解释之前遗留下来的问题

私有不能覆盖,静态不谈覆盖

一般重写时 直接复制粘贴,可以变小返回值,但意义不大

super

super是一个关键字,全部小写

与this 对比:

public void setName(String name){
   this.name = name;
}

this()只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其他的构造方法,目的是:代码复用

super

super()

先有父再是子。

建议手动将无参构造写出来

无论是怎么折腾 父类的构造方法都会执行

在java语言中 不管是new什么对象,最后老祖宗的object类的无参数构造 方法一定会执行的

(object的无参数构造一定是最先执行的)处于“栈顶部”后进先出最后调用,最先执行,最先结束

注意:一个类的无参数构造还是建议写出来,不然可能会影响后面子类的创建

super的应用

私有的属性,只能在本类中访问、

super 代表的是“当前对象this的父类型特征”

作用

super (实参)的作用是:初始化当前对象的父类型特征

并不是创建新对象,实际上对象只创建一个。

super 关键字代表的就是“当前对象”的那部分父类特征

 

super和this 都不能出现在静态方法中。

java中允许子类中出现和父类中的同名变量

super。 什么时候不能省略

如果父类和子类中有同名属性

父中有,子中又有。如果想在子中访问“父的特征。”super。 不能省。

 

image-20210415194724864

输出“引用”的时候 ,自动调用引用的tostring()方法

image-20210415195107830

 

 

super.属性名【访问父类属性 】

super.方法名 (实参)【访问父类的方法】

super(实参)【调用父类的构造方法】

 

在子类中访问父类私有的数据,你使用super是没有权限的

记住一点 : 私有的只能在本类中访问

 

一些作业题

输入

java.util.Scanner s = new java.util.Scanner(System.in);
while (ture){
   System.out.println("请输入要猜测的数字")
       int caicenum = s.nextInt();
   //java 中输入
}

System.exit(0);
//强行退出jvm

学idea啦啦啦啦啦

进阶了

关于java的集成开发环境

intellij IDEA eclipse

eclipse

workspace ——》project

idea

project ——》 module

IDEA 快捷键

快速生成main方法 psvm

快速生成system.out.println(); sout

ctrl + Y 删除一行

代码上的右键——》run 或者点击左侧的绿色箭头 来运行

不需要保存 自动保存

public class EasyCatulator {
   public static void main(String[] args) {
       Number a =new Number(50,0);
       a.sub();
       a.add();
       a.chufa();
       a.cheng();


  }
}
class Number{
   private int n1,n2;

   public void setN1(int n1) {
       this.n1 = n1;
  }

   public void setN2(int n2) {
       this.n2 = n2;
  }

   public int getN1() {
       return n1;
  }

   public int getN2() {
       return n2;
  }

   public Number(int n1, int n2) {
       this.n1 = n1;
       this.n2 = n2;
  }
   public void  add(){
       int   x=getN1()+getN2() ;
       System.out.println("加起来"+x);

  }
   public  int  sub(){
       System.out.println("减法"+(getN1()-getN2()));
       return (getN1()-getN2());

  }
   public  void cheng(){
       int x = this.n1*this.n2;
       System.out.println("乘法"+x);

  }
   public  void chufa (){
       if(this.n2==0){
           System.out.println("分母不能为0");

      }else {
       double y = this.n1/n2;
           System.out.println("相除的结果是"+y);
  }}
}

 

学完之后多练一练吧,讲真的练的真的太少了

需要多练练,熟悉熟悉软件,以及敲代码

 

public class vehicle {
   public static void main(String[] args) {
      car qq = new car();
      qq.setSize(19029);
      qq.setSpeed(41);
      qq.move();
      qq.speeddown(10);
      qq.move();
      qq.speedup(20);
       qq.move();
  }
}
class chedezhong{
   private int speed;
   private int size;
   public  void move(){
       System.out.println("这个车正在移动");
       System.out.println("现在的速度是"+getSpeed());
  }

   public int getSpeed() {
       return speed;
  }

   public chedezhong() {
  }

   public chedezhong(int speed, int size) {
       this.speed = speed;
       this.size = size;
  }

   public int getSize() {
       return size;
  }

   public void setSize(int size) {
       this.size = size;
  }

   public void setSpeed(int speed) {
       this.speed = speed;


  }
   public  void speedup(int a){
       setSpeed(getSpeed()+a);
  }
   public void speeddown(int a){
       setSpeed(getSpeed()-a);
  }

}
class car extends chedezhong{
   public  void move(){
       System.out.println("小汽车正在乱开");
       System.out.println("现在的速度是"+getSpeed());
  }


}

java SE

final 关键字

final表示最终的最后的,final修饰的类无法被继承

final修饰的方法无法被覆盖,无法被重写

final 修饰的变量,一旦赋值,不能被重新赋值。第一次赋值允许‘只能赋一次值。

image-20210415220956676

 

 

标签:int,super,void,println,Day007,方法,public
来源: https://www.cnblogs.com/geren/p/14664709.html