欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringSecurity實(shí)現(xiàn)前后端分離登錄token認(rèn)證詳解

 更新時(shí)間:2023年06月13日 09:10:36   作者:山河亦問(wèn)安  
目前市面上比較流行的權(quán)限框架主要實(shí)Shiro和Spring Security,這兩個(gè)框架各自側(cè)重點(diǎn)不同,各有各的優(yōu)劣,本文將給大家詳細(xì)介紹SpringSecurity如何實(shí)現(xiàn)前后端分離登錄token認(rèn)證

1. SpringSecurity概述

1.1 權(quán)限框架

目前市面上比較流行的權(quán)限框架主要實(shí)Shiro和Spring Security,這兩個(gè)框架各自側(cè)重點(diǎn)不同,各有各的優(yōu)劣。

1.1.1 Apache Shiro

Apache Shiro(讀作"sheeroh”,即日語(yǔ)"城")是一個(gè)開(kāi)源安全框架,提供身份驗(yàn)證、授權(quán)、密碼學(xué)和會(huì)話管理。Shiro框架直觀、易用,同時(shí)也能提供健壯的安全性。

特點(diǎn):

Shiro的特點(diǎn):

1. 易于理解的Java Security APl;
2. 簡(jiǎn)單的身份認(rèn)證(登錄),支持多種數(shù)據(jù)源(LDAP,JDBC,Kerberos,ActiveDirectory等);·
3. 對(duì)角色的簡(jiǎn)單的簽權(quán)(訪問(wèn)控制),支持細(xì)粒度的簽權(quán);
4. 支持一級(jí)緩存,以提升應(yīng)用程序的性能;
5. 內(nèi)置的基于POJO企業(yè)會(huì)話管理,適用于Web 以及非 Web的環(huán)境;
6.異構(gòu)客戶端會(huì)話訪問(wèn);
7.非常簡(jiǎn)單的加密API;
8.不跟任何的框架或者容器捆綁,可以獨(dú)立運(yùn)行。

1.1.2 SpringSecurity

Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供描述性安全訪問(wèn)控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC(依賴注入,也稱控制反轉(zhuǎn))和AOP(面向切面編程)功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問(wèn)控制功能,減少了為企業(yè)系統(tǒng)安全控制編寫(xiě)大量重復(fù)代碼的工作。

Spring Security是Spring家族中的一個(gè)安全管理框架。相比與另外一個(gè)安全框架Shiro,它提供了更豐富的功能,社區(qū)資源也比shiro豐富。一般Web應(yīng)用的需要進(jìn)行認(rèn)證和授權(quán)。而認(rèn)證和授權(quán)也是SpringSecurity作為安全框架的核心功能。

SpringSecurity的特點(diǎn):

1. 與Spring Boot集成非常簡(jiǎn)單。
2. 功能強(qiáng)大,高度可定制化。
3. 支持OAuth2.0。
4. 強(qiáng)大的加密ARI。
5. 防止跨站請(qǐng)求偽造攻擊(CSRF)。
6. 提供Spring Cloud分布式組件。

1.1.3 權(quán)限框架的選擇

Spring Security 是 Spring 家族中的一個(gè)安全管理框架,實(shí)際上,在 Spring Boot 出現(xiàn)之前,Spring Security 就已經(jīng)發(fā)展了多年了,但是使用的并不多,安全管理這個(gè)領(lǐng)域,一直是 Shiro 的天下。
相對(duì)于 Shiro,在 SSM 中整合 Spring Security 都是比較麻煩的操作,所以,SpringSecurity 雖然功能比 Shiro 強(qiáng)大,但是使用反而沒(méi)有 Shiro 多(Shiro 雖然功能沒(méi)有Spring Security 多,但是對(duì)于大部分項(xiàng)目而言,Shiro 也夠用了)。自從有了 Spring Boot 之后,Spring Boot 對(duì)于 Spring Security 提供了自動(dòng)化配置方案,可以使用更少的配置來(lái)使用 Spring Security。

1.2 授權(quán)和認(rèn)證

一般來(lái)說(shuō),Web應(yīng)用的安全性包括用戶認(rèn)證(Authentication)和用戶授權(quán)(Authorization)兩個(gè)部分,這兩點(diǎn)也是SpringSecurity重要核心功能。

1)用戶認(rèn)證:驗(yàn)證某個(gè)用戶是否為系統(tǒng)中的合法主體,也就是說(shuō)用戶能否訪問(wèn)該系統(tǒng)。用戶認(rèn)證一般要求用戶提供用戶名和密碼。系統(tǒng)通過(guò)校驗(yàn)用戶名和密碼來(lái)完成認(rèn)證過(guò)程。

