Java基础——面向对象

1.抽象Abstract:抽象类和抽象方法;

抽象类:不完整的类,就是抽象类:abstract class 类名;

抽象方法:只有声明,没有实现的方法;

abstract 返回值类型 方法名(参数);

因为类不完整,所以无法直接构建对象;抽象类无法直接构建对象,但是可以通过子类间接构建对象;

如果一个类中含有抽象方法,那么这个类是抽象类;

如果一个类是抽象类,他的方法不一定是抽象方法;

例如:

复制代码
import java.util.concurrent.Callable;

public class java_3_24
{
    public static void main(String[] args) {
    Child c = new Child();
    c.eat();
    }

}
abstract class Person{
    public abstract void eat();
}
class Child extends Person{
    public void eat(){
        System.out.println("中国人");
    }
}

注意:在抽象类中只需声明方法即可;再在子类中把方法进行补充;

小心:abstract关键字不能和final同时使用;

2.接口:

所谓的接口,可以简单理解为规则;

基本语法: interface 接口名称{ 规则属性, 规则的行为};

接口其实是抽象的;

规则的属性必须是固定值,而且不能修改;

属性和行为的访问权限必须为公共的;

属性应该是静态的;

行为应该是抽象的;

接口和类是两个层面的东西;

接口可以继承其他接口;

类的对象需要遵循接口,在Java中,这个遵循,称之为实现(implements),类需要实现接口,而且可以实现多个接口;

例如:

复制代码
import java.util.concurrent.Callable;

public class java_3_24
{
    public static void main(String[] args) {
    Computer c = new Computer();
    Light light = new Light();
    c.usb1 = light;
    Light light1 = new Light();
    c.usb2 = light1;
    c.powerSupply();
    }

}
interface USBInterface{

}
interface USBSupply extends USBInterface{
    public void powerSupply();
}
interface USBReceive extends USBInterface{
    public void powerReceive();
}
class Computer implements USBSupply{
    public USBReceive usb1;
    public USBReceive usb2;
    public void powerSupply(){
        System.out.println("电脑提供能源");
        usb1.powerReceive();
        usb2.powerReceive();
    }
}
class Light implements USBReceive{
    public void powerReceive(){
        System.out.println("电灯接收能源");
    }
}

首先定义了USB接口的规则,然后分别让supply和receive分别继承该规则,然后让计算机和台灯分别满足对应规则,计算机中定义两个usb接口,定义能源提供的方法;light中定义能源接收的方法;

3.枚举:

枚举是一个特殊的类,其中包含了一组特定的对象,这些对象不会发生改变,一遍都使用大写的标识符。

枚举使用enum关键字使用;

枚举类会将对象放置在最前面,那么和后面的语法需要使用分号隔开;

枚举类不能创建对象,它的对象是在内部自行创建;

例如:

复制代码
import java.util.concurrent.Callable;

public class java_3_24
{
    public static void main(String[] args) {
        System.out.println(City.BEIJING.name);
        System.out.println(City.SHANGHAI.code);
    }

}
enum City{
    BEIJING("北京", 1001), SHANGHAI("上海", 1002);
    City( String name, int code){
        this.code = code;
        this.name = name;
    }
    public String name;
    public int code;
}

创建了两个城市,在构造时传参,并赋值给城市的属性,这样就达到了创建类的一个效果;

4.匿名类:

复制代码
import java.util.concurrent.Callable;

public class java_3_24
{
    public static void main(String[] args) {
    Me me = new Me();
    me.sayHello(new Zhangsan());
    }

}
abstract class Person{
    public abstract String name();
}
class Me{
    public void sayHello(Person person){
        System.out.println("Hello " + person.name());
    }
}
class Zhangsan extends Person{
    public String name(){
        return "zhangsan";
    }
}

创建一个me对象,然后调用sayhello方法,传入一个Zhangsan类的对象,他是改写的抽象类Person的所以将对象传进去,打印hello+name;

也可以这样写:

复制代码
import java.util.concurrent.Callable;

public class java_3_24
{
    public static void main(String[] args) {
    Me me = new Me();
    me.sayHello(new Person() {
        @Override
        public String name() {
            return "wangwu";
        }
    });
    }

}
abstract class Person{
    public abstract String name();
}
class Me{
    public void sayHello(Person person){
        System.out.println("Hello " + person.name());
    }
}

直接传入抽象的类并在小括号内进行函数方法的初始化;

再例:

复制代码
import java.util.concurrent.Callable;

public class java_3_24
{
    public static void main(String[] args) {
        Bird b = new Bird();
        b.fly();
    }

}
interface Fly{
    public void fly();
}
class Bird implements Fly{
    public void fly(){
        System.out.println("使用翅膀飞翔");
    }
}

转换为对应的匿名类模式:

复制代码
import java.util.concurrent.Callable;

public class java_3_24
{
    public static void main(String[] args) {
        new Fly(){
            @Override
            public void fly() {
                System.out.println("使用飞行器飞翔");
            }
        }.fly();
    }

}
interface Fly{
    public void fly();
}

5.建立数据模型:

Bean类的设计规范:Bean规范:

(1)类要求必须含有无参,公共的构造方法;

(2)属性必须私有化,然后提供公共的set,get方法;

一个简单的登陆系统:

复制代码
public class java_3_24
{
    public static void main(String[] args) {
        User user = new User();
        user.account = "admin";
        user.password = "admin";
        System.out.println(login(user));

    }
    public static boolean login(User user){
        if (user.account.equals("admin") && user.password.equals("admin")){
            return true;
        }else {
            return false;
        }
    }
}
class User{
    public String account;
    public String password;
}

优化后:

复制代码
public class java_3_24
{
    public static void main(String[] args) {
        User user = new User();
        user.setAccount("admin");
        user.setPassword("admin");
        System.out.println(login(user));

    }
    public static boolean login(User user){
        if (user.getAccount().equals("admin") && user.getPassword().equals("admin")){
            return true;
        }else {
            return false;
        }
    }
}
class User{
    private String account;
    private String password;
    public void setAccount(String account){
        this.account = account;
    }
    public void setPassword(String password){
        this.password = password;
    }
    public String getAccount(){
        return account;
    }
    public String getPassword(){
        return password;
    }
}
相关推荐
sxlishaobin13 分钟前
Maven Setting详解
java·学习·maven
知守观18 分钟前
一个方法两个触发口:反编译 XXL-Job 后,我看清了 inner/job 子包的裸奔现状
java·spring boot·微服务
用户31268748772019 分钟前
CompletableFuture 链式编排:异步编程的优雅解法
java
瑞雪兆丰年兮35 分钟前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
神仙别闹1 小时前
基于 Java GUI 贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏
java·毕业设计·gui·贪心策略·极大极小博弈树
Flynn Liang2 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
SomeOtherTime2 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔2 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆3 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
SimonKing3 小时前
Workbuddy太占C盘空间了,写个迁移工具迁走10G的数据
java·后端·程序员