java笔记

java 不支持多继承,但支持多层继承

比如 鸽子继承鸟类,鸟类继承动物类。

java 不允许在非抽象类中获取抽象方法

换句话说,就是只要类中含有抽象方法,那么这个类就是抽象类。P128

接口

接口是抽象类的延伸

比如图形的draw方法,在图形类内部根本无法在draw内部实现具体的细节,因为图形不通,draw也不同,所以只能把draw方法定义为抽象方法。所以图形类就是抽象类。可以将draw方法封装在一个接口中

而且类在继承父类的同时也可以实现接口。

一旦定义了接口,那么一定是抽象类,而且如果子类一旦继承该接口,就一定在子类中将抽象方法给覆盖掉,否则会报错

格式

类的后面并不跟();方法后面才会有()

java不允许多重继承,但是接口可以多重继承

访问父类 可以使用super.? 类似这种格式

子类方法名与父类相同,则为重写

final修饰方法,则方法不会被重写,若修饰类,则该类不可被继承,final修饰变量,则不可更改变量,总之,被final修饰的对象,一旦被初始化,则不可更改

static修饰被所有对象访问的成员 ,并且不建议使用对象访问static成员,而是使用类来访问。

非静态方法可以访问所有的成员,

静态方法只能访问静态成员。

多态的实现条件

实现方法必须满足以下几个条件:

  1. 继承
  2. 方法重写
  3. 父类引用指向子类

通过多态的形式来访问成员变量,看的是左边,而不是右边。只有左边的类中有的方法,才可以被访问。

编译看左边,运行看右边。

多态(抽象类)

多态的弊端是不能访问子类特有的功能。编译看左边运行看右边

多态中的转型

向下转型,(必须父类引用指向子类对象)

只有左边的类中有的方法,才可以成功运行。 之所以运行在右边,是因为父类的方法被子类重写了。

不同子类之间不可相互强制类型转换。

一个方法若没有方法体,则必须是抽象的。若不是抽象的,则必然有方法体{}

抽象方法必须全部被子类重写。或者子类本身也是一个抽象类。子类要重写抽象类的所有抽象方法。

抽象类可以有构造方法,但是本身不能实例化,参照多态的形式,通过子类对象实例化。并且抽象类的构造方法只用于子类访问父类元素时的初始化。

image-20220318184719886

重点:抽象类的特点

抽象类主要用来抽象类别接口主要用来抽象功能

例如animal 类就是抽象类 但是animal的eat功能应该定义为接口。

  1. 抽象类中的抽象方法只有方法体,没有具体实现;

接口:

接口只能做方法声明,没有构造方法,但是可以有成员变量,默认为final类型。抽象类中可以作方法声明,也可以做方法实现。

接口中的方法必须都是抽象方法,都需要在子类中进行实例化。


接口只是一种形式,接口自身不能做任何事情。接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且**接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。**从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。并且可以通过接口的名字访问接口的成员变量,且成员变量是静态的,在接口的实现类中不能再修改。


stringbuilder:

image-20220318190751494

java.lang 里的stringbuilder才是字符串创建

直接字符串连接和append()方法的区别:

直接连接就是字符串复制,append()则是在尾部添加,效率更高。

如以下代码:


public class Stringbuilder {
    public static void main(String[] args) {
        String s = "";
        long begintime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            s += i;

        }
        long endtime = System.currentTimeMillis();
        long time1 = endtime - begintime;
        StringBuilder builder = new StringBuilder();
        begintime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            builder.append(i);
        }
        endtime = System.currentTimeMillis();
        long time2 = endtime - begintime;
        System.out.println(time1 + "\n " + time2);
    }

}


Object

object是所有类的祖宗

所有的类都直接或者间接的继承object类

抽象类编程是注意:


虽然我们说如果一个类中存在抽象方法,那么这个类就是抽象类,但是在我们编程时,非抽象类中存在抽象类会报错。

父类中有构造函数子类继承时必须定义子类的构造方法吗

image-20220318195617553

实现类继承类的同时,继承接口

接口的对象只能用接口里的方法,抽象类的对象只能用抽象类里面的方法,所以可以让接口的实现类既继承抽象类,同时又实现接口

抽象类和接口的区别

通俗的说,抽象类是对事物的抽象,接口是对行为功能的抽象。

也可以理解为抽象类里面的是属性,接口里面是行为

或者说抽象类是共同的属性,而接口是不共有的一些属性。

抽象类作为形参和返回值

