JAVA基础-Day7-黑马跟课题目-面向对象基础(代码块、抽象类、接口)

2024-03-17 15:30

本文主要是介绍JAVA基础-Day7-黑马跟课题目-面向对象基础(代码块、抽象类、接口),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、代码块

1.final

final
修饰方法:表明该方法是最终方法,不能被重写
修饰类:表明该类是最终类,不能被继承
修饰变量:常量,只能被赋值一次
修饰基本数据类型:记录的值不能发生改变(常量)
修饰引用数据类型:记录的地址值不能发生改变,内部的属性值可以改变

好处:增加代码可读性

private static final String ADD_STUDENR = "1";

2.局部代码块

局部代码块:变量只能在所属大括号内存在,节省空间(常规)

3.构造代码块

构造代码块:{(不用)
1.写在成员位置的代码块
2.作用:可以把多个构造方法中重复的代码块抽取出来
3.执行时机:创建本类对象的时候会先执行构造代码块再执行构造方法
}
形式:{}

public class CodeBlockDemo {  // 构造代码块  {  System.out.println("实例初始化代码块在每次创建对象时执行。");  }  // 构造方法  public CodeBlockDemo() {  System.out.println("这是构造方法。");  }  // 局部代码块  public void display() {  // 方法中的代码块  {  System.out.println("这是方法中的代码块。");  }  System.out.println("这是方法中的其他代码。");  }  public static void main(String[] args) {  // 创建对象  CodeBlockDemo demo = new CodeBlockDemo();  // 调用方法  demo.display();  }  
}

4.静态代码块

 静态代码块:(重点)
随着类的加载而加载,并且自动触发,只执行一次
使用场景:类加载,数据初始化

如果想要做数据初始化,就用静态代码块
例如:学生管理系统的信息录入

import java.util.*;class User
{String name;String id;int age;public User(String name,String id,int age){this.name=name;this.id=id;this.age=age;}
}
public class App {//静态代码块录入信息,更安全,不会被反复调用static ArrayList<User> list=new ArrayList<>();static{list.add(new User("张三","123",12));}public static void main(String[] args) {Scanner in=new Scanner(System.in);}
}
//public class App{
//    public static void main(String[] args) {
//        Scanner in=new Scanner(System.in);
//        ArrayList<User> list=new ArrayList<>();
//        list.add(new User("张三","123",12));
//
//    }
//}

二、抽象类

概念

使用场景:

1.父类不能确定具体的方法体,子类可能会出现很多用法

例如:

//class Person{
//    public void Eat()
//    {
//    }
//}
abstract class Person{public abstract void Eat();
}
class Student extends Person{@Overridepublic void Eat(){System.out.println("吃米饭");}
}
class Teacher extends Person{@Overridepublic void Eat(){System.out.println("吃面条");}
}
public class Main{public static void main(String[] args) {Student a=new Student();Teacher b=new Teacher();a.Eat();b.Eat();}
}

为防止空的父类被调用,使其变为abstract抽象类
2.子类必须重写抽象方法

使用注意:

1.抽象类不能实例化
2.抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
3.可以有构造方法
4.抽象类的子类
        要么重写抽象类中的所有抽象方法,
        要么是抽象类

构造方法:创建子类对象的时候,给属性进行赋值

抽取共性的意义:统一所有子类的相关方法的名称和调用方法
方便查看,方便调用,方便修改

三、接口 

1.概念

接口的使用:

一个方法类(interface)implements
子类无法继承父类的某个或多个方法
比如:动物类里的“游泳”方法,只有兔子不会游泳,其它动物子类自定义游泳太麻烦

接口中成员的特点:

接口中成员的特点:
1.成员变量:1、只能是常量  2. 默认修饰符:public static final
2.构造方法:没有
3.成员方法:1、只能是抽象方法 2、默认修饰符:public abstract

面向对象各种关系: 

类和类的关系:
继承关系,只能单继承,但可以多层继承


类和接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口


接口和接口的关系:
继承关系,可以单继承,也可以多继承(实现类实现了最底层的子接口,就必须重写接口体系里所有的抽象方法)

 接口与抽象类的不同:

抽象类是对象类的抽象,可以有构造方法

接口是对行为的规则定义,不可以有可变成员变量(有也只能定义常量)

 jdk8,jdk9新方法:

1.default关键字(默认方法)

jdk8 默认方法:default ...
1.默认方法不是抽象方法,不会强制重写,若重写,去掉default关键字
2.public可省略 default不可省略
3.如果实现了多个接口,多个接口中有相同名字的默认方法,子类必须 对该方法进行重写
(在接口升级之后,原子类接口不需要实现接口里的新方法,但也可以实现,(兼容性))

