===========================================================================
abstract关键字可以用来修饰:类,方法。
abstract关键字:修饰类(抽象类)
-
abstract声明的类不能被实例化(不能创建对象)。
-
抽象类中一定有构造器!虽然自己不能定义对象了,但是子类还是要用的!!!
-
开发中,一定提供抽象类的子类,让子类对象实例化,完成相关操作。
abstract关键字:修饰方法(抽象方法)
-
抽象方法只有方法的声明,没有方法体!!
-
包含抽象方法的类,一定是一个抽象类。反之,抽象类中是可以没有抽象方法。
-
当然,如果父类是抽象类里面还有抽象方法,这样子类要么重写这个抽象方法,要么将子类也定义为abstract抽象类。
package com.itholmes.p2;
public class AbstractTest {
public static void main(String[] args) {
//因为抽象类是不能实例化的
// PersonX p1 = new PersonX();
// p1.eat();
}
}
abstract class PersonX {
String name;
int age;
public PersonX() {
}
public PersonX(String name,int age) {
this.name = name;
this.age = age;
}
public abstract void eat();
public void walk() {
System.out.println(“人们走路”);
}
}
//要么将该类定义为抽象类(因为父类含有抽象类)
abstract class Student extends PersonX{
public Student(String name,int age) {
super(name,age);
}
//要么重写eat()类
// @Override
// public void eat() {
// System.out.println(“学生吃饭”);
// }
}
abstract的注意事项:
-
abstract不能用来修饰:属性,构造器等结构。
-
abstract不能用来修饰私有方法(private不能被重写),静态方法(子父类的同名同参数的静态方法,不能重写!),final的方法和类。
====================================================================
对于abstract声明的类,不能创建对象,但是可以创建一个匿名类的对象。
package com.itholmes.p2;
public class AbstractTest {
public static void main(String[] args) {
//这就是一个匿名的子类对象:p
PersonX p = new PersonX() {
@Override
public void eat() {
System.out.println(“匿名类创建”);
}
};
}
}
abstract class PersonX {
String name;
int age;
public PersonX() {
}
public PersonX(String name,int age) {
this.name = name;
this.age = age;
}
public abstract void eat();
public void walk() {
System.out.println(“人们走路”);
}
}
=========================================================================
其实整体上,就是通过继承外加abstract抽象方法,来实现一种模板方式。
就像下面代码的code()部分一样。
package com.itholmes.p2;
public class TemplateTest {
public static void main(String[] args) {
Template tem = new SubTemplate();
tem.spendTime();
}
}
abstract class Template{
public void spendTime() {
long start = System.currentTimeMillis();
//这里的code代码就是不确定的部分。
this.code(); //this指的就是当前对象,这里指的就是tem,tem.code()是重写后的code方法。
long end = System.currentTimeMillis();
System.out.println(“花费的时间为:”+ (end - start));
}
public abstract void code();
}
class SubTemplate extends Template{
@Override
public void code() {
for(int i=2;i<=1000;i++) {
boolean isFlag = true;
for(int j=2;j<=Math.sqrt(i);j++) {
if(i%j ==0) {
isFlag = false;
break;
}
}
if(isFlag) {
System.out.println(i);
}
}
}
}
===================================================================
接口和类是两个并列的结构。
JDK7 以前版本仅仅定义了全局常量和抽象方法:
-
全局常量:public static final的类型,可以省略不写。
-
抽象方法:public abstract的类型,也可以省略不写。
JDK8除了定义全局常量和抽象方法,还定义了静态方法,默认方法。
-
接口不能定义构造器。意味着接口不能实例化。
-
Java开发中,接口通过让类去实现(implements)的方法来使用。
-
需要注意的是,如果实现类对应接口有抽象方法,就要对应对抽象方法的重写或将实现类定义为抽象方法。
-
可以implements多个接口,弥补了Java单继承性的局限性。
格式:class 类名 extends 父类 implements 接口1,接口2,接口3
-
接口和接口之间是可以继承的,多继承。
-
接口具有多态性,因此,实现类可以对应接口创建对象。
===========================================================================
主要四种情况:
package com.itholmes.p2;
public class USBTest {
public static void main(String[] args) {
Computer com = new Computer();
//1.创建了接口的非匿名实现类的非匿名对象
Flash flash = new Flash();
com.transferDate(flash);
//2.创建了接口的非匿名实现类的匿名对象
com.transferDate(new Printer());
//3.创建了接口的匿名实现类的非匿名对象
USB phone = new USB() {
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println(“手机开始工作”);
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println(“手机结束工作”);
}
};
com.transferDate(phone);
//4. 创建了接口的匿名实现类的匿名对象
com.transferDate(new USB() {
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println(“MP4开始工作”);
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println(“MP4结束工作”);
}
});
}
}
class Computer{
public void transferDate(USB usb) {
usb.start();
System.out.println(“具体传输数据的细节”);
usb.stop();
}
}
interface USB{
void start();
void stop();
}
class Flash implements USB{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println(“U盘开始工作”);
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println(“U盘结束工作”);
}
}
class Printer implements USB{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println(“打印机开始工作”);
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println(“打印机结束工作”);
}
}
==================================================================================
代理模式,就是为其它对象提供一种代理以控制对这个对象的访问。 理解好,代理类和非代理类就可以了。
package com.itholmes.p2;
public class NetWorkTest {
public static void main(String[] args) {
Server server = new Server();
new ProxyServer(server);
}
}
interface NetWork{
public void browse();
}
//被代理类
class Server implements NetWork{
@Override
public void browse() {
// TODO Auto-generated method stub
System.out.println(“真实的服务器访问网络”);
}
}
//代理类
class ProxyServer implements NetWork{
private NetWork work;
public ProxyServer(NetWork work) {
this.work = work;
}
public void check() {
System.out.println(“联网之前的检查工作”);
}
@Override
public void browse() {
check();
// TODO Auto-generated method stub
work.browse();
}
}
===========================================================================
工厂模式:实现创建者与调用者的分离,即将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
就是实现分工的一个效果。
需要注意xxxFactory这个类,一般都是什么工厂,就是一个工厂类,用来造东西的。
简单工厂模式:
工厂方法模式:
抽象工厂模式:
=======================================================================
继承和接口同时出现相同变量的问题:
首先,上面的play()方法,虽然有两个play(),但是重写的play()覆盖了接口上面的两个,是没有问题的!
有问题的是:Ball定义在了接口,接口是public abstract final的!!!因此不能被重新赋值!
============================================================================
接口的静态方法:
- 接口种定义的静态方法只能通过接口来调用。而不能通过实现类来调用。
接口的默认方法:
-
通过实现类的对象,可以调用接口中的默认方法。
-
默认方法可以被重写的。
-
如果子类继承的父类和实现的接口声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。(这就是一个类优先原则)
接口默认方法的接口冲突:
如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类没有重写此方法的情况下会报错!
解决办法:很简单就是重写方法就可以了。
=====================================================================
Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类。
内部类有两种:
-
成员内部类:直接定义在类里面,方法外,构造器外,代码块外的类。
-
局部内部类:方法内,代码块内,构造器内的类。
成员内部类可以做的事情:
创建非静态成员内部类和创建静态成员的内部类形式:
package com.itholmes.p3;
public class InnerClassTest {
//创建PersonX实例(静态的成员内部类)
//静态内部类可以直接定义
Person.PersonX x = new Person.PersonX();
//创建PersonY实例(非静态的成员内部类)
//但是非静态内部类不可以直接定义,因为它必须有一个对象来调用这个内部类才可以
//Person.PersonY y = new Person.PersonY();
Person p = new Person();
Person.PersonY y = p.new PersonY();
}
class Person {
//静态成员内部类
static class PersonX{
}
//非静态成员内部类
class PersonY{
}
public void method() {
//局部内部类(方法内部)
class AA{
}
}
{
//局部内部类(代码块内)
class BB{
}
}
public Person() {
//局部内部类(构造器内部)
class CC{
}
}
}
如何调用外部类,内部类,甚至形参的一些同名属性:
就是使用this和类名.this来调用。
返回一个实现Comparable接口的类的对象的方法:
//方式一:
//返回一个实现Comparable接口的类的对象的方法:
public Comparable getComparable() {
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
return new MyComparable();
}
//方式二:(匿名)
public Comparable getComparable() {
return new Comparable() {
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
};
}
抽象类和接口的共同点和区别:
在局部内部类的方法中,如果调用局部内部类所声明的方法中的局部变量的话,要求此局部变量必须声明final的(JDK8版本以上,默认就是final!),这就是一个规定。
package com.itholmes.p3;
public class InnerClassTest {
public void method() {
//方法内部的局部变量
int num = 10;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
最后
文章到这里就结束了,如果觉得对你有帮助可以点个赞哦
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
ublic int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
};
}
抽象类和接口的共同点和区别:
在局部内部类的方法中,如果调用局部内部类所声明的方法中的局部变量的话,要求此局部变量必须声明final的(JDK8版本以上,默认就是final!),这就是一个规定。
package com.itholmes.p3;
public class InnerClassTest {
public void method() {
//方法内部的局部变量
int num = 10;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-Kt8L4gb6-1710598621485)]
[外链图片转存中…(img-DuZhfq0g-1710598621485)]
[外链图片转存中…(img-A5SJKEz7-1710598621486)]
[外链图片转存中…(img-5wh0S8gs-1710598621486)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-1nuMh2NR-1710598621487)]
最后
文章到这里就结束了,如果觉得对你有帮助可以点个赞哦
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
[外链图片转存中…(img-adF5Tncs-1710598621487)]