(2)用戶授權(quán):是驗(yàn)證某個(gè)用戶是否有權(quán)限執(zhí)行某個(gè)操作。經(jīng)過(guò)認(rèn)證后判斷當(dāng)前用戶是否有權(quán)限進(jìn)行某個(gè)操作。

下面進(jìn)行介紹一下RBAC:

RBAC (Role Based Access Control)基于角色的訪問(wèn)控制,通過(guò)抽象出“用戶、角色、權(quán)限”"三個(gè)概念,實(shí)現(xiàn)用戶分配角色,角色分配權(quán)限的權(quán)限管理方式,也是目前企業(yè)中權(quán)限管理主要實(shí)現(xiàn)方案。

案例如下圖所示:

1.3 SpringSecurity的功能

Spring Security對(duì)Web安全性的支持大量地依賴于Servlet過(guò)濾器。這些過(guò)濾器攔截進(jìn)入請(qǐng)求,并且在應(yīng)用程序處理該請(qǐng)求之前進(jìn)行某些安全處理。 Spring Security提供有若干個(gè)過(guò)濾器,它們能夠攔截Servlet請(qǐng)求,并將這些請(qǐng)求轉(zhuǎn)給認(rèn)證和訪問(wèn)決策管理器處理,從而增強(qiáng)安全性。

如今的Spring Security已經(jīng)成為Spring Framework下最成熟的安全系統(tǒng),它為我們提供了強(qiáng)大而靈活的企業(yè)級(jí)安全服務(wù),如:

Ø 認(rèn)證授權(quán)機(jī)制

Ø Web資源訪問(wèn)控制

Ø 業(yè)務(wù)方法調(diào)用訪問(wèn)控制

Ø 領(lǐng)域?qū)ο笤L問(wèn)控制Access Control List(ACL)

Ø 單點(diǎn)登錄(Central Authentication Service)

Ø 信道安全(Channel Security)管理等功能

2.SpringSecurity 實(shí)戰(zhàn)

2.1 引入SpringSecurity

導(dǎo)入依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

引入依賴后我們?cè)趪L試去訪問(wèn)之前的接口就會(huì)自動(dòng)跳轉(zhuǎn)到一個(gè)SpringSecurity的默認(rèn)登陸頁(yè)面,默認(rèn)用戶名是user,密碼會(huì)輸出在控制臺(tái)。必須登陸之后才能對(duì)接口進(jìn)行訪問(wèn)。

2.2 認(rèn)證

2.2.1 登錄校驗(yàn)流程

登錄校驗(yàn)流程如下圖所示:

2.2.2 SpringSecurity完整流程

SpringSecurity的原理其實(shí)就是一個(gè)過(guò)濾器鏈,內(nèi)部包含了提供各種功能的過(guò)濾器。這里我們可以看看入門案例中的過(guò)濾器。

UsernamePasswordAuthenticationFilter:負(fù)責(zé)處理我們?cè)诘顷戫?yè)面填寫(xiě)了用戶名密碼后的登陸請(qǐng)求。入門案例的認(rèn)證工作主要有它負(fù)責(zé)。

ExceptionTranslationFilter:處理過(guò)濾器鏈中拋出的任何AccessDeniedException和AuthenticationException。

FilterSecurityInterceptor:負(fù)責(zé)權(quán)限校驗(yàn)的過(guò)濾器。

我們可以通過(guò)Debug查看當(dāng)前系統(tǒng)中SpringSecurity過(guò)濾器鏈中有哪些過(guò)濾器及它們的順序。如下圖所示:

2.2.3 認(rèn)證流程詳解

Authentication接口::它的實(shí)現(xiàn)類,表示當(dāng)前訪問(wèn)系統(tǒng)的用戶,封裝了用戶相關(guān)信息。

