Java学习笔记(三):抽象类
创始人
2024-02-07 05:49:52
0

Java学习笔记(三):抽象类和接口

  • 一、类变量和类方法
  • 二、main方法语法
  • 三、代码块
  • 四、单例设计
  • 五、final关键字
  • 六、抽象类
  • 七、接口

一、类变量和类方法

在创建对象的时候,会在堆中创建一个class对象,static变量是同一个类所有对象共享。

类变量是该类的所有对象共享的,而实例变量是每个对象独享的。

类变量可以通过类名.类变量名 对象名.类变量名来访问。

类方法的调用类名.类方法名 对象名.类方法名类方法中无this参数,普通方法中隐含着this参数。

  • 类方法中只能访问静态变量和静态方法;普通成员方法既可以访问非静态成员,也可以访问静态方法。(遵守访问权限)

二、main方法语法

public static void main(String[] args){}

jvm需要调用类的main()方法,所以该方法访问权限必须是public,执行时不必创建对象,所以为static

  • 该方法接收String类型的数组参数,该数组中保存执行Java命令时所传递给所运行的类的参数。

  • 在main()方法中,可以直接调用main方法所在类的静态方法和静态属性

  • 不能直接访问该类中的非静态成员,必须创建该类的一个实例对象之后,才可以通过这个对象去访问类中的非静态成员。

三、代码块

把相同的语句都都放入到一个代码块之中,不管调用哪个构造器,创建对象,都会先调用代码块的内容。

static代码块的作用是对类进行初始化,随着类的加载而执行,并且只会执行一次;普通代码块每创建一个对象就执行一次。

  • 创建对象实例时
  • 创建子类对象实例,父类也会被加载
  • 使用类的静态成员时(静态属性、静态方法)

在创建一个类时,先调用静态代码块和静态属性初始化,按定义的顺序调用。再调用普通代码块和普通属性的初始化,按定义的顺序调用。再调用构造方法(构造器)

构造器的最前面隐含了super()和调用普通代码块。

public class test {public static void main(String[] args) {Base base = new Base();System.out.println("---------------");Base base1 = new Base();System.out.println("---------------");Base base2 = new Base();}
}class Base{{System.out.println("11111");System.out.println("22222");}static {System.out.println("000000");}public Base() {System.out.println("33333");}
}000000
11111
22222
33333
---------------
11111
22222
33333
---------------
11111
22222
33333

在创建一个子类时(继承关系),调用顺序:

  1. 父类的静态属性和静态代码块
  2. 子类的静态属性和静态代码块
  3. 父类的普通代码块和普通属性初始化
  4. 父类的构造方法
  5. 子类的普通代码块和普通属性初始化
  6. 子类的构造方法

静态代码块只能调用静态成员,普通代码块可以调用任意成员

四、单例设计

在整个软件系统中,对于某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

  • 构造器私有化
  • 类的内部创建对象
  • 向外暴露一个静态的公共方法
