四种权限修饰符

java有四种权限修饰符:public > protected > (default) > private

  public protected default private
同一个类 yes yes yes yes
同一个包(同级) yes yes yes NO
不同包的子类(继承) yes yes NO NO
不同包,非子类(路人) yes NO NO NO

Notice:(default) 并不是 default 关键字,而是成员变量 / 方法前什么也不写,例如:int num = 6;

内部类

一个物体内部可以包含另一个物体:那么一个类的内部也能包含另一个类,例如 电脑和CPU、汽车与发动机

内部类分为:成员内部类 和 局部内部类

1)成员内部

注意事项:

  1. 内用外,随便访问,外用内,需要通过内部类对象访问
  2. 使用成员内部类,有两种方式:
    • 直接:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
    • 间接:在外部类的方法中使用内部类,然后在 main 方法中调用外部类的方法
      public class ExteriorClass {
      String str = "exterior"; public void exteriorMethod(){
      System.out.println("exterior method execute");
      // 外部类不能访问内部类成员变量
      // System.out.println(inside); // 错误写法
      System.out.println(new InsideClass().num);
      } public class InsideClass{
      int num = 6;
      public void insideMethod(){
      System.out.println("inside method execute");
      // 内部类可以访问外部类成员变量
      System.out.println(str);
      }
      } public static void main(String[] args) {
      ExteriorClass exterior = new ExteriorClass();
      // 通过外部类方法 间接使用 内部类对象
      exterior.exteriorMethod(); // exterior method execute 6 // 不能直接创建内部类
      // InsideClass inside = new InsideClass(); // 错误写法
      ExteriorClass.InsideClass inside = new ExteriorClass().new InsideClass();
      inside.insideMethod(); // inside method execute exterior
      }
      }

2)局部内部类(包含匿名内部类)

定义在方法内部的,就是局部内部类;局部,就是只有在当前所属的方法中才能使用

public class Outer{
// 外部类方法
public void outerMethod(){
System.out.println("outer method execute"); // outer method execute // 局部内部类
class Inner{
int num = 6;
// 内部类方法
public void innerMethod(){
System.out.println(num);
}
}
// 在外部方法中 使用内部类
Inner inner = new Inner();
inner.innerMethod(); //
} public static void main(String[] args) {
Outer outer = new Outer();
outer.outerMethod();
}
}

注意事项:如果局部内部类对象需要用到方法的局部变量,那么这个局部变量必须是 final 修饰的;从 java 8+ 开始,关键字 final 可省略

原因:声明周期

  1. new出来的对象保存在 堆内存 中
  2. 局部变量在 栈内存 中
  3. 方法运行结束之后,出栈,局部变量会回收;但 new 出来的对象会持续在堆内存中,直到被回收,那么这时如果对象访问局部变量,就会出现问题,所以这里的局部变量是常量,会copy一份在堆内存中
    public class OuterClass{
    public void outerMethod(){
    final String str = "johny"; // 局部变量
    // str = "test"; // 错误写法 class Inner{
    public void innerMethod(){
    System.out.println(str); // johny
    }
    } Inner inner = new Inner();
    inner.innerMethod();
    } public static void main(String[] args){
    OuterClass outer = new OuterClass();
    outer.outerMethod();
    }
    }

3)匿名内部类

如果接口的实现类(或者父类的子类)只需要使用唯一一次

那么这种情况下就可以省略该类的定义,使用匿名内部类

定义格式:

接口名称  对象名  =  new  接口名称(){
@Override
// 覆盖重写所有抽象方法
};
// new 代表创建对象的动作;接口名称就是匿名内部类需要实现的接口
// { ... } 才是匿名内部类的内容

demo:

// 接口
class interface MyInterface{
void method();
} // 外部类
public class DemoMain{
public static void main(String[] args){
// 按照常规的实现类来访问成员方法
// MyInterface obj = new MyInterfaceImpl();
// obj.method(); // 匿名内部类的写法
MyInterface obj = new MyInterface(){
@Override
public void method(){
System.out.println("anonymity class method execute");
}
};
// 使用匿名类对象访问成员方法
obj.method(); // anonymity class method execute // 匿名内部类 + 匿名对象的写法
new MyInterface(){
@Override
public void method(){
System.out.println("anonymity object call method execute");
}
}.method(); // anonymity object call method execute
}
}

注意事项:

  1. 匿名内部类,在创建对象时,只能使用一次,如果要多次创建对象,需要单独定义实现类
  2. 匿名对象,在调用方法时,只能调用一次

类作为成员变量 / 接口作为成员变量

用武器类、技能接口作为英雄对象的成员变量的例子:

