比如 鸽子继承鸟类,鸟类继承动物类。
换句话说,就是只要类中含有抽象方法,那么这个类就是抽象类。P128
接口是抽象类的延伸
比如图形的draw方法,在图形类内部根本无法在draw内部实现具体的细节,因为图形不通,draw也不同,所以只能把draw方法定义为抽象方法。所以图形类就是抽象类。可以将draw方法封装在一个接口中
而且类在继承父类的同时也可以实现接口。
一旦定义了接口,那么一定是抽象类,而且如果子类一旦继承该接口,就一定在子类中将抽象方法给覆盖掉,否则会报错
类的后面并不跟();方法后面才会有()
java不允许多重继承,但是接口可以多重继承
访问父类 可以使用super.? 类似这种格式
子类方法名与父类相同,则为重写
final修饰方法,则方法不会被重写,若修饰类,则该类不可被继承,final修饰变量,则不可更改变量,总之,被final修饰的对象,一旦被初始化,则不可更改
static修饰被所有对象访问的成员 ,并且不建议使用对象访问static成员,而是使用类来访问。
非静态方法可以访问所有的成员,
静态方法只能访问静态成员。
通过多态的形式来访问成员变量,看的是左边,而不是右边。只有左边的类中有的方法,才可以被访问。
编译看左边,运行看右边。
多态的弊端是不能访问子类特有的功能。编译看左边,运行看右边
向下转型,(必须父类引用指向子类对象)
只有左边的类中有的方法,才可以成功运行。 之所以运行在右边,是因为父类的方法被子类重写了。
抽象方法必须全部被子类重写。或者子类本身也是一个抽象类。子类要重写抽象类的所有抽象方法。

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

java.lang 里的stringbuilder才是字符串创建
直接连接就是字符串复制,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类
虽然我们说如果一个类中存在抽象方法,那么这个类就是抽象类,但是在我们编程时,非抽象类中存在抽象类会报错。

接口的对象只能用接口里的方法,抽象类的对象只能用抽象类里面的方法,所以可以让接口的实现类既继承抽象类,同时又实现接口
通俗的说,抽象类是对事物的抽象,接口是对行为功能的抽象。
也可以理解为抽象类里面的是属性,接口里面是行为
或者说抽象类是共同的属性,而接口是不共有的一些属性。
方法的形参是类名,其实需要的是该类的对象;
方法的返回值是类名,其实返回的是该类的对象。(需要在方法内部新建对象,然后对其进行某些操作之后,在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();
}
}
package Practice;
public interface SpeakEnglish {
public void speak(); //默认为抽象方法
}
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();
}
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(); //每个教练教的内容也不一样,所以定义为抽象方法
// 抽象类中可以没有抽象方法;
}
package Practice;
public abstract class Student extends People{
public Student() {
}
public Student(String name, int age) {
super(name, age);
}
}
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("我是蓝球教练!!!我吃的是比较健康!!!");
}
}
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("我是乒乓球教练!!!我吃的是比较健康!!!");
}
}
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("我是篮球训练生!!!我吃的是比较健康!!!");
}
}
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插件快速发布