package single;public class singleTon01 {public static void main(String[] args) {S instance = S.getInstance();S instance1 = S.getInstance();System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class S{private String name;private S(String name) {this.name = name;}private static S s = new S("single");public static S getInstance(){return s;}
}381259350
381259350
  • 构造器私有化
  • 定义一个static静态属性对象
  • 提供一个public的static方法,返回一个类的对象
package single;public class singleTon02 {public static void main(String[] args) {SS instance = SS.getInstance();System.out.println(instance);}
}class SS{private String name;private SS(String name) {this.name = name;}private static SS s;public static SS getInstance(){if (s == null){s = new SS("single");}return s;}
}

一个是在类加载时就创建了对象实例(浪费资源的可能),而另一个是在使用时才创建(存在线程安全问题)

//java.lang.Runtime
public class Runtime {private static final Runtime currentRuntime = new Runtime();private static Version version;/*** Returns the runtime object associated with the current Java application.* Most of the methods of class {@code Runtime} are instance* methods and must be invoked with respect to the current runtime object.** @return  the {@code Runtime} object associated with the current*          Java application.*/public static Runtime getRuntime() {return currentRuntime;}/** Don't let anyone else instantiate this class */private Runtime() {}

五、final关键字

修饰类、属性、方法和局部变量

  • 不希望类被继承
  • 不希望父类的某个方法被子类覆盖
  • 不希望类的某个属性的值被修改
  • 不希望某个局部变量被修改
class A{public final int i = 10;public final void hi() {}
}final class B extends A{@Overridepublic void hi() {//无法重写父类中的方法super.hi();}
}
  • final修饰的属性又称为常量,在定义时必须赋初值并且之后不能再修改(赋值在定义时,在构造器中,在代码块中)。

  • 如果修饰的属性是static的,只能在定义时和代码块中赋值

  • final不能继承,但是可以实例化对象。

  • final不能修饰构造器。

  • final和static搭配使用效率更高。

final class B extends A{public final String name = "YYYY";{name = "YYYY";}public B(String name) {this.name = name;}
}
final class B extends A{public static final String name;static {name = "YYYY";}
}

六、抽象类

父类的某些方法,需要声明但是又不确定如何实现,可以将其声明为抽象方法,这个类称为抽象类。(没有方法体的方法)

当一个类中存在抽象方法时,需要将该类声明为抽象类。

abstract class A{public abstract void fun();
}
  • 抽象类不能制造对象,但是可以有任意成员(非抽象方法,构造器,静态属性等)

  • 继承自抽象类的子类必须覆盖父类中的抽象函数(实现所有抽象方法),否则自己成为抽象类。

  • 两种抽象:与具体相对,表示一种概念而非实体;与细节相对,表示在一定程度上忽略细节而着眼大局。

package Abstract;public class abstract02 {public static void main(String[] args) {B b = new B();b.calculateTime();}
}abstract class A {public abstract void job1();public void calculateTime(){long start = System.currentTimeMillis();job1();long end = System.currentTimeMillis();System.out.println(end - start);}
}class B extends A {public void job1() {int num = 0;for (int i = 1; i < 1000000; i++) {num *= i;}}
}

七、接口

给出一些没有实现的方法,封装到一起,到某个类要使用的时候再根据具体情况把这些方法写出来。

接口是纯抽象类,所有的成员函数都是抽象函数,所有的成员变量都是public static final。

在jdk8.0之后,接口中可以有方法的具体实现(使用default关键字修饰或者静态方法)

  • 接口中所有的方法都是public方法,接口中的抽象方法可以不用abstract修饰

  • 普通类实现接口,就必须将该接口的所有方法都实现,抽象类实现接口可以不用。

  • 一个类可以实现多个接口,接口中属性的访问形式接口名.属性名

  • 类可以实现很多接口,接口可以继承接口但是不能继承类.

  • interface A extends B,C{}

package interface01;public interface interface01 {//修饰符 interface 接口名,修饰符只能是public和默认public void start();//属性、方法public void stop();default public void fun(){System.out.println("ok");}public static void fun1(){System.out.println("okk");}}
package interface01;public class int01 implements interface01{//修饰符 class 类名 implements 接口@Overridepublic void start() {//实现接口的抽象方法System.out.println("01Strart");}@Overridepublic void stop() {System.out.println("01Stop");}
}
package interface01;public class int03 {public void work(interface01 interface01){interface01.start();interface01.stop();}
}
package interface01;public class test {public static void main(String[] args) {int01 int01 = new int01();int03 int03 = new int03();int03.work(int01);}
}

面向接口的编程方式: 先定义接口再实现类,任何需要在函数间传入传出的一定是接口而不是具体的类。(代码量膨胀很快)

实现接口与继承类: 实现接口是对java单继承机制的补充,继承用于解决代码的复用性和可维护性,接口在于设计各种规范让其他类去具体实现这些方法。接口比继承更加灵活,只需满足like-a的关系。

接口类型的变量可以指向实现了该接口的类的对象实例。接口类型 名称 = new 实现了接口的类();

接口多态传递: 如果一个接口1继承了接口2,而一个类实现了接口1,实际上这个类也实现了接口2。

要明确指定的属性,访问接口就使用接口名.属性名访问父类的属性就使用super.属性名

package interface02;interface A{int x = 1;
}class B{int x = 1;
}public class C extends B implements A{public void Px(){System.out.println(super.x);System.out.println(A.x);}public static void main(String[] args) {new C().Px();}
}

相关内容

热门资讯

铜陵有色:预计铜需求具有长期增... 格隆汇5月13日|铜陵有色昨日在业绩说明会上表示,公司预计行业未来发展趋势如下:(一)预计铜需求具有...
携手打造人类命运共同体的“中拉...   在中拉论坛正式启动10周年之际,中央广播电视总台CGTN携手秘鲁圣马丁·德波雷斯大学、拉美中国政...
凯发电气等成立新公司 含物联网... 人民财讯5月13日电,企查查APP显示,近日,天津凯育智航科技有限公司成立,法定代表人为王传启,注册...
中国选手郑钦文晋级WTA100... 中新社北京5月13日电 在当地时间12日举行的女子网球选手协会(WTA)1000罗马站单打第四轮比拼...
小米SU7 Ultra车主集体... 转自:今晚报       近日,小米SU7 Ultra车主集体要求退车一事在社交平台引发广泛热议。部...
5月13日兰格唐山钢市午间播报 5月13日兰格唐山钢市午间播报   5月13日唐山迁安普...
竞逐低空!这款“四川造”通用飞... 四川在线记者 高杲乘坐小飞机,从另一种视角领略壮美山河,是未来旅游的新玩法。5月13日,四川省低空经...
速看!广东2025高考安排出炉... 转自:江门发布近日省教育考试院发布了《关于做好广东省2025年普通高校招生工作的通知》对今年高校招生...
中国资产价格上扬 市场信心大提... 转自:经济日报5月12日,中国资产价格迎来强劲上扬,A股与港股市场均呈现火热景象,投资者情绪高涨,市...
昌飞举办“中国梦 航空梦”航空... 本报讯 4月30日,中国航空工业集团昌飞走进景德镇市湘湖中心小学举办“中国梦 航空梦”航空科普进校园...
命运与共好伙伴 | 汉语教育之... 来源:人民网-国际频道 柬埔寨王家研究院孔子学院成立于2009年12月22日,是柬埔寨最早成立的孔子...
“云冈六美人”闭门谢客 云... 中新社山西大同5月13日电 (记者 胡健)记者13日从云冈研究院获悉,从即日起至今年9月30日,云冈...
300ETF(159300)涨... 5月13日,截止午间收盘,300ETF(159300)涨0.00%,报3.993元,成交额4424....
悬赏奖励升级!出逃40天!“嫌... 来源:新闻晨报 5月11日,扬州市茱萸湾风景区管理处发布“悬赏公告”,称园内的一只卡皮巴拉豆包出逃4...
印度拟采取反制举措 对美国部分...   印度向世界贸易组织(WTO)表示,印度拟对美国生产并出口至印度的部分产品征收关税,以对抗美国对印...
恒大,再起波澜!申请撤销子公司... 清盘中的中国恒大动作不断。5月12日晚间,中国恒大发布有关其附属公司CEG Holdings(简称“...
科创机械ETF(588850)... 5月13日,截止午间收盘,科创机械ETF(588850)跌1.03%,报1.055元,成交额327....
中航发布翼龙-2系列长航时无人... 四川在线记者 李欣忆5月13日,四川省低空经济产业链协同发展暨产品发布会现场,中航无人机公司发布翼龙...
软件50ETF(159590)... 5月13日,截止午间收盘,软件50ETF(159590)跌0.76%,报1.049元,成交额1332...
午评:指数早盘高开低走 军工板... .ct_hqimg {margin: 10px 0;} .hqimg_wrapper {text-a...