AuthenticationManager接口:定義了認(rèn)證Authentication的方法。

UserDetailsService接口:加載用戶特定數(shù)據(jù)的核心接口。里面定義了一個(gè)根據(jù)用戶名查詢用戶信息的方法。

UserDetails接口:提供核心用戶信息。通過(guò)UserDetailsService根據(jù)用戶名獲取處理的用戶信息要封裝成UserDetails對(duì)象返回。然后將這些信息封裝到Authentication對(duì)象中。

2.3 思路分析

在前后端分離中我們一般采用token驗(yàn)證,所以在這里我們要自定義登錄接口,通過(guò)自定義接口調(diào)用調(diào)用ProviderManager的方法進(jìn)行認(rèn)證 ,如果認(rèn)證通過(guò)生成jwt,然后將jwt返回給前端,同時(shí)將用戶信息包括用戶權(quán)限信息等存入到redis數(shù)據(jù)庫(kù)中,redis數(shù)據(jù)庫(kù)作為緩存讀取速度遠(yuǎn)遠(yuǎn)大于從數(shù)據(jù)庫(kù)中進(jìn)行讀取用戶信息。我們還要自定義UserDetailsService,在這個(gè)實(shí)現(xiàn)類中去查詢數(shù)據(jù)庫(kù)。除此之外我們還需要定義JWT認(rèn)證過(guò)濾器,從前端請(qǐng)求頭中獲取token,解析token獲取其中的userid,然后根據(jù)userid從redis中獲取用戶信息存入SecurityContextHolder。具體流程如下圖:

2.4 代碼實(shí)戰(zhàn)

2.4.1  自定義UserDetailsService類

首先定義一個(gè)UserDetails類代碼如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginUser implements UserDetails, Serializable {
    private User user;
    //返回權(quán)限信息
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }
    //返回用戶密碼
    @Override
    public String getPassword() {
        return user.getPassword();
    }
       //返回用戶賬號(hào)
    @Override
    public String getUsername() {
        return user.getLoginname();
    }
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
    @Override
    public boolean isEnabled() {
        return true;
    }
}

自定義實(shí)現(xiàn)UserDetailsService接口,重寫(xiě)其中的方法。代碼如下:

@Service
public class UserDetailServiceImpl implements UserDetailsService {
    @Autowired
    TbUserMapper tbUserMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //根據(jù)用戶名從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)信息
        QueryWrapper<TbUser> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("username",username);
        TbUser tbUser = tbUserMapper.selectOne(queryWrapper);
        //查詢不到該用戶信息拋異常
        if(tbUser==null){
            throw new RuntimeException("用戶名或者密碼錯(cuò)誤");
        }
       //封裝成UserDetails返回
        return new MyUser(tbUser);
    }
}

2.4.2 密碼加密存儲(chǔ)

實(shí)際項(xiàng)目中我們不會(huì)把密碼明文存儲(chǔ)在數(shù)據(jù)庫(kù)中。 
?1. 默認(rèn)使用的PasswordEncoder要求數(shù)據(jù)庫(kù)中的密碼格式為:{id}password 。它會(huì)根據(jù)id去判斷密碼的加密方式。但是我們一般不會(huì)采用這種方式。所以就需要替換PasswordEncoder。?

2.我們一般使用SpringSecurity為我們提供的BCryptPasswordEncoder。

3.我們只需要使用把BCryptPasswordEncoder對(duì)象注入Spring容器中,SpringSecurity就會(huì)使用該P(yáng)asswordEncoder來(lái)進(jìn)行密碼校驗(yàn)。

4.?我們可以定義一個(gè)SpringSecurity的配置類,SpringSecurity要求這個(gè)配置類要繼承WebSecurityConfigurerAdapter。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

2.4.3 登錄接口

我們需要自定義登陸接口,然后讓SpringSecurity對(duì)這個(gè)接口放行,讓用戶訪問(wèn)這個(gè)接口的時(shí)候不用登錄也能訪問(wèn)。 
? 在接口中我們通過(guò)AuthenticationManager的authenticate方法來(lái)進(jìn)行用戶認(rèn)證,所以需要在SecurityConfig中配置把AuthenticationManager注入容器。 
? 認(rèn)證成功的話要生成一個(gè)jwt,放入響應(yīng)中返回。并且為了讓用戶下回請(qǐng)求時(shí)能通過(guò)jwt識(shí)別出具體的是哪個(gè)用戶,我們需要把用戶信息存入redis有效時(shí)間為30分鐘,可以把用戶id作為key。登錄接口代碼如下:

