java学习day012

一.抽象

1.1 概述

        抽象:往往用来表示设计中得出的抽象概念,一般不会有具体的实体表示 ​ 比如动物,他只是一个抽象的概念,并没有一个具体的东西叫动物 ​ 所以动物就不能代表一个具体的实体,就意味着,动物类,是不能创建对象的 ​ 所以此时动物类,应该定义为抽象类

1.2 怎么用

使用abstract修饰符对类或者方法进行抽象

//动物类
abstract class Animal {
    //动物吃东西的功能
    public abstract void eat();
    public void m1(){
}
//猫
class Cat extends Animal {
    Cat(){
        super();
    }
    @Override
    public void eat() {
        System.outprintln("猫吃鱼");
    }
}

1.3 注意

1.修饰类为抽象类,并且抽象类不能创建对象,但是依然有构造方法,用于子类创建对象时调用(super()); ​
2.修饰的方法为抽象方法,抽象方法没有{方法体},用于被子类实现.(本质上是在子类中对父类进行方法覆写) ​
3.抽象方法,必须在抽象类,而抽象类中不一定有抽象方法 ​
4.final 和 abstract 不能同时修饰 ​ 因为final表示最终,不可修改,修饰的类不能被继承,修饰的成员方法不能被覆写 ​ 而abstract表示抽象的,抽象类和抽象方法,就是用于被继承.被子类实现覆写的 ​
5.普通类有的抽象类都有而且抽象类中还用于抽象方法

二.接口

2.1 概述

面向接口编程

接口是解决java中单继承导致功能变弱问题 ​ 一个类只能继承一个类,但是可以实现多个接口 ​ 使用接口,也是可以发生多态的

2.2 优点

和多态的优点一样,降低耦合度

2.3 怎么用

接口中没有变量,只有常量 public Static final,并且 psf可以省略 ​
 由此定义类的关键字由class变为interface ​
 1.8之前,接口中没有其他方法,只有抽象方法和常量 ​
 1.8以后,接口中可以重新default方法(类似成员方法,用来给子类使用)和静态方法

interface A{
    //常量
    public static final int a = 2;
    //psf可以省略
    int b = 3;
    //抽象方法
    public abstract void m1();
    //public abstract 可以省略
    void m2();
    // 通过 接口名.静态方法()调用
    public static void m3(){
        System.out.println("静态方法");
    }
    // 可以等同看做成员方法
    // 通过子实现类对象调用
    default void m4(){
        System.out.println("默认方法");
    }
}
​
interface B(){    
}
​
interface C extends A,B{
}
​
//一个类实现接口后,需要实现所有的抽象方法
class D extends Object implements A,B{
    D(){
        super();
    }
    @Override
    public void m1(){        
    }
    
    @Override
    public void m2(){        
    }
    
}
​
//一个抽象类实现接口后,可以实现0~n个方法
abstract class E implements A,B{
    
}
​
public static void main(String[] args){
    //子实现类对象
    D d = new D();
    //默认方法
    d.m4();
    //接口静态方法
    A.m3();
    //接口中常量
    System.out.println(A,a)
}

2.4 注意

接口可以看做是特殊的抽象类.完全抽象

接口不能创建对象,没有构造方法,(注意抽象类可以创建构造方法)

一个类实现接口后需要实现所有的抽象方法(方法可以为空但不能没有)

一个抽象类实现接口后,可以实现0~n个方法(抽象类内可以不覆写接口内的方法)

类和类 单继承 extends 类和接口 多实现 implements(多个逗号隔开) 接口和接口之间 多继承(多个逗号隔开) 继承和实现可以同时存在,先继承,后存在

2.5 接口和抽象类的区别

       如果某个功能通过抽象类和接口都能完成,优先使用接口 ​
        1.因为类和类是单继承,而类和接口是多实现 ​
        2.我们使用接口的话,会保留类继承,扩展性更强

三.object

java提供的根类,所有类都直接或者间接继承Object

3.1 toString

返回这个对象的字符串表现形式,当输出一个引用类型的时候,会自动调用该方法的toString方法 ​ 默认的toString方法是打印 : 包名.类名@十六进制值

interface A{
    //常量
    public static final int a = 2;
    //psf可以省略
    int b = 3;
    //抽象方法
    public abstract void m1();
    //public abstract 可以省略
    void m2();
    // 通过 接口名.静态方法()调用
    public static void m3(){
        System.out.println("静态方法");
    }
    // 可以等同看做成员方法
    // 通过子实现类对象调用
    default void m4(){
        System.out.println("默认方法");
    }
}
​
interface B(){    
}
​
interface C extends A,B{
}
​
//一个类实现接口后,需要实现所有的抽象方法
class D extends Object implements A,B{
    D(){
        super();
    }
    @Override
    public void m1(){        
    }
    
    @Override
    public void m2(){        
    }
    
}
​
//一个抽象类实现接口后,可以实现0~n个方法
abstract class E implements A,B{
    
}
​
public static void main(String[] args){
    //子实现类对象
    D d = new D();
    //默认方法
    d.m4();
    //接口静态方法
    A.m3();
    //接口中常量
    System.out.println(A,a)
}

3.2 Equals

equals用于比较两个对象是否相同,默认比较内存地址(需要根据需求重写)(String类型已经覆写了equals方法,比较的是值)

"==" : 比较基本类型的时候,比较的是值的大小,而比较引用类型的时候,只能比较内存地址是否相同

String比较要用equals

class Student{
    private int id;
    private String name;
    public Student(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
//需求:lD和name都相同,就认为相同
    @Override
    public boolean equals(Object obj){
    //1 先比较是不是同一个对象
    if (this == obj){
        return true;
    }
    //2判断是否同类,不同类不具备可比性
    if (obj instanceof Student) {
        //向下转型,多态丢失子类特有属性Student s = (Student) obj;
        if (this.id == s.id && this.name.equals(s.name)) {
            return true;
        }
    }
return false;

3.3 Finalize

垃圾 : 没有任何引用指向它的时候,该对象被视为垃圾数据

finalze方法,是当垃圾被回收之前,jvm会自动调用该对象的finalize方法,由于finalize方法是回收的时候执行,并且只执行一次,所以适合做关闭资源等收尾工作 finalize方法是jvm自动调用,该方法并没有回收垃圾的功能,如果我们手动调用,也只是单纯的方法调用而已

public class Finalize_01 {
public static void main(String[] args){
    //创建一个垃圾
    for (int i = 0; i < 10000000; i++){
        new User();
    }
    //程序员可以建议JVM回收垃圾
    // System.gc();
    }
}
​
class User {
    @Override
    public void finalize(){
        System.outprintln(this +"我要被回收了");}
    }
}
​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值