2.static关键字(静态方法)

jdk8 静态方法:static
1.静态方法只能用接口名引用
2.静态方法不能被重写

3. private关键字(私有方法)

jdk9 私有方法:private
1.适用于接口里的默认方法
2.static private 适用于接口里的静态方法

4.接口多态

接口类型 j = new 实现类对象()
理解:谁实现了接口j 谁就是接口j的儿子,接口j相当于实现类的父类
可以调用所有实现类对象的方法

当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态
这么理解吧:我现在想要实现一个搬家的方法:传递的参数是一个可以帮我搬家的工具:比如搬家公司,或者一辆汽车,或者一个人 但是这些东西我没办法找到一个统一的可以替代的东西当作参数传入,
所以我定义一个 叫做“运输”的接口 ,将这个接口传入,  然后呢 我可以让 人,汽车,搬家公司这些东西都作为这个接口的实现类,这样他们就具有了搬家这一功能,而且我可以将 他们作为参数传入

5.适配器

创建一个抽象类,实现接口的所有方法

原理:接口中所有抽象方法都必须被全部实现,但抽象类里的默认方法不需要被全部实现

定义一个中间类,当作中转站,其它类继承抽象类,需要用哪个方法,就重写哪个方法

2.动物会游泳(但不全会)

A.动物类(父类)

public abstract class Animal{private String name;private int age;public Animal(String name,int age){this.name=name;this.age=age;}public abstract void eat();public void drink(){System.out.println(this.name+"正在喝水");}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;}
}

 B.青蛙类(会游泳)

class Frog extends Animal implements Swim{public Frog(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(this.getName()+"正在吃虫子");}@Overridepublic void swim(){System.out.println(this.getName()+"正在蛙泳");}
}

C.狗类(会游泳) 

class Dog extends Animal implements Swim{public Dog(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(this.getName()+"正在吃骨头");}@Overridepublic void swim(){System.out.println(this.getName()+"正在狗刨");}
}

D.羊类(不会游泳) 

class Sheep extends Animal{public Sheep(String name,int age){super(name,age);}@Overridepublic void eat(){System.out.println(this.getName()+"正在吃草");}
}

E.主函数 

public class Main {public static void main(String[] args) {Frog a=new Frog("小青蛙",40);Dog b=new Dog("大黄",20);Sheep c=new Sheep("喜羊羊",10);a.eat();b.eat();c.eat();a.drink();a.swim();b.swim();}
}

F.接口

public interface Swim {public void swim();
}

 3.运动队

概述:

A.人员类

public abstract class Person {String name;int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Person{name = " + name + ", age = " + age + "}";}
}

B.乒乓人员

public abstract class PingPongPerson extends Person{public PingPongPerson(String name,int age){super(name,age);}public void SpeakE(){System.out.println(this.getName()+"说英语");}}

C.篮球人员

public abstract class BasketballPerson extends Person {public BasketballPerson(String name,int age){super(name,age);}}

D.接口:教

public interface Teach{void teach();
}

E.接口:学

public interface Learn{void learn();
}

F.乒乓运动员

class PpAthlete extends PingPongPerson implements Learn{
public PpAthlete(String name,int age){super(name,age);}@Overridepublic void learn(){System.out.println(this.getName()+"学乒乓");}}

G.乒乓教练

class PpCoach extends PingPongPerson implements Teach{public PpCoach(String name,int age){super(name,age);}@Overridepublic void teach() {System.out.println(this.getName()+"教乒乓");}
}

H.篮球运动员

class BbAthlete extends BasketballPerson implements Learn{public BbAthlete (String name,int age){super(name, age);}@Overridepublic void learn() {System.out.println(this.getName()+"学篮球");}
}

I.篮球教练

class BbCoach extends BasketballPerson implements Teach{public BbCoach(String name,int age){super(name,age);}@Overridepublic void teach() {System.out.println(this.getName()+"教篮球");}
}

J.主函数

public class Main {public static void main(String[] args) {PpAthlete a=new PpAthlete("张继科",21);PpCoach b=new PpCoach("刘国梁",50);BbAthlete c=new BbAthlete("姚明",30);BbCoach d=new BbCoach("篮球教练",50);a.learn();a.SpeakE();b.teach();b.SpeakE();c.learn();d.teach();}
}

这篇关于JAVA基础-Day7-黑马跟课题目-面向对象基础(代码块、抽象类、接口)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819345

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来