// 英雄类
public class Hero {
private String name;
private Weapon weapon; // 类当做成员变量
private Skill skill; // 接口当做成员变量 public Hero(){
} public Hero(String name, Weapon weapon, Skill skill){
this.name = name;
this.weapon = weapon;
this.skill = skill;
} public void attack(){
if (this.skill != null){
skill.use();
}
} public void setName(String name) {
this.name = name;
} public void setWeapon(Weapon weapon) {
this.weapon = weapon;
} public void setSkill(Skill skill) {
this.skill = skill;
} public String getName() {
return name;
} public Weapon getWeapon() {
return weapon;
} public Skill getSkill() {
return skill;
}
}
// 武器类
public class Weapon {
private String code; public Weapon(){
} public Weapon(String code){
this.code = code;
} public void setCode(String code) {
this.code = code;
} public String getCode() {
return code;
}
}
// 技能接口
public interface Skill {
void use();
}
// 技能实现类
public class SkillImpl implements Skill {
@Override
public void use() {
System.out.println("施放技能攻击");
}
}
// 主方法
public class DemoMain {
public static void main(String[] args) {
Hero hero = new Hero();
hero.setName("盖伦"); Weapon weapon = new Weapon();
weapon.setCode("AK-47");
hero.setWeapon(weapon); System.out.println("英雄的名字:" + hero.getName()); // 英雄的名字:盖伦
System.out.println("英雄的武器:" + hero.getWeapon().getCode()); // 英雄的武器:AK-47 // 设置英雄技能
hero.setSkill(new SkillImpl()); // 使用单独定义的实现类
hero.attack(); // 施放技能攻击 // 使用匿名内部类
Skill skill = new Skill() {
@Override
public void use() {
System.out.println("内部类 施放技能攻击");
}
};
hero.setSkill(skill);
hero.attack(); // 内部类 施放技能攻击 // 使用匿名内部类 + 匿名对象
hero.setSkill(new Skill() {
@Override
public void use() {
System.out.println("内部类 匿名对象 施放技能攻击");
}
});
hero.attack(); // 内部类 匿名对象 施放技能攻击
}
}

接口作为方法的参数与返回值

import java.util.ArrayList;
import java.util.List; public class DemoInterface {
public static void main(String[] args) {
// List 是 实现类 ArrayList 的接口
List<String> list = new ArrayList<>();
List<String> result = addElement(list); for (int i = 0; i < result.size(); i++){
System.out.println(result.get(i)); // johny anson
}
} public static List<String> addElement(List<String> list){
list.add("johny");
list.add("anson");
return list;
}
}

后续在学习实践中再进行补充和完善。

ending ~

Java 面向对象知识扩展的更多相关文章

  1. Java——面向对象知识总结

    面向对象的三条主线: 一.类及类的成分 1.类与类的关系: java程序是关注于类的设计. 类从代码的角度:并列关系! 从执行.设计的角度:关联关系.继承关系.聚合关系 class A{ } clas ...

  2. java面向对象知识整理(一)

    1.面向对象思想 概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对像,强调具备功能的对象. 特点:(1)符合人们思考习惯的一种思想. (2)将复杂的事情简单化 ...

  3. 如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  4. Java基础知识➣面向对象(八)

    概述 Java和C#都是面向对象语言,面向对象编程是目前高级语言习惯的编程模式,与C++编写过程编程而言,面向对象使用起来高效.灵活:面向对象的三个特征:封装.继承和多态. Java面向对象 1.类封 ...

  5. Java基础知识_毕向东_Java基础视频教程笔记(5-10 面向对象)

    06天-05-面向对象(帮助文档的制作javadoc):java文档生成命令:javadoc -d filepatn demo.java   -author -version(可选)一个类中默认会有一 ...

  6. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  7. [JIT_APP]Java基础知识总结

    一.Java语言的基础知识 1. 开发Java语言的公司 美国Sun(Sum Microsystems)公司开发.   2.Java的3个版本 J2SE(Java2 Standard Edition) ...

  8. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  9. Java面向对象 IO (一)

     Java面向对象  IO  (一) 知识概要:                (1)IO概述 (2)IO流的常用基类 (3)IO程序的书写 (4)字符流  写入  读取  文本文件的两种读取方式 ...

随机推荐

  1. IOC注解方式1.0

    在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0" encoding=& ...

  2. 一、JavaScript基础

    一.区分大小写 ECMAScript中的一切(变量.函数名和操作符)都区分大小写,(js用于行为交互.数据交互.逻辑交互) 二.标识符 指变量.函数.属性的名字,或者函数的参数 命名规则:1.第一个字 ...

  3. 还在用难用的AssetBundle?快来运用Unity新的可寻址资源系统,助力游戏开发

    Unity Addressables可寻址资源系统是一个强大的Unity资源包,它能够帮助解决游戏开发中最重要的一些挑战:高效率和轻松的内容管理. 在管理游戏资源时,往往很难维持好的标准,从而避免让项 ...

  4. 安装Nvidia显卡驱动、CUDA和cuDNN的方法(jsxyhelu整编)

    Nvidia显卡驱动.CUDA和cuDNN一般都是同时安装的,这里整理的是我成功运行的最简单的方法. 一.Nvidia显卡驱动 1.1 在可以进入图形界面的情况下 直接在"软件和更新&quo ...

  5. shell关闭指定进程

    例如要关闭jupyter-notebook这个进程: ps -ef | grep jupyter-notebook | grep -v grep | cut -c 9-15 | xargs kill ...

  6. k8s记录-yum本地仓库部署

    #1.安装插件yum install -y yum-plugin-downloadonly createrepo rsync #2.创建仓库目录mkdir -p /mirrors/centos#3.下 ...

  7. Laya的Tween缓动没有初始化repeat导致的Bug

    当你使用一个Tween给一个图标做旋转动画,循环播放.(repeat是播放次数, repeat=0无限循环,repeat=1播放一次) Laya.Tween.to(this.light,{rotati ...

  8. 【翻译】Flink Table Api & SQL —— Overview

    本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/ Flink Table Api & ...

  9. [LeetCode] 304. Range Sum Query 2D - Immutable 二维区域和检索 - 不可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  10. [LeetCode] 359. Logger Rate Limiter 记录速率限制器

    Design a logger system that receive stream of messages along with its timestamps, each message shoul ...