Configuration代碼如下:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder password(){
        return new BCryptPasswordEncoder();
    }
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()//關(guān)閉csrf
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //不通過(guò)session獲取SecurityContext
                .and()
                .authorizeRequests()
                .antMatchers("/user/login").anonymous() //對(duì)于登錄接口允許匿名訪問(wèn)
                .anyRequest().authenticated(); //除上面外的所有請(qǐng)求全部需要鑒權(quán)認(rèn)證
UsernamePasswordAuthenticationFilter.class);
    }
}

登錄接口代碼如下:

 
    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    AuthenticationManager authenticationManager;
   @PostMapping("/user/login")
    public Result login(@RequestBody TbUser tbUser){
        //通過(guò)AuthenticationManager的authenticate方法來(lái)進(jìn)行用戶認(rèn)證
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken=new UsernamePasswordAuthenticationToken(tbUser.getUsername(),tbUser.getPassword());
        Authentication authenticate = authenticationManager.authenticate(usernamePasswordAuthenticationToken);
        if(authenticate==null){
            return Result.error("401","登錄校驗(yàn)失敗");
        }
        else {
            //獲取用戶信息
            MyUser myUser = (MyUser) authenticate.getPrincipal();
            //獲取用戶id
            Long id = myUser.getTbUser().getId();
            //根據(jù)用戶id生成token
            String token = JwtUtil.generateToken(id);
            //將token放在數(shù)據(jù)庫(kù)中
            redisTemplate.opsForValue().set(String.valueOf(id),myUser,30, TimeUnit.MINUTES);
            return Result.success(token);
        }
    }

2.4.4 token認(rèn)證過(guò)濾器

需要自定義一個(gè)過(guò)濾器,這個(gè)過(guò)濾器會(huì)去獲取請(qǐng)求頭中的token,對(duì)token進(jìn)行解析取出其中的userid。使用userid去redis中獲取對(duì)應(yīng)的LoginUser對(duì)象。然后封裝Authentication對(duì)象存入SecurityContextHolder。代碼如下:

JwtAuthenticationTokenFilter自定義認(rèn)證過(guò)濾器代碼如下:
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
    @Autowired
    RedisTemplate redisTemplate;
    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        //獲取請(qǐng)求頭中的token
        String token = httpServletRequest.getHeader("token");
        //如果token為空直接放行,由于用戶信息沒(méi)有存放在SecurityContextHolder.getContext()中所以后面的過(guò)濾器依舊認(rèn)證失敗符合要求
        if(!StringUtils.hasText(token)){
            filterChain.doFilter(httpServletRequest,httpServletResponse);
            return;
        }
        Long userId;
        try {
            //通過(guò)jwt工具類解析token獲得userId,如果token過(guò)期或非法就會(huì)拋異常
            DecodedJWT decodedJWT = JwtUtil.decodeToken(token);
            userId = decodedJWT.getClaim("userId").asLong();
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("token非法");
        }
        //根據(jù)userId從redis中獲取用戶信息,如果沒(méi)有該用戶就代表該用戶沒(méi)有登錄過(guò)
        MyUser myUser = (MyUser) redisTemplate.opsForValue().get(String.valueOf(userId));
        if(Objects.isNull(myUser)){
            throw new RuntimeException("用戶未登錄");
        }
        //將用戶信息存放在SecurityContextHolder.getContext(),后面的過(guò)濾器就可以獲得用戶信息了。
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken=new UsernamePasswordAuthenticationToken(myUser,null,null);
        SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
        filterChain.doFilter(httpServletRequest,httpServletResponse);
    }
}

在Configuration類中配置自定義過(guò)濾器,代碼如下:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Autowired
    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
 //自定義過(guò)濾器放在UsernamePasswordAuthenticationFilter過(guò)濾器之前
            http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
    }
}

2.4.5 接口測(cè)試