方法的形参是类名,其实需要的是该类的对象;

方法的返回值是类名,其实返回的是该类的对象。(需要在方法内部新建对象,然后对其进行某些操作之后,在return返回!!!)

注意:抽象类在做形参时,由于不能直接创建对象,所以必须先创建一个子类,然后将抽象方法实例化,这是抽象类才可以作为形参

抽象类与接口

接口与抽象类的区别与联系

//Interface.java  接口
package JiekouTEST;

public interface Interface {

    public abstract void jumpping();  //不跟方法体,不能被实例化
}

//Animal.java  抽象类
package JiekouTEST;

public abstract class Animal implements Interface {  //非抽象类中存在抽象类会报错
    String name;
    int age;


    @Override
    public void jumpping() {

    }

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
}

//Cat.java
package JiekouTEST;

public class Cat extends Animal implements Interface{
    //继承抽象类和抽象接口,那么需要重写eat方法和jumping方法
		//父类已有构造方法,无需再次构造。
//    public Cat() {
//    }

//    public Cat(String name, int age) {
//        super(name, age);
//    }
//

    @Override
    public void eat() {
        System.out.print("加菲猫在吃老鼠!!!");
    }

    @Override
    public void jumpping() {
        System.out.print("加菲猫胖胖!!!跳不高!!!");
    }

    public void show(){
        System.out.print(name +" " + age);
    }


}

// 测试类
package JiekouTEST;

public class AnimalDemo  {
    public static void main(String[] args) {
        Cat c = new Cat();
        c.setAge(5);
        c.setName("加菲猫");
        c.eat();
        c.jumpping();
    }
}

接口与抽象类的实现_教练案例

SpeakEnglish.java

package Practice;

public interface SpeakEnglish {

    public void speak();  //默认为抽象方法
}

People.java

package Practice;

public abstract class People {
    private String name;
    private int age;

    public People() {
    }

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
}

Teacher.java

package Practice;

public abstract class Teacher extends People{
    public Teacher() {
    }

    public Teacher(String name, int age) {
        super(name, age);
    }
    //不写getter和setter方法
    public abstract void teach();  //每个教练教的内容也不一样,所以定义为抽象方法
    //        抽象类中可以没有抽象方法;

}

Student.java

package Practice;

public abstract class Student extends People{
    public Student() {
    }

    public Student(String name, int age) {
        super(name, age);
    }


}

TeachBasketball.java

package Practice;

public class TeachBasketball extends Teacher{
    public TeachBasketball() {
    }

    public TeachBasketball(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("我教的是篮球!!!");
    }
    @Override
    public void eat() {
        System.out.println("我是蓝球教练!!!我吃的是比较健康!!!");

    }
}

TeachPingPang.java

package Practice;

public class TeachPingPang extends Teacher implements SpeakEnglish{
    public TeachPingPang() {
    }

    public TeachPingPang(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("我教的是乒乓球!!!");
    }

    @Override
    public void speak() {
        System.out.println("我是乒乓球教练,也要学英语!!!");
    }
    @Override
    public void eat() {
        System.out.println("我是乒乓球教练!!!我吃的是比较健康!!!");

    }
}


StudyBasketball.java

package Practice;

public class StudyBasketball extends Student{
    public StudyBasketball() {
    }

    public StudyBasketball(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("我是篮球训练生!!!我吃的是比较健康!!!");
    }
}

Demo.java

package Practice;

public class Demo {
    public static void main(String[] args) {
        StudyPingPang P1 = new StudyPingPang();
        P1.speak();
        P1.eat();
        P1.setName("zhangsan");
        P1.setAge(20);
        System.out.println(P1.getName() + " " + P1.getAge());
        System.out.println("1---------");
        StudyPingPang P2 = new StudyPingPang("卢旺达", 20);
        P2.speak();
        System.out.println(P1.getName() + " " + P1.getAge());
        System.out.println("2-----------");
        StudyBasketball B1 = new StudyBasketball("lisiyi", 22);
        System.out.println(B1.getName() + " " + B1.getAge());
        System.out.println("3-----------");
        TeachPingPang tp1 = new TeachPingPang("高老头", 54);
        tp1.teach();
        tp1.speak();
        tp1.eat();

        System.out.println("4-----------");
        TeachBasketball tb1 = new TeachBasketball("肖云", 31);
        tb1.teach();
        tb1.eat();

    }
}


本文章使用limfx的vscode插件快速发布