在訪問(wèn)/user/login接口之前,其余的接口都不能訪問(wèn)到,然后先登錄訪問(wèn)/user/login接口,測(cè)試結(jié)果如下圖:

然后攜帶請(qǐng)求頭token訪問(wèn)其它方法就可以正常的進(jìn)行訪問(wèn)了,由此可見(jiàn)我們的代碼測(cè)試驗(yàn)證成功。

至此該篇文章SpringSecurity認(rèn)證內(nèi)容結(jié)束。

以上就是SpringSecurity實(shí)現(xiàn)前后端分離登錄token認(rèn)證詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringSecurity實(shí)現(xiàn)登錄token認(rèn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于Java實(shí)現(xiàn)考試管理系統(tǒng)

    基于Java實(shí)現(xiàn)考試管理系統(tǒng)

    這篇文章主要介紹了基于Java實(shí)現(xiàn)的考試管理系統(tǒng),項(xiàng)目運(yùn)用到的技術(shù)有Springboot、Maven、Jpa、Vue等等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • springboot通過(guò)SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期(示例詳解)

    springboot通過(guò)SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期(示例詳解)

    這篇文章主要介紹了springboot通過(guò)SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法

    java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法

    本篇文章主要介紹了java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 簡(jiǎn)單易用的Spring?Boot郵件發(fā)送demo

    簡(jiǎn)單易用的Spring?Boot郵件發(fā)送demo

    本文將介紹如何使用Spring?Boot發(fā)送郵件,我們將演示如何配置SMTP郵件服務(wù)器,創(chuàng)建一個(gè)郵件模板,以及如何使用JavaMailSender發(fā)送郵件,我們還將介紹如何測(cè)試我們的郵件發(fā)送代碼
    2023-12-12
  • JavaTCP上傳圖片代碼實(shí)例

    JavaTCP上傳圖片代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于JavaTCP上傳圖片代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 如何解決Maven無(wú)法拉取SNAPSHOT依賴問(wèn)題

    如何解決Maven無(wú)法拉取SNAPSHOT依賴問(wèn)題

    在使用Maven管理項(xiàng)目時(shí),可能會(huì)遇到無(wú)法拉取SNAPSHOT版本依賴的問(wèn)題,這通常是因?yàn)镸aven默認(rèn)不支持直接拉取SNAPSHOT版本,遇到這樣的問(wèn)題,可以通過(guò)在項(xiàng)目的pom.xml文件中添加<repositories>標(biāo)簽,并配置啟用SNAPSHOT的倉(cāng)庫(kù)地址來(lái)解決
    2024-10-10
  • IDEA使用maven創(chuàng)建hibernate項(xiàng)目的實(shí)現(xiàn)步驟(圖文)

    IDEA使用maven創(chuàng)建hibernate項(xiàng)目的實(shí)現(xiàn)步驟(圖文)

    本文主要介紹了IDEA使用maven創(chuàng)建hibernate項(xiàng)目的實(shí)現(xiàn)步驟,包括創(chuàng)建Maven項(xiàng)目,配置Hibernate,以及創(chuàng)建實(shí)體類映射到數(shù)據(jù)庫(kù)等步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn)

    Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • java使用正則表達(dá)為數(shù)字添加千位符的簡(jiǎn)單方法

    java使用正則表達(dá)為數(shù)字添加千位符的簡(jiǎn)單方法

    這篇文章主要介紹了java使用正則表達(dá)為數(shù)字添加千位符的簡(jiǎn)單方法,需要的朋友可以參考下
    2014-04-04
  • Java實(shí)例化類詳解

    Java實(shí)例化類詳解

    學(xué)習(xí)JAVA這門面向?qū)ο蟮恼Z(yǔ)言,實(shí)質(zhì)就是不斷地創(chuàng)建類,并把類實(shí)例化為對(duì)象并調(diào)用方法。對(duì)于初學(xué)JAVA的人總搞清楚對(duì)象是如何實(shí)例化的,假如類之間存在繼承關(guān)系,那就更糊涂了。下面我們通過(guò)兩個(gè)例題來(lái)說(shuō)明對(duì)象的實(shí)例化過(guò)程。
    2016-03-03

最新評(píng)論